ginichat / app.py
hyeongnym's picture
Create app.py
0f8e312 verified
raw
history blame
7.12 kB
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()