MBTI / app.py
CSB261's picture
Update app.py
5751319 verified
raw
history blame
5.63 kB
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):
# 점수λ₯Ό 5λ‹¨κ³„λ‘œ κ³„μ‚°ν•©λ‹ˆλ‹€. 맀우 κ·Έλ ‡λ‹€: 2, κ·Έλ ‡λ‹€: 1, 보톡이닀: 0, μ•„λ‹ˆλ‹€: -1, 맀우 μ•„λ‹ˆλ‹€: -2
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
# Gradio μΈν„°νŽ˜μ΄μŠ€ μ„€μ •
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()