Update app.py
Browse files
app.py
CHANGED
@@ -1,17 +1,20 @@
|
|
1 |
import gradio as gr
|
2 |
import numpy as np
|
3 |
|
4 |
-
# MBTI 질문 데이터
|
5 |
questions = [
|
6 |
"나는 사람들과 시간을 보내는 것을 즐긴다.",
|
7 |
"나는 구체적이고 실용적인 정보를 선호한다.",
|
8 |
"나는 논리적인 결정을 내리는 것을 중요하게 생각한다.",
|
9 |
"나는 체계적이고 계획적인 삶을 좋아한다.",
|
10 |
"나는 새로운 아이디어를 탐구하는 것을 즐긴다.",
|
11 |
-
#
|
|
|
|
|
|
|
12 |
]
|
13 |
|
14 |
-
# 유형별 설명 데이터
|
15 |
mbti_descriptions = {
|
16 |
"INTJ": {
|
17 |
"성격": "독립적이고 전략적인 사고를 가진 성향.",
|
@@ -21,68 +24,54 @@ mbti_descriptions = {
|
|
21 |
"나쁜": ("ISFP", "감정과 논리의 차이가 충돌할 가능성.")
|
22 |
}
|
23 |
},
|
24 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
}
|
26 |
|
27 |
-
#
|
28 |
options = ["매우 아니다", "아니다", "보통이다", "그렇다", "매우 그렇다"]
|
29 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
def calculate_mbti(answers):
|
|
|
|
|
|
|
|
|
|
|
31 |
scores = {"E/I": 0, "S/N": 0, "T/F": 0, "J/P": 0}
|
|
|
32 |
for i, answer in enumerate(answers):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
if i % 4 == 0:
|
34 |
-
scores["E/I"] += (
|
35 |
elif i % 4 == 1:
|
36 |
-
scores["S/N"] += (
|
37 |
elif i % 4 == 2:
|
38 |
-
scores["T/F"] += (
|
39 |
-
|
40 |
-
scores["J/P"] += (
|
41 |
-
result = (
|
42 |
-
("I" if scores["E/I"] < 0 else "E") +
|
43 |
-
("N" if scores["S/N"] < 0 else "S") +
|
44 |
-
("F" if scores["T/F"] < 0 else "T") +
|
45 |
-
("P" if scores["J/P"] < 0 else "J")
|
46 |
-
)
|
47 |
-
percentages = {
|
48 |
-
"E/I": abs(scores["E/I"] / 20 * 100),
|
49 |
-
"S/N": abs(scores["S/N"] / 20 * 100),
|
50 |
-
"T/F": abs(scores["T/F"] / 20 * 100),
|
51 |
-
"J/P": abs(scores["J/P"] / 20 * 100)
|
52 |
-
}
|
53 |
-
return result, percentages
|
54 |
-
|
55 |
-
def analyze_mbti(answers):
|
56 |
-
result, percentages = calculate_mbti(answers)
|
57 |
-
description = mbti_descriptions.get(result, {})
|
58 |
-
성격 = description.get("성격", "데이터가 없습니다.")
|
59 |
-
추천직업 = description.get("추천 직업", [])
|
60 |
-
궁합 = description.get("궁합", {})
|
61 |
-
return {
|
62 |
-
"MBTI 유형": result,
|
63 |
-
"성격": 성격,
|
64 |
-
"추천 직업": 추천직업,
|
65 |
-
"궁합": 궁합,
|
66 |
-
"세부 비율": percentages
|
67 |
-
}
|
68 |
-
|
69 |
-
# Gradio 인터페이스
|
70 |
-
def mbti_interface(*answers):
|
71 |
-
answers = list(answers)
|
72 |
-
result = analyze_mbti(answers)
|
73 |
-
return result
|
74 |
-
|
75 |
-
# 질문과 선택지를 기반으로 Gradio UI 생성
|
76 |
-
inputs = [gr.Radio(options, label=q) for q in questions]
|
77 |
-
outputs = gr.JSON()
|
78 |
|
79 |
-
|
80 |
-
fn=mbti_interface,
|
81 |
-
inputs=inputs,
|
82 |
-
outputs=outputs,
|
83 |
-
title="MBTI 분석기",
|
84 |
-
description="질문에 답변하고 자신의 MBTI 유형을 분석해 보세요!"
|
85 |
-
)
|
86 |
|
87 |
-
if __name__ == "__main__":
|
88 |
-
iface.launch()
|
|
|
1 |
import gradio as gr
|
2 |
import numpy as np
|
3 |
|
4 |
+
# MBTI 질문 데이터 (예시)
|
5 |
questions = [
|
6 |
"나는 사람들과 시간을 보내는 것을 즐긴다.",
|
7 |
"나는 구체적이고 실용적인 정보를 선호한다.",
|
8 |
"나는 논리적인 결정을 내리는 것을 중요하게 생각한다.",
|
9 |
"나는 체계적이고 계획적인 삶을 좋아한다.",
|
10 |
"나는 새로운 아이디어를 탐구하는 것을 즐긴다.",
|
11 |
+
# 아래와 같이 20개 이상 질문을 추가해 주세요.
|
12 |
+
# "나는 어떤 일을 할 때 전체적인 큰 그림을 우선적으로 본다.",
|
13 |
+
# "감정보다는 사실과 데이터를 우선적으로 생각한다.",
|
14 |
+
# ...
|
15 |
]
|
16 |
|
17 |
+
# MBTI 유형별 설명 데이터 (예시)
|
18 |
mbti_descriptions = {
|
19 |
"INTJ": {
|
20 |
"성격": "독립적이고 전략적인 사고를 가진 성향.",
|
|
|
24 |
"나쁜": ("ISFP", "감정과 논리의 차이가 충돌할 가능성.")
|
25 |
}
|
26 |
},
|
27 |
+
"ENTP": {
|
28 |
+
"성격": "토론을 즐기고, 새 아이디어에 호기심이 많은 성향.",
|
29 |
+
"추천 직업": ["기업가", "마케팅 전략가", "콘셉트 디자이너"],
|
30 |
+
"궁합": {
|
31 |
+
"좋은": ("INTJ", "논리와 창의성이 균형을 이룸."),
|
32 |
+
"나쁜": ("ISFJ", "세부 사항과 감정적 배려에서 갈등 가능.")
|
33 |
+
}
|
34 |
+
},
|
35 |
+
# 필요한 다른 유형 데이터도 추가해 주세요.
|
36 |
}
|
37 |
|
38 |
+
# 선택지(문자열) 정의
|
39 |
options = ["매우 아니다", "아니다", "보통이다", "그렇다", "매우 그렇다"]
|
40 |
|
41 |
+
# 문자열 -> 점수(정수)로 매핑하기 위한 딕셔너리
|
42 |
+
# '매우 아니다' = 1, '아니다' = 2, '보통이다' = 3, '그렇다' = 4, '매우 그렇다' = 5
|
43 |
+
answer_mapping = {
|
44 |
+
"매우 아니다": 1,
|
45 |
+
"아니다": 2,
|
46 |
+
"보통이다": 3,
|
47 |
+
"그렇다": 4,
|
48 |
+
"매우 그렇다": 5
|
49 |
+
}
|
50 |
+
|
51 |
def calculate_mbti(answers):
|
52 |
+
"""
|
53 |
+
사용자가 선택한 답변들을 정수값으로 변환한 뒤, E/I, S/N, T/F, J/P 지표별로 점수를 합산한다.
|
54 |
+
질문(i)의 인덱스에 따라 %4 연산을 달리하여 각 지표에 할당.
|
55 |
+
"""
|
56 |
+
# 점수를 누적할 딕셔너리 (E/I, S/N, T/F, J/P)
|
57 |
scores = {"E/I": 0, "S/N": 0, "T/F": 0, "J/P": 0}
|
58 |
+
|
59 |
for i, answer in enumerate(answers):
|
60 |
+
# 문자열로 된 answer를 정수 값으로 매핑
|
61 |
+
answer_val = answer_mapping[answer]
|
62 |
+
|
63 |
+
# i % 4 == 0 -> E/I
|
64 |
+
# i % 4 == 1 -> S/N
|
65 |
+
# i % 4 == 2 -> T/F
|
66 |
+
# i % 4 == 3 -> J/P
|
67 |
if i % 4 == 0:
|
68 |
+
scores["E/I"] += (answer_val - 3)
|
69 |
elif i % 4 == 1:
|
70 |
+
scores["S/N"] += (answer_val - 3)
|
71 |
elif i % 4 == 2:
|
72 |
+
scores["T/F"] += (answer_val - 3)
|
73 |
+
else: # i % 4 == 3
|
74 |
+
scores["J/P"] += (answer_val - 3)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
75 |
|
76 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
77 |
|
|
|
|