File size: 5,634 Bytes
bd7ce79
5751319
bd7ce79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d348e0c
 
 
 
 
 
 
bd7ce79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d348e0c
 
 
 
 
 
5751319
 
 
d348e0c
bd7ce79
022aa34
bd7ce79
d348e0c
 
 
bd7ce79
 
 
 
 
d348e0c
bd7ce79
 
 
 
d348e0c
bd7ce79
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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()