import gradio as gr import numpy as np # MBTI 질문 리스트 (50문항) questions = [ # E vs I (13문항) "1. 나는 새로운 사람들과 만나는 것을 즐긴다.", "2. 혼자만의 시간을 더 선호한다.", "3. 대화를 먼저 시작하는 편이다.", "4. 많은 사람들과 어울리면 에너지가 소진된다.", "5. 파티나 모임에서 새로운 사람들과 대화하기를 좋아한다.", "6. 조용한 환경에서 혼자 일하는 것이 편하다.", "7. 그룹 활동이나 팀 프로젝트를 선호한다.", "8. 사회적 모임 후에는 혼자만의 시간이 필요하다.", "9. 많은 사람들 앞에서 발표하는 것이 즐겁다.", "10. 친구들과 함께 있을 때 가장 편안하다.", "11. 새로운 환경에 적응하는 것이 어렵지 않다.", "12. 혼자서 여행하는 것을 좋아한다.", "13. 모임에서 중심이 되는 것이 자연스럽다.", # S vs N (13문항) "14. 실제적이고 구체적인 것을 선호한다.", "15. 상상하고 새로운 아이디어를 생각하는 것을 좋아한다.", "16. 세부사항에 주의를 기울인다.", "17. 큰 그림을 보는 것을 선호한다.", "18. 현재에 집중하는 편이다.", "19. 미래의 가능성을 상상하는 것을 좋아한다.", "20. 실용적이고 현실적인 해결책을 찾는다.", "21. 새롭고 혁신적인 방법을 시도하는 것을 좋아한다.", "22. 경험에 기반한 판단을 선호한다.", "23. 직관적인 느낌을 중요하게 여긴다.", "24. 구체적인 사실과 데이터를 중시한다.", "25. 추상적인 개념을 탐구하는 것이 즐겁다.", "26. 전통적이고 검증된 방식을 선호한다.", # T vs F (12문항) "27. 결정을 내릴 때 논리적으로 분석한다.", "28. 다른 사람의 감정을 잘 고려한다.", "29. 객관적인 사실을 중요하게 생각한다.", "30. 직감과 감정을 따르는 편이다.", "31. 감정보다 이성을 더 중요하게 여긴다.", "32. 다른 사람들의 감정 상태에 민감하다.", "33. 논리적 일관성을 중요하게 생각한다.", "34. 공감능력이 뛰어난 편이다.", "35. 감정적 결정을 내리는 것을 피한다.", "36. 다른 사람의 입장에서 생각하려 노력한다.", "37. 객관적 분석을 통해 결론을 도출한다.", "38. 사람들 간의 조화를 중요하게 생각한다.", # J vs P (12문항) "39. 계획을 세우고 그대로 실행하는 것을 좋아한다.", "40. 융통성 있게 상황에 대처하는 것을 선호한다.", "41. 마감기한을 정확히 지키는 편이다.", "42. 일정을 미리 정하기보다 즉흥적으로 행동한다.", "43. 체계적으로 일을 처리하는 것을 좋아한다.", "44. 상황에 따라 계획을 변경하는 것이 자연스럽다.", "45. 할 일을 미리 계획하고 준비한다.", "46. 새로운 가능성을 위해 열려있는 것이 좋다.", "47. 정해진 규칙과 절차를 잘 따른다.", "48. 급작스러운 변화에도 잘 적응한다.", "49. 일의 완료를 중요하게 생각한다.", "50. 여러 선택지를 오래 열어두는 것을 선호한다." ] def calculate_mbti(scores): try: # 점수를 float로 변환하고 유효성 검사 scores = [float(score) if score is not None else 3.0 for score in scores] if not all(1 <= score <= 5 for score in scores): return "오류: 모든 점수는 1에서 5 사이여야 합니다." # 역채점이 필요한 문항 처리 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] for i in reverse_questions: scores[i-1] = 6 - scores[i-1] # 점수 계산 E = sum(scores[0:13]) # 13문항 S = sum(scores[13:26]) # 13문항 T = sum(scores[26:38]) # 12문항 J = sum(scores[38:50]) # 12문항 # 최대 점수 계산 max_ei = 13 * 5 # E/I 최대점수 max_sn = 13 * 5 # S/N 최대점수 max_tf = 12 * 5 # T/F 최대점수 max_jp = 12 * 5 # J/P 최대점수 # MBTI 유형 결정 mbti = "" mbti += "E" if E > max_ei/2 else "I" mbti += "S" if S > max_sn/2 else "N" mbti += "T" if T > max_tf/2 else "F" mbti += "J" if J > max_jp/2 else "P" # 각 특성의 강도 계산 (백분율) e_score = (E / max_ei) * 100 s_score = (S / max_sn) * 100 t_score = (T / max_tf) * 100 j_score = (J / max_jp) * 100 result = f""" 당신의 MBTI 유형은 {mbti}입니다. 세부 성향 분석: 외향(E) vs 내향(I): {e_score:.1f}% vs {100-e_score:.1f}% 감각(S) vs 직관(N): {s_score:.1f}% vs {100-s_score:.1f}% 사고(T) vs 감정(F): {t_score:.1f}% vs {100-t_score:.1f}% 판단(J) vs 인식(P): {j_score:.1f}% vs {100-j_score:.1f}% 성향 강도 해석: - 매우 강함: 70% 이상 - 강함: 60-69% - 보통: 40-59% - 약함: 31-39% - 매우 약함: 30% 이하 ※ 각 성향이 50%에 가까울수록 양쪽 특성을 균형있게 사용할 수 있음을 의미합니다. ※ 검사 결과는 참고용이며, 실제 성격 유형과 다를 수 있습니다. """ return result except Exception as e: return f"오류가 발생했습니다: {str(e)}\n모든 질문에 답변했는지 확인해주세요." def create_test(): with gr.Blocks(title="MBTI 성격유형 검사") as app: gr.Markdown(""" # MBTI 성격유형 검사 (50문항) 각 질문에 대해 1(전혀 아니다)부터 5(매우 그렇다)까지 응답해주세요. 더욱 정확한 결과를 위해 모든 질문에 솔직하게 답변해 주시기 바랍니다. """) with gr.Column(): # 질문별 슬라이더 생성 sliders = [] for i, q in enumerate(questions, 1): slider = gr.Slider( minimum=1, maximum=5, step=1, value=3, label=q, info="1: 전혀 아니다 ~ 5: 매우 그렇다" ) sliders.append(slider) submit_btn = gr.Button("결과 확인") result_text = gr.Textbox(label="검사 결과", lines=12) # 에러 처리를 포함한 제출 함수 def safe_submit(*args): try: return calculate_mbti(args) except Exception as e: return f"오류가 발생했습니다: {str(e)}" submit_btn.click( fn=safe_submit, inputs=sliders, outputs=result_text ) return app # 애플리케이션 실행 if __name__ == "__main__": app = create_test() app.launch()