Spaces:
Running
Running
Create app.py
Browse files
app.py
CHANGED
@@ -1,2 +1,170 @@
|
|
1 |
-
import
|
2 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import numpy as np
|
3 |
+
|
4 |
+
# MBTI 질문 리스트 (50문항)
|
5 |
+
questions = [
|
6 |
+
# E vs I (13문항)
|
7 |
+
"1. 나는 새로운 사람들과 만나는 것을 즐긴다.",
|
8 |
+
"2. 혼자만의 시간을 더 선호한다.",
|
9 |
+
"3. 대화를 먼저 시작하는 편이다.",
|
10 |
+
"4. 많은 사람들과 어울리면 에너지가 소진된다.",
|
11 |
+
"5. 파티나 모임에서 새로운 사람들과 대화하기를 좋아한다.",
|
12 |
+
"6. 조용한 환경에서 혼자 일하는 것이 편하다.",
|
13 |
+
"7. 그룹 활동이나 팀 프로젝트를 선호한다.",
|
14 |
+
"8. 사회적 모임 후에는 혼자만의 시간이 필요하다.",
|
15 |
+
"9. 많은 사람들 앞에서 발표하는 것이 즐겁다.",
|
16 |
+
"10. 친구들과 함께 있을 때 가장 편안하다.",
|
17 |
+
"11. 새로운 환경에 적응하는 것이 어렵지 않다.",
|
18 |
+
"12. 혼자서 여행하는 것을 좋아한다.",
|
19 |
+
"13. 모임에서 중심이 되는 것이 자연스럽다.",
|
20 |
+
|
21 |
+
# S vs N (13문항)
|
22 |
+
"14. 실제적이고 구체적인 것을 선호한다.",
|
23 |
+
"15. 상상하고 새로운 아이디어를 생각하는 것을 좋아한다.",
|
24 |
+
"16. 세부사항에 주의를 기울인다.",
|
25 |
+
"17. 큰 그림을 보는 것을 선호한다.",
|
26 |
+
"18. 현재에 집중하는 편이다.",
|
27 |
+
"19. 미래의 가능성을 상상하는 것을 좋아한다.",
|
28 |
+
"20. 실용적이고 현실적인 해결책을 찾는다.",
|
29 |
+
"21. 새롭고 혁신적인 방법을 시도하는 것을 좋아한다.",
|
30 |
+
"22. 경험에 기반한 판단을 선호한다.",
|
31 |
+
"23. 직관적인 느낌을 중요하게 여긴다.",
|
32 |
+
"24. 구체적인 사실과 데이터를 중시한다.",
|
33 |
+
"25. 추상적인 개념을 탐구하는 것이 즐겁다.",
|
34 |
+
"26. 전통적이고 검증된 방식을 선호한다.",
|
35 |
+
|
36 |
+
# T vs F (12문항)
|
37 |
+
"27. 결정을 내릴 때 논리적으로 분석한다.",
|
38 |
+
"28. 다른 사람의 감정을 잘 고려한다.",
|
39 |
+
"29. 객관적인 사실을 중요하게 생각한다.",
|
40 |
+
"30. 직감과 감정을 따르는 편이다.",
|
41 |
+
"31. 감정보다 이성을 더 중요하게 여긴다.",
|
42 |
+
"32. 다른 사람들의 감정 상태에 민감하다.",
|
43 |
+
"33. 논리적 일관성을 중요하게 생각한다.",
|
44 |
+
"34. 공감능력이 뛰어난 편이다.",
|
45 |
+
"35. 감정적 결정을 내리는 것을 피한다.",
|
46 |
+
"36. 다른 사람의 입장에서 생각하려 노력한다.",
|
47 |
+
"37. 객관적 분석을 통해 결론을 도출한다.",
|
48 |
+
"38. 사람들 간의 조화를 중요하게 생각한다.",
|
49 |
+
|
50 |
+
# J vs P (12문항)
|
51 |
+
"39. 계획을 세우고 그대로 실행하는 것을 좋아한다.",
|
52 |
+
"40. 융통성 있게 상황에 대처하는 것을 선호한다.",
|
53 |
+
"41. 마감기한을 정확히 지키는 편이다.",
|
54 |
+
"42. 일정을 미리 정하기보다 즉흥적으로 행동한다.",
|
55 |
+
"43. 체계적으로 일을 처리하는 것을 좋아한다.",
|
56 |
+
"44. 상황에 따라 계획을 변경하는 것이 자연스럽다.",
|
57 |
+
"45. 할 일을 미리 계획하고 준비한다.",
|
58 |
+
"46. 새로운 가능성을 위해 열려있는 것이 좋다.",
|
59 |
+
"47. 정해진 규칙과 절차를 잘 따른다.",
|
60 |
+
"48. 급작스러운 변화에도 잘 적응한다.",
|
61 |
+
"49. 일의 완료를 중요하게 생각한다.",
|
62 |
+
"50. 여러 선택지를 오래 열어두는 것을 선호한다."
|
63 |
+
]
|
64 |
+
|
65 |
+
def calculate_mbti(scores):
|
66 |
+
try:
|
67 |
+
# 점수를 float로 변환하고 유효성 검사
|
68 |
+
scores = [float(score) if score is not None else 3.0 for score in scores]
|
69 |
+
if not all(1 <= score <= 5 for score in scores):
|
70 |
+
return "오류: 모든 점수는 1에서 5 사이여야 합니다."
|
71 |
+
|
72 |
+
# 역채점이 필요한 문항 처리
|
73 |
+
reverse_questions = [2, 4, 6, 8, 12, 15, 17, 19, 21, 23, 25, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50]
|
74 |
+
for i in reverse_questions:
|
75 |
+
scores[i-1] = 6 - scores[i-1]
|
76 |
+
|
77 |
+
# 점수 계산
|
78 |
+
E = sum(scores[0:13]) # 13문항
|
79 |
+
S = sum(scores[13:26]) # 13문항
|
80 |
+
T = sum(scores[26:38]) # 12문항
|
81 |
+
J = sum(scores[38:50]) # 12문항
|
82 |
+
|
83 |
+
# 최대 점수 계산
|
84 |
+
max_ei = 13 * 5 # E/I 최대점수
|
85 |
+
max_sn = 13 * 5 # S/N 최대점수
|
86 |
+
max_tf = 12 * 5 # T/F 최대점수
|
87 |
+
max_jp = 12 * 5 # J/P 최대점수
|
88 |
+
|
89 |
+
# MBTI 유형 결정
|
90 |
+
mbti = ""
|
91 |
+
mbti += "E" if E > max_ei/2 else "I"
|
92 |
+
mbti += "S" if S > max_sn/2 else "N"
|
93 |
+
mbti += "T" if T > max_tf/2 else "F"
|
94 |
+
mbti += "J" if J > max_jp/2 else "P"
|
95 |
+
|
96 |
+
# 각 특성의 강도 계산 (백분율)
|
97 |
+
e_score = (E / max_ei) * 100
|
98 |
+
s_score = (S / max_sn) * 100
|
99 |
+
t_score = (T / max_tf) * 100
|
100 |
+
j_score = (J / max_jp) * 100
|
101 |
+
|
102 |
+
result = f"""
|
103 |
+
당신의 MBTI 유형은 {mbti}입니다.
|
104 |
+
|
105 |
+
세부 성향 분석:
|
106 |
+
외향(E) vs 내향(I): {e_score:.1f}% vs {100-e_score:.1f}%
|
107 |
+
감각(S) vs 직관(N): {s_score:.1f}% vs {100-s_score:.1f}%
|
108 |
+
사고(T) vs 감정(F): {t_score:.1f}% vs {100-t_score:.1f}%
|
109 |
+
판단(J) vs 인식(P): {j_score:.1f}% vs {100-j_score:.1f}%
|
110 |
+
|
111 |
+
성향 강도 해석:
|
112 |
+
- 매우 강함: 70% 이상
|
113 |
+
- 강함: 60-69%
|
114 |
+
- 보통: 40-59%
|
115 |
+
- 약함: 31-39%
|
116 |
+
- 매우 약함: 30% 이하
|
117 |
+
|
118 |
+
※ 각 성향이 50%에 가까울수록 양쪽 특성을 균형있게 사용할 수 있음을 의미합니다.
|
119 |
+
※ 검사 결과는 참고용이며, 실제 성격 유형과 다를 수 있습니다.
|
120 |
+
"""
|
121 |
+
|
122 |
+
return result
|
123 |
+
|
124 |
+
except Exception as e:
|
125 |
+
return f"오류가 발생했습니다: {str(e)}\n모든 질문에 답변했는지 확인해주세요."
|
126 |
+
|
127 |
+
def create_test():
|
128 |
+
with gr.Blocks(title="MBTI 성격유형 검사") as app:
|
129 |
+
gr.Markdown("""
|
130 |
+
# MBTI 성격유형 검사 (50문항)
|
131 |
+
각 질문에 대해 1(전혀 아니다)부터 5(매우 그렇다)까지 응답해주세요.
|
132 |
+
더욱 정확한 결과를 위해 모든 질문에 솔직하게 답변해 주시기 바랍니다.
|
133 |
+
""")
|
134 |
+
|
135 |
+
with gr.Column():
|
136 |
+
# 질문별 슬라이더 생성
|
137 |
+
sliders = []
|
138 |
+
for i, q in enumerate(questions, 1):
|
139 |
+
slider = gr.Slider(
|
140 |
+
minimum=1,
|
141 |
+
maximum=5,
|
142 |
+
step=1,
|
143 |
+
value=3,
|
144 |
+
label=q,
|
145 |
+
info="1: 전혀 아니다 ~ 5: 매우 그렇다"
|
146 |
+
)
|
147 |
+
sliders.append(slider)
|
148 |
+
|
149 |
+
submit_btn = gr.Button("결과 확인")
|
150 |
+
result_text = gr.Textbox(label="검사 결과", lines=12)
|
151 |
+
|
152 |
+
# 에러 처리를 포함한 제출 함수
|
153 |
+
def safe_submit(*args):
|
154 |
+
try:
|
155 |
+
return calculate_mbti(args)
|
156 |
+
except Exception as e:
|
157 |
+
return f"오류가 발생했습니다: {str(e)}"
|
158 |
+
|
159 |
+
submit_btn.click(
|
160 |
+
fn=safe_submit,
|
161 |
+
inputs=sliders,
|
162 |
+
outputs=result_text
|
163 |
+
)
|
164 |
+
|
165 |
+
return app
|
166 |
+
|
167 |
+
# 애플리케이션 실행
|
168 |
+
if __name__ == "__main__":
|
169 |
+
app = create_test()
|
170 |
+
app.launch()
|