hyeongnym commited on
Commit
0f8e312
·
verified ·
1 Parent(s): aee119d

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +170 -2
app.py CHANGED
@@ -1,2 +1,170 @@
1
- import os
2
- exec(os.environ.get('APP'))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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()