| | import gradio as gr |
| | import plotly.express as px |
| |
|
| | class MBTIAnalyzer: |
| | def __init__(self): |
| | self.questions = { |
| | 'EI': [ |
| | "μ¬λλ€κ³Όμ λͺ¨μμ΄ λλ ν λΉμ μ μλμ§κ° μΆ©μ λλμ, μλλ©΄ μλͺ¨λλμ?", |
| | "ν΄μ μκ°μ νΌμ 보λ΄λ κ²μ μ’μνλμ, μλλ©΄ μΉκ΅¬λ€κ³Ό ν¨κ» 보λ΄λ κ²μ λ μ’μνλμ?", |
| | "λͺ¨λ₯΄λ μ¬λλ€κ³Ό μ½κ² μΉν΄μ§λμ, μλλ©΄ μκ°μ΄ 걸리λμ?", |
| | "λ€λ₯Έ μ¬λκ³Ό ν¨κ» μκ°μ 보λ΄λ κ²μ μ¦κΈ°λμ, μλλ©΄ νΌμ μλ μκ°μ΄ λ μ’λμ?", |
| | "μ£Όλ§μλ μ§μμ μ¬λ κ²μ΄ μ’λμ, μλλ©΄ λ°μμ μ¬λλ€κ³Ό μ΄μΈλ¦¬λ κ²μ΄ μ’λμ?" |
| | ], |
| | 'SN': [ |
| | "νμ¬μ μ¬μ€μ μ§μ€νλ νΈμΈκ°μ, μλλ©΄ λ―Έλμ κ°λ₯μ±μ λ κ΄μ¬μ΄ μλμ?", |
| | "μ€μ κ²½νμ ν΅ν΄ λ°°μ°λ κ²μ μ νΈνλμ, μλλ©΄ μ΄λ‘ μ κ°λ
μ λ°°μ°λ κ²μ μ νΈνλμ?", |
| | "μΈλΆ μ¬νμ μ κ²½μ λ§μ΄ μ°μλμ, μλλ©΄ ν° κ·Έλ¦Όμ 보λ κ²μ μ’μνμλμ?", |
| | "μ§κ΄μ μΌλ‘ κ²°μ μ μ λ΄λ¦¬μλμ, μλλ©΄ ꡬ체μ μΈ μ 보λ₯Ό λ°νμΌλ‘ κ²°μ μ λ΄λ¦¬μλμ?", |
| | "λΉμ μ νμ€μ μΈ μ¬λμΈκ°μ, μλλ©΄ μ΄μμ μΈ μ¬λμΈκ°μ?" |
| | ], |
| | 'TF': [ |
| | "μμ¬κ²°μ μ λ
Όλ¦¬μ λΆμμ λ°νμΌλ‘ κ²°μ μ λ΄λ¦¬λμ, μλλ©΄ μ¬λλ€μ κ°μ μ κ³ λ €νμ¬ κ²°μ μ λ΄λ¦¬λμ?", |
| | "κ°λ± μν©μμ λ¬Έμ λ₯Ό λ
Όλ¦¬μ μΌλ‘ ν΄κ²°νλ κ²μ΄ μ€μνλ€κ³ μκ°νλμ, μλλ©΄ μλ‘μ κ°μ μ μ΄ν΄νκ³ ν΄κ²°νλ κ²μ΄ μ€μνλ€κ³ μκ°νλμ?", |
| | "μ¬λλ€κ³Όμ κ΄κ³μμ 곡μ ν¨μ΄ μ€μνκ°μ, μλλ©΄ μ‘°νκ° λ μ€μνκ°μ?", |
| | "λΉνμ λ°μΌλ©΄ κΈ°λΆμ΄ λμμ κ°μ, μλλ©΄ κ°μ μ κΈ°νλ‘ μκ°νμλμ?", |
| | "κ²°μ μ λ΄λ¦΄ λ κ°μ λ³΄λ€ λ
Όλ¦¬κ° λ μ€μνλ€κ³ μκ°νμλμ?" |
| | ], |
| | 'JP': [ |
| | "κ³νμ μΈ μΆμ μ νΈνμλμ, μλλ©΄ μ¦ν₯μ μΌλ‘ μ¬λ κ²μ μ νΈνμλμ?", |
| | "λ§κ° μκ°μ΄ λ€κ°μ¬ λ μΌμ 미리 λλ΄κ³ μ¬μ λ‘κ² μκ°μ 보λ΄λμ, μλλ©΄ λ§νμ λͺ°μμ νμλμ?", |
| | "κ³νμ΄ λ³κ²½λλ©΄ μ€νΈλ μ€λ₯Ό λ°λμ, μλλ©΄ μ μ°νκ² λμ²νμλμ?", |
| | "μκ°νλ μΌμ μ μ² μ ν μ§ν€μλμ, μλλ©΄ κ·Έλκ·Έλ μν©μ λ§κ² νλνμλμ?", |
| | "μΌμ μ΄λ κ³νμ΄ μλ κ²μ΄ λ λ§μμ΄ νΈνκ°μ, μλλ©΄ μμ λ‘μ΄ κ²μ΄ λ μ’λμ?" |
| | ] |
| | } |
| | self.scores = {'E': 0, 'I': 0, 'S': 0, 'N': 0, 'T': 0, 'F': 0, 'J': 0, 'P': 0} |
| |
|
| | def ask_question(self, category, answer): |
| | |
| | scale = {"λ§€μ° κ·Έλ λ€": 2, "κ·Έλ λ€": 1, "보ν΅μ΄λ€": 0, "μλλ€": -1, "λ§€μ° μλλ€": -2} |
| | score = scale[answer] |
| | if score > 0: |
| | self.scores[category[0]] += score |
| | elif score < 0: |
| | self.scores[category[1]] -= score |
| |
|
| | def analyze(self, answers): |
| | idx = 0 |
| | for category, questions in self.questions.items(): |
| | for _ in questions: |
| | self.ask_question(category, answers[idx]) |
| | idx += 1 |
| | return self.get_result() |
| |
|
| | def calculate_percentage(self): |
| | percentages = {} |
| | for category in ['E', 'I', 'S', 'N', 'T', 'F', 'J', 'P']: |
| | opposite = category[0] if category[0] in ['I', 'N', 'F', 'P'] else category[1] |
| | total = self.scores[category] + self.scores[opposite] |
| | if total == 0: |
| | percentages[category] = 50 |
| | else: |
| | percentages[category] = int((self.scores[category] / total) * 100) |
| | return percentages |
| |
|
| | def get_result(self): |
| | percentages = self.calculate_percentage() |
| | result = '' |
| | result += 'E' if percentages['E'] >= 50 else 'I' |
| | result += 'S' if percentages['S'] >= 50 else 'N' |
| | result += 'T' if percentages['T'] >= 50 else 'F' |
| | result += 'J' if percentages['J'] >= 50 else 'P' |
| |
|
| | return result, percentages |
| |
|
| | def plot_result(self, percentages): |
| | labels = list(percentages.keys()) |
| | sizes = list(percentages.values()) |
| |
|
| | fig = px.bar(x=labels, y=sizes, labels={'x': 'Trait', 'y': 'Percentage (%)'}, |
| | title="MBTI Result Distribution") |
| | fig.update_layout(yaxis_range=[0, 100]) |
| | return fig |
| |
|
| | def mbti_interface(*answers): |
| | analyzer = MBTIAnalyzer() |
| | result, percentages = analyzer.analyze(answers) |
| | fig = analyzer.plot_result(percentages) |
| | return result, fig |
| |
|
| | |
| | questions = [] |
| | for key in ['EI', 'SN', 'TF', 'JP']: |
| | for q in MBTIAnalyzer().questions[key]: |
| | questions.append(gr.Radio(["λ§€μ° κ·Έλ λ€", "κ·Έλ λ€", "보ν΅μ΄λ€", "μλλ€", "λ§€μ° μλλ€"], label=q)) |
| |
|
| | iface = gr.Interface( |
| | fn=mbti_interface, |
| | inputs=questions, |
| | outputs=[gr.Textbox(label="MBTI μ ν κ²°κ³Ό"), gr.Plot(label="κ²°κ³Ό μ°¨νΈ")], |
| | title="MBTI λΆμκΈ°", |
| | description="20κ° μ΄μμ μ§λ¬Έμ ν΅ν΄ λΉμ μ MBTI μ νμ λΆμν©λλ€." |
| | ) |
| |
|
| | if __name__ == "__main__": |
| | iface.launch() |
| |
|