JeongHyunsung commited on
Commit
c71921d
Β·
verified Β·
1 Parent(s): 579f304

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +87 -45
app.py CHANGED
@@ -5,6 +5,29 @@ import streamlit as st
5
  import os
6
  import numpy as np
7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  KOTE_LABELS = [
9
  'λΆˆν‰/뢈만', 'ν™˜μ˜/호의', '감동/감탄', 'μ§€κΈ‹μ§€κΈ‹', 'κ³ λ§ˆμ›€', 'μŠ¬ν””', '화남/λΆ„λ…Έ', 'μ‘΄κ²½',
10
  'κΈ°λŒ€κ°', '우쭐댐/λ¬΄μ‹œν•¨', 'μ•ˆνƒ€κΉŒμ›€/싀망', 'λΉ„μž₯함', 'μ˜μ‹¬/λΆˆμ‹ ', 'λΏŒλ“―ν•¨', 'νŽΈμ•ˆ/쾌적',
@@ -59,67 +82,86 @@ tabs = st.tabs(["감정 뢄석 μ²΄ν—˜", "AIλŠ” μ–΄λ–»κ²Œ 감정을 μ΄ν•΄ν• κΉŒ?
59
 
60
 
61
  with tabs[0]:
62
- st.markdown("""
63
- <style>
64
- .big-title { font-size: 1.5em; font-weight: 800; margin-bottom: 0.2em; }
65
- .sub-info { font-size: 1.1em; color: #666; margin-bottom: 1em; }
66
- .card { background-color: #f9f9f9; padding: 1.2em; border-radius: 10px; border: 1px solid #eee; }
67
- </style>
68
- """, unsafe_allow_html=True)
69
-
70
  st.markdown('<div class="big-title">🎭 ν•œκ΅­μ–΄ 감정 뢄석 AI μ²΄ν—˜</div>', unsafe_allow_html=True)
71
  st.markdown('<div class="sub-info">2025λ…„ 1ν•™κΈ° λ””μ§€ν„Έ 인문학 μž…λ¬Έ (SLA23501) Β· <b>Team μƒλŸ¬λ“œλ³Ό</b><br>κ°•μˆ˜ν˜„ Β· κΉ€λ™μš° Β· μ •μ˜ˆμ€ Β· μ •ν˜„μ„± Β· μ΅œμ’…μœ€</div>', unsafe_allow_html=True)
72
 
73
- st.markdown('<div class="card">λ¬Έμž₯을 μž…λ ₯ν•˜λ©΄ 인곡지λŠ₯이 μ–΄λ–€ 감정을 λŠλΌλŠ”μ§€ μ˜ˆμΈ‘ν•΄μ€λ‹ˆλ‹€.<br>μ•„λž˜μ— λ¬Έμž₯을 μž…λ ₯ν•˜κ±°λ‚˜ μ˜ˆμ‹œ λ²„νŠΌμ„ 눌러 μ²΄ν—˜ν•΄λ³΄μ„Έμš”.</div>', unsafe_allow_html=True)
 
 
 
 
 
74
 
75
  if "example_text" not in st.session_state:
76
  st.session_state.example_text = ""
77
 
78
- if st.button("πŸ“Œ μ˜ˆμ‹œ λ¬Έμž₯ 뢈러였기"):
79
- st.session_state.example_text = "이 μ˜ν™” 정말 κ°λ™μ μ΄μ—ˆμ–΄μš”. 눈물이 λ‚¬μŠ΅λ‹ˆλ‹€."
80
-
81
  text = st.text_area("✍️ λ¬Έμž₯을 μž…λ ₯ν•˜μ„Έμš”:", value=st.session_state.example_text, height=120, placeholder="예: 였늘 ν•˜λ£¨ 정말 ν–‰λ³΅ν–ˆμ–΄μš”.")
82
 
83
- if st.button("πŸ” 감정 μ˜ˆμΈ‘ν•˜κΈ°"):
84
- if text.strip():
85
- results, full_probs = predict_emotion(text)
86
- st.subheader("πŸ“Š μƒμœ„ 감정 κ²°κ³Ό")
87
- for label, prob in results:
88
- st.markdown(f"- **{label}**: `{prob:.3f}`")
89
- st.subheader("πŸ“ˆ ν™•λ₯  뢄포 (Top 5)")
90
- st.bar_chart({label: prob for label, prob in results})
91
- else:
92
- st.warning("λ¬Έμž₯을 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”.")
 
 
 
 
 
 
 
 
 
93
 
94
 
95
  with tabs[1]:
96
- st.title("πŸ€– 인곡지λŠ₯은 감정을 μ–΄λ–»κ²Œ μ΄ν•΄ν• κΉŒμš”?")
97
  st.markdown("""
98
- 인곡지λŠ₯은 λ¬Έμž₯을 '숫자의 벑터'둜 λ°”κΎΈμ–΄ μ΄ν•΄ν•©λ‹ˆλ‹€.
99
- 이 과정은 λ‹€μŒκ³Ό 같은 λ‹¨κ³„λ‘œ μ΄λ€„μ§‘λ‹ˆλ‹€:
100
- 1. **μ‚¬μ „ν•™μŠ΅λœ μ–Έμ–΄ λͺ¨λΈ**(KLUE-RoBERTa)이 λ¬Έμž₯을 읽고 핡심 정보λ₯Ό μΆ”μΆœν•©λ‹ˆλ‹€.
101
- 2. κ·Έ 정보λ₯Ό λ°”νƒ•μœΌλ‘œ **감정 λΆ„λ₯˜κΈ°**(MLP)κ°€ μ–΄λ–€ 감정이 담겨 μžˆλŠ”μ§€λ₯Ό μ˜ˆμΈ‘ν•©λ‹ˆλ‹€.
102
- 3. 이 예츑 κ²°κ³ΌλŠ” 각 감정에 λŒ€ν•΄ μ–Όλ§ˆλ‚˜ κ°€λŠ₯성이 μžˆλŠ”μ§€λ₯Ό 'ν™•λ₯ '둜 λ³΄μ—¬μ€λ‹ˆλ‹€.
103
- """)
 
 
 
 
104
 
105
  with tabs[2]:
106
- st.title("🧠 Few-shot Fine-tuningμ΄λž€?")
107
  st.markdown("""
108
- μ‚¬μ „ν•™μŠ΅λœ λŒ€ν˜• μ–Έμ–΄ λͺ¨λΈμ€ 이미 μˆ˜λ§Žμ€ λ¬Έμž₯을 ν•™μŠ΅ν–ˆμŠ΅λ‹ˆλ‹€.
109
- μš°λ¦¬λŠ” 이 λͺ¨λΈμ„ 감정 뢄석에 맞게 **μ•½κ°„λ§Œ μ‘°μ •**ν•˜λŠ”λ°, 이λ₯Ό **Fine-tuning**이라 λΆ€λ¦…λ‹ˆλ‹€.
110
-
111
- κ·Έμ€‘μ—μ„œλ„ 적은 μ–‘μ˜ λ°μ΄ν„°λ§ŒμœΌλ‘œ ν•™μŠ΅ν•˜λŠ” 방식을 **Few-shot Fine-tuning**이라고 ν•©λ‹ˆλ‹€.
112
-
113
- 이 μ›Ήμ•±μ—μ„œλŠ” `KLUE-RoBERTa` λͺ¨λΈμ„ κ³ μ •ν•˜κ³ , λ§ˆμ§€λ§‰ λΆ„λ₯˜κΈ°(MLP)만 λ”°λ‘œ ν•™μŠ΅μ‹œμΌ°μŠ΅λ‹ˆλ‹€.
114
- """)
 
115
 
116
  with tabs[3]:
117
- st.title("πŸ“Œ 이 κΈ°μˆ μ€ 어디에 쓰일 수 μžˆμ„κΉŒμš”?")
 
118
  st.markdown("""
119
- λ³Έ μ—°κ΅¬λŠ” λ‹¨μˆœν•œ 감정 인식 κΈ°μˆ μ„ λ„˜μ–΄, μ‚¬νšŒμ  감정 흐름을 λΆ„μ„ν•˜λŠ” 데 ν™œμš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.
120
- 예λ₯Ό λ“€μ–΄:
121
- - μ•…ν”Œ μžλ™ 감지 μ‹œμŠ€ν…œ
122
- - 유튜브 μ˜μƒ λŒ“κΈ€μ˜ 감정 흐름 μ‹œκ°ν™”
123
- - μ‚¬νšŒμ  μ΄μŠˆμ— λŒ€ν•œ 곡감/혐였 뢄석
124
- - 온라인 곡둠μž₯ λ‚΄ 감정 μ „μ—Ό ꡬ쑰 연ꡬ
125
- """)
 
 
 
 
 
 
 
 
 
 
 
5
  import os
6
  import numpy as np
7
 
8
+ st.markdown("""
9
+ <style>
10
+ .big-title {
11
+ font-size: 2.4em;
12
+ font-weight: 800;
13
+ margin-bottom: 0.2em;
14
+ }
15
+ .sub-info {
16
+ font-size: 1.1em;
17
+ color: #666;
18
+ margin-bottom: 1.2em;
19
+ }
20
+ .card {
21
+ background-color: #f1f3f6;
22
+ padding: 1.2em;
23
+ border-left: 5px solid #3366cc;
24
+ border-radius: 6px;
25
+ margin-bottom: 1em;
26
+ }
27
+ </style>
28
+ """, unsafe_allow_html=True)
29
+
30
+
31
  KOTE_LABELS = [
32
  'λΆˆν‰/뢈만', 'ν™˜μ˜/호의', '감동/감탄', 'μ§€κΈ‹μ§€κΈ‹', 'κ³ λ§ˆμ›€', 'μŠ¬ν””', '화남/λΆ„λ…Έ', 'μ‘΄κ²½',
33
  'κΈ°λŒ€κ°', '우쭐댐/λ¬΄μ‹œν•¨', 'μ•ˆνƒ€κΉŒμ›€/싀망', 'λΉ„μž₯함', 'μ˜μ‹¬/λΆˆμ‹ ', 'λΏŒλ“―ν•¨', 'νŽΈμ•ˆ/쾌적',
 
82
 
83
 
84
  with tabs[0]:
 
 
 
 
 
 
 
 
85
  st.markdown('<div class="big-title">🎭 ν•œκ΅­μ–΄ 감정 뢄석 AI μ²΄ν—˜</div>', unsafe_allow_html=True)
86
  st.markdown('<div class="sub-info">2025λ…„ 1ν•™κΈ° λ””μ§€ν„Έ 인문학 μž…λ¬Έ (SLA23501) Β· <b>Team μƒλŸ¬λ“œλ³Ό</b><br>κ°•μˆ˜ν˜„ Β· κΉ€λ™μš° Β· μ •μ˜ˆμ€ Β· μ •ν˜„μ„± Β· μ΅œμ’…μœ€</div>', unsafe_allow_html=True)
87
 
88
+ st.markdown("""
89
+ <div class="card">
90
+ 인곡지λŠ₯은 μž…λ ₯된 λ¬Έμž₯을 뢄석해 감정이 μ–΄λ–»κ²Œ ν‘œν˜„λ˜μ—ˆλŠ”μ§€λ₯Ό μ˜ˆμΈ‘ν•©λ‹ˆλ‹€.<br>
91
+ μ•„λž˜μ— λ¬Έμž₯을 μž…λ ₯ν•˜κ±°λ‚˜ μ˜ˆμ‹œ λ¬Έμž₯을 뢈러온 ν›„, 감정 예츑 λ²„νŠΌμ„ 눌러 μ²΄ν—˜ν•΄λ³΄μ„Έμš”.
92
+ </div>
93
+ """, unsafe_allow_html=True)
94
 
95
  if "example_text" not in st.session_state:
96
  st.session_state.example_text = ""
97
 
 
 
 
98
  text = st.text_area("✍️ λ¬Έμž₯을 μž…λ ₯ν•˜μ„Έμš”:", value=st.session_state.example_text, height=120, placeholder="예: 였늘 ν•˜λ£¨ 정말 ν–‰λ³΅ν–ˆμ–΄μš”.")
99
 
100
+ col1, col2 = st.columns([1, 1])
101
+ with col1:
102
+ if st.button("πŸ“Œ μ˜ˆμ‹œ λ¬Έμž₯ 뢈러였기"):
103
+ st.session_state.example_text = "이 μ˜ν™” 정말 κ°λ™μ μ΄μ—ˆμ–΄μš”. 눈물이 λ‚¬μŠ΅λ‹ˆλ‹€."
104
+ st.experimental_rerun()
105
+
106
+ with col2:
107
+ if st.button("πŸ” 감정 μ˜ˆμΈ‘ν•˜κΈ°"):
108
+ if text.strip():
109
+ results, full_probs = predict_emotion(text)
110
+ st.subheader("πŸ“Š μƒμœ„ 감정 κ²°κ³Ό")
111
+ for label, prob in results:
112
+ st.markdown(f"- **{label}**: `{prob:.3f}`")
113
+ st.subheader("πŸ“ˆ ν™•λ₯  뢄포 (Top 5)")
114
+ st.bar_chart({label: prob for label, prob in results})
115
+ else:
116
+ st.warning("λ¬Έμž₯을 λ¨Όμ € μž…λ ₯ν•΄μ£Όμ„Έμš”.")
117
+
118
+
119
 
120
 
121
  with tabs[1]:
122
+ st.markdown('<div class="big-title">πŸ€– 인곡지λŠ₯은 감정을 μ–΄λ–»κ²Œ μ΄ν•΄ν• κΉŒμš”?</div>', unsafe_allow_html=True)
123
  st.markdown("""
124
+ <div class="card">
125
+ 인곡지λŠ₯은 λ¬Έμž₯을 '숫자의 벑터'둜 λ°”κΎΈμ–΄ μ΄ν•΄ν•©λ‹ˆλ‹€.<br><br>
126
+ 이 과정은 λ‹€μŒκ³Ό 같은 λ‹¨κ³„λ‘œ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€:
127
+ <ol>
128
+ <li><b>μ‚¬μ „ν•™μŠ΅ μ–Έμ–΄ λͺ¨λΈ</b>(KLUE-RoBERTa)이 λ¬Έμž₯을 읽고 핡심 의미λ₯Ό μΆ”μΆœν•©λ‹ˆλ‹€.</li>
129
+ <li>이 κ²°κ³Όλ₯Ό λ°”νƒ•μœΌλ‘œ <b>감정 λΆ„λ₯˜κΈ°</b>(MLP)κ°€ 감정을 μ˜ˆμΈ‘ν•©λ‹ˆλ‹€.</li>
130
+ <li>각 감정에 λŒ€ν•œ κ°€λŠ₯성을 <b>ν™•λ₯ λ‘œ</b> λ³΄μ—¬μ€λ‹ˆλ‹€.</li>
131
+ </ol>
132
+ </div>
133
+ """, unsafe_allow_html=True)
134
 
135
  with tabs[2]:
136
+ st.markdown('<div class="big-title">🧠 Few-shot Fine-tuningμ΄λž€?</div>', unsafe_allow_html=True)
137
  st.markdown("""
138
+ <div class="card">
139
+ μš°λ¦¬κ°€ μ‚¬μš©ν•˜λŠ” KLUE-RoBERTa λͺ¨λΈμ€ 이미 μˆ˜λ§Žμ€ λ¬Έμž₯을 ν•™μŠ΅ν•œ κ±°λŒ€ν•œ μ–Έμ–΄ λͺ¨λΈμž…λ‹ˆλ‹€.<br><br>
140
+ ν•˜μ§€λ§Œ 감정 λΆ„μ„μ΄λΌλŠ” νŠΉμ •ν•œ μž‘μ—…μ— 맞게 쑰금 더 ν•™μŠ΅μ‹œν‚€λŠ” 과정이 ν•„μš”ν•©λ‹ˆλ‹€.<br><br>
141
+ μ΄λ•Œ 전체 λͺ¨λΈμ„ λ‹€μ‹œ ν•™μŠ΅ν•˜μ§€ μ•Šκ³ , λ§ˆμ§€λ§‰ λΆ„λ₯˜κΈ°(MLP)만 ν•™μŠ΅ν•˜λŠ” 방식이 λ°”λ‘œ
142
+ <b>Few-shot Fine-tuning</b>μž…λ‹ˆλ‹€.<br><br>
143
+ 이 방법을 톡해 적은 μ–‘μ˜ 감정 λ°μ΄ν„°λ§ŒμœΌλ‘œλ„ 높은 μ„±λŠ₯을 달성할 수 μžˆμŠ΅λ‹ˆλ‹€.
144
+ </div>
145
+ """, unsafe_allow_html=True)
146
 
147
  with tabs[3]:
148
+ st.markdown('<div class="big-title">πŸ“Œ 이 κΈ°μˆ μ€ 어디에 쓰일 수 μžˆμ„κΉŒμš”?</div>', unsafe_allow_html=True)
149
+
150
  st.markdown("""
151
+ <div class="card">
152
+ 이 감정 뢄석 κΈ°μˆ μ€ λ‹¨μˆœνžˆ λ¬Έμž₯의 감정을 λΆ„λ₯˜ν•˜λŠ” 데 κ·ΈμΉ˜μ§€ μ•Šκ³ ,
153
+ <b>λ””μ§€ν„Έ μ‚¬νšŒμ—μ„œμ˜ 감정 흐름</b>κ³Ό <b>곡둠μž₯의 μ •μ„œμ  ꡬ쑰</b>λ₯Ό μ΄ν•΄ν•˜λŠ” λ°κΉŒμ§€ ν™•μž₯될 수 μžˆμŠ΅λ‹ˆλ‹€.<br><br>
154
+
155
+ 특히 λ‹€μŒκ³Ό 같은 뢄야에 ν™œμš©λ  수 μžˆμŠ΅λ‹ˆλ‹€:
156
+ <ul>
157
+ <li>😑 <b>μ•…μ„± λŒ“κΈ€ 탐지</b>: μœ ν•΄ ν‘œν˜„, 혐였 ν‘œν˜„μ„ 쑰기에 κ°μ§€ν•˜κ³  필터링</li>
158
+ <li>πŸ“ˆ <b>λŒ“κΈ€ 감정 흐름 μ‹œκ°ν™”</b>: μœ νŠœλΈŒλ‚˜ λ‰΄μŠ€ λŒ“κΈ€μ—μ„œ 감정 μ „νŒŒ ꡬ쑰 뢄석</li>
159
+ <li>πŸ“° <b>μ‚¬νšŒ 이슈 곡감/혐였 λ°˜μ‘ 좔적</b>: νŠΉμ • 사건에 λŒ€ν•œ 감정 λ°˜μ‘ λͺ¨λ‹ˆν„°λ§</li>
160
+ <li>πŸ’¬ <b>온라인 곡둠μž₯ 감정 μ „μ—Ό 연ꡬ</b>: 감정이 λŒ“κΈ€-λŒ€λŒ“κΈ€λ‘œ μ–΄λ–»κ²Œ ν™•μ‚°λ˜λŠ”μ§€ μ •λŸ‰μ  뢄석</li>
161
+ </ul>
162
+
163
+ λ‚˜μ•„κ°€ 이 κΈ°μˆ μ€ <b>λ””μ§€ν„Έ μΈλ¬Έν•™μ˜ μƒˆλ‘œμš΄ 뢄석 도ꡬ</b>둜 ν™œμš©λ˜μ–΄,
164
+ ν…μŠ€νŠΈ 기반 μ—¬λ‘ μ˜ μ •μ„œμ  ꡬ쑰λ₯Ό 보닀 깊이 있게 μ΄ν•΄ν•˜λŠ” 기반이 될 수 μžˆμŠ΅λ‹ˆλ‹€.
165
+ </div>
166
+ """, unsafe_allow_html=True)
167
+