|
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() |
|
|