import gradio as gr # 질문 설정 (총 20개로 축소) questions = [ "나는 다른 사람들과 함께 있을 때 에너지를 얻는다.", "나는 새로운 사람들과 쉽게 친해지는 편이다.", "나는 대규모 모임을 즐긴다.", "나는 혼자 보내는 시간이 편하다.", "나는 친구들과 대화하는 시간이 즐겁다.", "나는 현실적이고 구체적인 정보를 선호한다.", "나는 과거의 경험을 바탕으로 결정을 내린다.", "나는 큰 그림보다는 세부사항에 집중한다.", "나는 새로운 아이디어보다는 실질적인 것을 선호한다.", "나는 직관보다는 자료에 의존하는 편이다.", "나는 감정보다는 논리적으로 판단하려 한다.", "나는 갈등 상황에서 공정함을 중시한다.", "나는 결정을 내릴 때 사람들의 감정보다는 사실에 집중한다.", "나는 문제 해결에 있어 논리적 접근을 선호한다.", "나는 비판을 받더라도 감정적으로 반응하지 않으려 한다.", "나는 계획에 따라 일하는 것을 선호한다.", "나는 마감 기한 전에 일을 마무리하려 노력한다.", "나는 일의 세부 계획을 미리 세워놓는다.", "나는 예측 가능한 일정을 선호한다.", "나는 변화보다는 안정된 상태를 선호한다." ] # MBTI 성격 유형 설명 데이터 mbti_details = { "ESTJ": { "성격 성향": "실용적이고 조직적, 리더십 강함", "기질 설명": "현실적이며 체계적인 접근을 좋아함", "추천 직업": ["경영자", "프로젝트 매니저", "군인"], "좋은 궁합": ["ISFJ", "ISTJ"], "나쁜 궁합": ["INFP", "ENFP"], "궁합 이유": { "좋은": "비슷한 현실주의 성향과 체계적인 사고를 공유하기 때문에 잘 어울림.", "나쁜": "감정적으로 충돌할 가능성이 높고, 자유로운 성향이 충돌할 수 있음." } }, "ENTJ": { "성격 성향": "전략적이고 결단력 있음", "기질 설명": "리더십을 중시하고 목표 지향적임", "추천 직업": ["CEO", "변호사", "컨설턴트"], "좋은 궁합": ["INTP", "ENFP"], "나쁜 궁합": ["ISFP", "INFP"], "궁합 이유": { "좋은": "자유로운 사고를 존중하며, 문제 해결 능력이 잘 어우러짐.", "나쁜": "감정적으로 충돌하고, 세부 사항을 무시하는 경향이 문제를 일으킬 수 있음." } }, # 다른 MBTI 유형 설명 추가 가능 } # MBTI 결과에 따른 설명 제공 함수 def get_mbti_details(mbti_type): details = mbti_details.get(mbti_type, None) if details: description = f"성격 성향: {details['성격 성향']}\n" description += f"기질 설명: {details['기질 설명']}\n" description += f"추천 직업: {', '.join(details['추천 직업'])}\n" description += f"좋은 궁합: {', '.join(details['좋은 궁합'])}\n" description += f"나쁜 궁합: {', '.join(details['나쁜 궁합'])}\n" description += f"좋은 궁합 이유: {details['궁합 이유']['좋은']}\n" description += f"나쁜 궁합 이유: {details['궁합 이유']['나쁜']}\n" return description return "알 수 없는 MBTI 유형입니다." # 결과 계산 함수 def calculate_mbti(*responses): # 리스트 형태로 모든 응답을 받는다 # 각 성향 점수 계산 score_mapping = { "매우 아니다": 1, "아니다": 2, "보통이다": 3, "그렇다": 4, "매우 그렇다": 5 } scores = [score_mapping[response] for response in responses] e_score = sum([scores[i] for i in range(5)]) # Extraversion/Introversion 관련 점수 s_score = sum([scores[i + 5] for i in range(5)]) # Sensing/Intuition 관련 점수 t_score = sum([scores[i + 10] for i in range(5)]) # Thinking/Feeling 관련 점수 j_score = sum([scores[i + 15] for i in range(5)]) # Judging/Perceiving 관련 점수 mbti_type = "" mbti_type += "E" if e_score > 15 else "I" mbti_type += "S" if s_score > 15 else "N" mbti_type += "T" if t_score > 15 else "F" mbti_type += "J" if j_score > 15 else "P" # 유형이 얼마나 맞는지 계산 (%) total_score = e_score + s_score + t_score + j_score percentage = round(total_score / 100 * 100, 2) description = get_mbti_details(mbti_type) return f"당신의 MBTI 유형은 {mbti_type}입니다. 이 유형이 맞을 확률은 {percentage}%입니다.\n\n{description}" # Gradio 인터페이스 생성 def create_interface(): # 라디오 버튼을 "매우 아니다" ~ "매우 그렇다" 값으로 설정 choices = ["매우 아니다", "아니다", "보통이다", "그렇다", "매우 그렇다"] inputs = [gr.Radio(choices=choices, label=questions[i]) for i in range(len(questions))] # Gradio 인터페이스 설정 interface = gr.Interface(fn=calculate_mbti, inputs=inputs, outputs="text", title="MBTI 분석기", description="20개의 질문에 답하고 당신의 MBTI 유형과 그 설명을 확인하세요!") return interface # 인터페이스 실행 interface = create_interface() interface.launch()