Spaces:
Runtime error
Runtime error
# app.py | |
import gradio as gr | |
# TCI 유형 데이터 | |
TCI_TYPES = { | |
"Type1": { | |
"name": "활동적인 도전자", | |
"description": "활동적인 도전자는 새로운 경험을 추구하며, 도전적인 상황에서 에너지를 얻습니다. 이들은 창의적이고 모험을 즐기지만 때로는 충동적일 수 있습니다.", | |
"career": ["기업가", "마케팅 전문가", "프로젝트 매니저"], | |
"compatibility": { | |
"good": {"Type2": "보수적인 면을 보완해주어 균형을 이룸."}, | |
"bad": {"Type3": "과도한 활동성으로 인해 감정적으로 충돌할 수 있음."} | |
} | |
}, | |
"Type2": { | |
"name": "신중한 분석가", | |
"description": "신중한 분석가는 세부 사항에 주의를 기울이며, 계획적이고 체계적인 접근을 선호합니다. 이들은 신뢰할 수 있고 책임감이 강하지만 때로는 융통성이 부족할 수 있습니다.", | |
"career": ["데이터 분석가", "회계사", "연구원"], | |
"compatibility": { | |
"good": {"Type1": "활동적인 도전자의 창의성을 보완함."}, | |
"bad": {"Type4": "보수적인 성향으로 인해 갈등이 발생할 수 있음."} | |
} | |
}, | |
"Type3": { | |
"name": "감성적인 예술가", | |
"description": "감성적인 예술가는 감정이 풍부하고 창의성이 뛰어나며, 예술적인 표현을 즐깁니다. 이들은 타인의 감정을 잘 이해하지만 감정 기복이 심할 수 있습니다.", | |
"career": ["작가", "음악가", "디자이너"], | |
"compatibility": { | |
"good": {"Type5": "논리적인 사고를 보완해줌."}, | |
"bad": {"Type1": "과도한 활동성으로 인해 감정적으로 충돌할 수 있음."} | |
} | |
}, | |
"Type4": { | |
"name": "실용적인 관리자", | |
"description": "실용적인 관리자는 조직적이고 효율성을 중시하며, 문제 해결에 뛰어납니다. 이들은 책임감이 강하고 신뢰할 수 있지만 때로는 융통성이 부족할 수 있습니다.", | |
"career": ["운영 관리자", "프로덕트 매니저", "인사 관리자"], | |
"compatibility": { | |
"good": {"Type2": "신중한 분석가와의 조화로 효율성 증대."}, | |
"bad": {"Type6": "과도한 실용주의로 인해 인간관계에서 갈등 발생 가능."} | |
} | |
}, | |
"Type5": { | |
"name": "논리적인 사색가", | |
"description": "논리적인 사색가는 깊이 있는 사고와 분석을 즐기며, 문제 해결에 뛰어납니다. 이들은 독립적이고 창의적이지만 때로는 사회적 상호작용을 어려워할 수 있습니다.", | |
"career": ["소프트웨어 엔지니어", "연구 과학자", "전략 컨설턴트"], | |
"compatibility": { | |
"good": {"Type3": "감성적인 예술가와의 조화로 창의성 증대."}, | |
"bad": {"Type4": "실용적인 관리자와의 목표 충돌 가능."} | |
} | |
}, | |
"Type6": { | |
"name": "친화적인 협력자", | |
"description": "친화적인 협력자는 타인과의 조화를 중시하며, 협동과 배려를 통해 관계를 유지합니다. 이들은 팀워크에 강하지만 때로는 자기주장을 부족하게 할 수 있습니다.", | |
"career": ["인사 담당자", "사회 복지사", "고객 서비스 전문가"], | |
"compatibility": { | |
"good": {"Type7": "개방적인 유형과의 협력을 통해 다양한 시각 수용."}, | |
"bad": {"Type4": "과도한 실용주의로 인해 감정적인 측면에서 갈등 발생 가능."} | |
} | |
}, | |
"Type7": { | |
"name": "개방적인 혁신가", | |
"description": "개방적인 혁신가는 새로운 아이디어와 변화를 추구하며, 유연한 사고를 지니고 있습니다. 이들은 창의적이고 적응력이 뛰어나지만 때로는 집중력이 부족할 수 있습니다.", | |
"career": ["스타트업 창업자", "디지털 마케터", "혁신 컨설턴트"], | |
"compatibility": { | |
"good": {"Type6": "친화적인 협력자와의 조화를 통해 팀워크 강화."}, | |
"bad": {"Type2": "신중한 분석가와의 계획 차이로 인해 갈등 발생 가능."} | |
} | |
} | |
} | |
# 질문 리스트 | |
QUESTIONS = [ | |
"1. 쉬운 일보다는 도전적인 일이 더 좋다.", | |
"2. 나를 좋지 않게 대했던 사람들과도 친하게 지낸다.", | |
"3. 음악을 듣거나 산책을 할 때 그 속에 빠져들어 나 자신을 잊는다.", | |
"4. 종종 실제보다 일이 더 어렵거나 위험할 것이라고 예상한다.", | |
"5. 내가 할 수 있는 한 더 잘 하고 싶기 때문에, 열심을 다해 나 자신을 몰아붙인다.", | |
"6. 주머니가 바닥날 때까지 돈을 쓰거나, 신용카드를 너무 많이 사용해서 빚을 지는 때가 있다.", | |
"7. 내가 가지고 있는 많은 습관들은 내가 가치 있는 목표를 달성하는 데 방해가 된다.", | |
"8. 문제가 생기면 혼자서 해결하려 한다.", | |
"9. 미래에 어떤 일이 잘못될까봐 자주 걱정한다.", | |
"10. 별로 힘들이지 않고 하루 종일 활동할 수 있다.", | |
"11. 어려움에 처했거나 뭔가를 필요로 하는 사람이 있을 때 도움을 준다.", | |
"12. 처음 만난 사람과도 편안하게 대화하고 내 의견을 이야기할 수 있다.", | |
"13. 새로운 일에 마음이 쉽게 동해서 당장 시도해 보고 싶어진다.", | |
"14. 다른 아무 것도 눈에 들어오지 않을 정도로 어떤 일에 몰입하요, 때로 딴 세계에 있는 듯 보일 때가 있다.", | |
"15. 종종 나 자신에게 불만을 느낀다.", | |
"16. 내 생각을 받아들이지 않는 사람들을 참아내기가 힘들다.", | |
"17. 낯선 사람을 만날 때, 매우 수줍어하며 위축된다.", | |
"18. 나의 야망과 열심 때문에 성공하는 때가 종종 있다.", | |
"19. 나에게 잘못을 저지른 사람들을 쉽게 용서하는 편이다.", | |
"20. 다른 사람들과 거리를 두고 떨어져 지내는 것이 좋다.", | |
"21. 어떤 일을 할 때 과거에 어떻게 했는지 생각하지 않고 현재의 느낌에 따라 행동한다." | |
] | |
# 선택지 | |
OPTIONS = ["매우 그렇다", "그렇다", "보통이다", "아니다", "매우 아니다"] | |
# 질문과 TCI 유형 매핑 (예시) | |
# 실제 TCI 이론에 따라 질문과 유형을 정확히 매핑해야 합니다. | |
# 여기서는 예시로 임의로 매핑하였습니다. | |
QUESTION_TYPE_MAPPING = { | |
0: "Type1", | |
1: "Type6", | |
2: "Type3", | |
3: "Type2", | |
4: "Type1", | |
5: "Type4", | |
6: "Type2", | |
7: "Type5", | |
8: "Type2", | |
9: "Type1", | |
10: "Type6", | |
11: "Type7", | |
12: "Type7", | |
13: "Type3", | |
14: "Type3", | |
15: "Type2", | |
16: "Type5", | |
17: "Type1", | |
18: "Type1", | |
19: "Type6", | |
20: "Type7" | |
} | |
def calculate_tci(responses): | |
scores = {type_name: 0 for type_name in TCI_TYPES.keys()} | |
for idx, response in enumerate(responses): | |
type_key = QUESTION_TYPE_MAPPING.get(idx) | |
if type_key: | |
# 선택지 인덱스에 따라 점수 부여 (매우 아니다=1, 매우 그렇다=5) | |
score = response + 1 | |
scores[type_key] += score | |
# 퍼센트 계산 | |
total = sum(scores.values()) | |
if total == 0: | |
percentages = {k: 0 for k in scores.keys()} | |
else: | |
percentages = {k: (v / total * 100) for k, v in scores.items()} | |
# 최고 점수 유형 선택 | |
selected_type = max(percentages, key=percentages.get) | |
return selected_type, percentages[selected_type] | |
def get_results(*responses): | |
selected_type, percentage = calculate_tci(responses) | |
type_info = TCI_TYPES[selected_type] | |
# 결과 형식화 | |
result = { | |
"유형": type_info["name"], | |
"퍼센트": f"{percentage:.2f}%", | |
"성격 설명": type_info["description"], | |
"추천 직업": ", ".join(type_info["career"]), | |
"좋은 궁합": ", ".join([f"{k}: {v}" for k, v in type_info["compatibility"]["good"].items()]), | |
"나쁜 궁합": ", ".join([f"{k}: {v}" for k, v in type_info["compatibility"]["bad"].items()]) | |
} | |
return result | |
def main(): | |
with gr.Blocks() as demo: | |
gr.Markdown("# TCI 기질 분석기") | |
gr.Markdown("아래 질문에 답변해 주세요.") | |
with gr.Column(): | |
inputs = [] | |
for question in QUESTIONS: | |
response = gr.Radio(label=question, choices=OPTIONS, type="index") | |
inputs.append(response) | |
submit = gr.Button("결과 보기") | |
output = gr.JSON() | |
submit.click(fn=get_results, inputs=inputs, outputs=output) | |
demo.launch() | |
if __name__ == "__main__": | |
main() | |