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