TCI_TEST / app.py
aliceblue11's picture
Update app.py
36bff74 verified
raw
history blame
8.91 kB
# 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()