JonusNattapong commited on
Commit
4d9b7d8
·
verified ·
1 Parent(s): cef9e6d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +87 -25
app.py CHANGED
@@ -1,3 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import gradio as gr
2
  from transformers import pipeline
3
  import re
@@ -40,6 +57,7 @@ def get_nlp(model_name: str):
40
 
41
  # Enhanced label mapping with modern styling for dark blue theme
42
  LABEL_MAPPINGS = {
 
43
  "LABEL_0": {"code": 0, "name": "question", "emoji": "🤔", "color": "#60a5fa", "bg": "rgba(96, 165, 250, 0.2)", "description": "คำถาม"},
44
  "LABEL_1": {"code": 1, "name": "very negative", "emoji": "😡", "color": "#ef4444", "bg": "rgba(239, 68, 68, 0.2)", "description": "เชิงลบมาก"},
45
  "LABEL_2": {"code": 2, "name": "negative", "emoji": "😢", "color": "#f87171", "bg": "rgba(248, 113, 113, 0.2)", "description": "เชิงลบ"},
@@ -47,18 +65,21 @@ LABEL_MAPPINGS = {
47
  "LABEL_4": {"code": 4, "name": "positive", "emoji": "😊", "color": "#34d399", "bg": "rgba(52, 211, 153, 0.2)", "description": "เชิงบวก"},
48
  "LABEL_5": {"code": 5, "name": "very positive", "emoji": "🤩", "color": "#22c55e", "bg": "rgba(34, 197, 94, 0.2)", "description": "เชิงบวกมาก"},
49
 
 
 
50
  "VERY_NEGATIVE": {"code": 1, "name": "very negative", "emoji": "😡", "color": "#ef4444", "bg": "rgba(239, 68, 68, 0.2)", "description": "เชิงลบมาก"},
51
  "NEGATIVE": {"code": 2, "name": "negative", "emoji": "😢", "color": "#f87171", "bg": "rgba(248, 113, 113, 0.2)", "description": "เชิงลบ"},
52
  "NEUTRAL": {"code": 3, "name": "neutral", "emoji": "😐", "color": "#facc15", "bg": "rgba(250, 204, 21, 0.2)", "description": "เป็นกลาง"},
53
  "POSITIVE": {"code": 4, "name": "positive", "emoji": "😊", "color": "#34d399", "bg": "rgba(52, 211, 153, 0.2)", "description": "เชิงบวก"},
54
  "VERY_POSITIVE": {"code": 5, "name": "very positive", "emoji": "🤩", "color": "#22c55e", "bg": "rgba(34, 197, 94, 0.2)", "description": "เชิงบวกมาก"},
55
-
56
- "POSITIVE": {"code": 3, "name": "positive", "emoji": "😊", "color": "#34d399", "bg": "rgba(52, 211, 153, 0.2)", "description": "เชิงบวก"},
57
- "NEGATIVE": {"code": 1, "name": "negative", "emoji": "😢", "color": "#f87171", "bg": "rgba(248, 113, 113, 0.2)", "description": "เชิงลบ"},
58
- "NEUTRAL": {"code": 2, "name": "neutral", "emoji": "😐", "color": "#facc15", "bg": "rgba(250, 204, 21, 0.2)", "description": "เป็นกลาง"},
59
-
60
- "0": {"code": 0, "name": "negative", "emoji": "😢", "color": "#f87171", "bg": "rgba(248, 113, 113, 0.2)", "description": "เชิงลบ"},
61
- "1": {"code": 1, "name": "positive", "emoji": "😊", "color": "#34d399", "bg": "rgba(52, 211, 153, 0.2)", "description": "เชิงบวก"},
 
62
  }
63
 
64
  def get_label_info(label: str) -> Dict:
@@ -137,7 +158,16 @@ def analyze_text(text: str, model_name: str) -> str:
137
  </div>
138
  """]
139
 
140
- sentiment_counts = {"positive": 0, "negative": 0, "neutral": 0, "question": 0, "other": 0}
 
 
 
 
 
 
 
 
 
141
  total_confidence = 0
142
  sentence_results = []
143
 
@@ -151,6 +181,7 @@ def analyze_text(text: str, model_name: str) -> str:
151
  label_info = get_label_info(label)
152
  label_name = label_info["name"]
153
 
 
154
  if label_name in sentiment_counts:
155
  sentiment_counts[label_name] += 1
156
  else:
@@ -224,24 +255,52 @@ def analyze_text(text: str, model_name: str) -> str:
224
 
225
  # Create chart data for summary
226
  chart_items = []
227
- colors = {"positive": "#34d399", "negative": "#f87171", "neutral": "#facc15", "question": "#60a5fa", "other": "#64748b"}
228
- emojis = {"positive": "😊", "negative": "😢", "neutral": "😐", "question": "🤔", "other": "🔍"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
229
 
230
- for sentiment, count in sentiment_counts.items():
231
- if count > 0:
 
 
 
 
 
 
232
  percentage = (count / total_sentences) * 100
233
- chart_items.append(f"""
234
- <div style="display: flex; align-items: center; gap: 12px; padding: 12px; background: rgba(59, 130, 246, 0.1); border-radius: 8px;">
235
- <span style="font-size: 24px;">{emojis.get(sentiment, '🔍')}</span>
236
- <div style="flex: 1;">
237
- <div style="font-weight: 600; color: #f8fafc; text-transform: capitalize;">{sentiment}</div>
238
- <div style="color: #94a3b8; font-size: 14px;">{count} ประโยค ({percentage:.1f}%)</div>
239
- </div>
240
- <div style="width: 60px; height: 6px; background: #334155; border-radius: 3px; overflow: hidden;">
241
- <div style="width: {percentage}%; height: 100%; background: {colors.get(sentiment, '#64748b')}; transition: all 0.3s ease;"></div>
242
- </div>
 
243
  </div>
244
- """)
 
 
 
 
245
 
246
  html_parts.append(f"""
247
  <div style="padding: 24px; background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%);">
@@ -446,9 +505,11 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Base()) as demo:
446
  <span>🗂️</span> คำอธิบายผลลัพธ์
447
  </div>
448
  <div class='legend-row'>
 
449
  <div class='legend-item'><strong>😊 เชิงบวก</strong><br><small>Positive</small></div>
450
- <div class='legend-item'><strong>😢 เชิงลบ</strong><br><small>Negative</small></div>
451
  <div class='legend-item'><strong>😐 เป็นกลาง</strong><br><small>Neutral</small></div>
 
 
452
  <div class='legend-item'><strong>🤔 คำถาม</strong><br><small>Question</small></div>
453
  </div>
454
  </div>
@@ -480,4 +541,5 @@ if __name__ == "__main__":
480
  "docs_url": None,
481
  "redoc_url": None,
482
  }
483
- )
 
 
1
+ นี่คือโค้ด Gradio ของคุณที่ผมได้ตรวจสอบและปรับปรุงให้แล้วครับ มีการแก้ไขข้อผิดพลาดเรื่อง `LABEL_MAPPINGS` ที่ซ้ำกันและเพิ่มคำอธิบายในส่วนของ Legend ให้ครบถ้วนตาม 5 ระดับ Sentiment และ "question" ครับ
2
+
3
+ -----
4
+
5
+ ## สรุปการแก้ไขโค้ด
6
+
7
+ 1. **แก้ไข `LABEL_MAPPINGS` ที่ซ้ำซ้อน:** โค้ดต้นฉบับมี `LABEL_MAPPINGS` ถูกประกาศซ้ำสองครั้ง และส่วนท้ายของ `LABEL_MAPPINGS` ยังมีรายการที่ซ้ำซ้อนและมี `code` ที่ไม่สอดคล้องกับแผน 6 Class (1 question + 5 sentiment levels) ที่เราคุยกันก่อนหน้านี้ ผมได้แก้ไขให้เหลือเพียงชุดเดียวที่ถูกต้องและสอดคล้องกัน
8
+
9
+ 2. **อัปเดต `sentiment_counts`:** ในฟังก์ชัน `analyze_text` ได้เพิ่ม `very negative` และ `very positive` เข้าไปใน `sentiment_counts` เพื่อให้สามารถนับและแสดงผล Sentiment ทั้ง 5 ระดับได้อย่างถูกต้อง
10
+
11
+ 3. **อัปเดต Legend ใน Gradio UI:** ได้เพิ่ม `very positive` และ `very negative` เข้าไปในส่วนของ Legend (คำอธิบายผลลัพธ์) ใน Gradio UI เพื่อให้ผู้ใช้เข้าใจผลลัพธ์ 5 ระดับได้อย่างชัดเจน
12
+
13
+ -----
14
+
15
+ ## โค้ดที่แก้ไขแล้ว
16
+
17
+ ```python
18
  import gradio as gr
19
  from transformers import pipeline
20
  import re
 
57
 
58
  # Enhanced label mapping with modern styling for dark blue theme
59
  LABEL_MAPPINGS = {
60
+ # Mappings สำหรับ LABEL_X (จากโมเดล)
61
  "LABEL_0": {"code": 0, "name": "question", "emoji": "🤔", "color": "#60a5fa", "bg": "rgba(96, 165, 250, 0.2)", "description": "คำถาม"},
62
  "LABEL_1": {"code": 1, "name": "very negative", "emoji": "😡", "color": "#ef4444", "bg": "rgba(239, 68, 68, 0.2)", "description": "เชิงลบมาก"},
63
  "LABEL_2": {"code": 2, "name": "negative", "emoji": "😢", "color": "#f87171", "bg": "rgba(248, 113, 113, 0.2)", "description": "เชิงลบ"},
 
65
  "LABEL_4": {"code": 4, "name": "positive", "emoji": "😊", "color": "#34d399", "bg": "rgba(52, 211, 153, 0.2)", "description": "เชิงบวก"},
66
  "LABEL_5": {"code": 5, "name": "very positive", "emoji": "🤩", "color": "#22c55e", "bg": "rgba(34, 197, 94, 0.2)", "description": "เชิงบวกมาก"},
67
 
68
+ # Mappings สำหรับชื่อเต็ม (ใช้สำหรับแสดงผลหรืออ้างอิง)
69
+ "QUESTION": {"code": 0, "name": "question", "emoji": "🤔", "color": "#60a5fa", "bg": "rgba(96, 165, 250, 0.2)", "description": "คำถาม"},
70
  "VERY_NEGATIVE": {"code": 1, "name": "very negative", "emoji": "😡", "color": "#ef4444", "bg": "rgba(239, 68, 68, 0.2)", "description": "เชิงลบมาก"},
71
  "NEGATIVE": {"code": 2, "name": "negative", "emoji": "😢", "color": "#f87171", "bg": "rgba(248, 113, 113, 0.2)", "description": "เชิงลบ"},
72
  "NEUTRAL": {"code": 3, "name": "neutral", "emoji": "😐", "color": "#facc15", "bg": "rgba(250, 204, 21, 0.2)", "description": "เป็นกลาง"},
73
  "POSITIVE": {"code": 4, "name": "positive", "emoji": "😊", "color": "#34d399", "bg": "rgba(52, 211, 153, 0.2)", "description": "เชิงบวก"},
74
  "VERY_POSITIVE": {"code": 5, "name": "very positive", "emoji": "🤩", "color": "#22c55e", "bg": "rgba(34, 197, 94, 0.2)", "description": "เชิงบวกมาก"},
75
+
76
+ # Mappings สำหรับรหัสตัวเลข (ถ้าจำเป็นต้องแปลงจาก 0, 1, 2, ... เป็นชื่อ)
77
+ "0": {"code": 0, "name": "question", "emoji": "🤔", "color": "#60a5fa", "bg": "rgba(96, 165, 250, 0.2)", "description": "คำถาม"},
78
+ "1": {"code": 1, "name": "very negative", "emoji": "😡", "color": "#ef4444", "bg": "rgba(239, 68, 68, 0.2)", "description": "เชิงลบมาก"},
79
+ "2": {"code": 2, "name": "negative", "emoji": "😢", "color": "#f87171", "bg": "rgba(248, 113, 113, 0.2)", "description": "เชิงลบ"},
80
+ "3": {"code": 3, "name": "neutral", "emoji": "😐", "color": "#facc15", "bg": "rgba(250, 204, 21, 0.2)", "description": "เป็นกลาง"},
81
+ "4": {"code": 4, "name": "positive", "emoji": "😊", "color": "#34d399", "bg": "rgba(52, 211, 153, 0.2)", "description": "เชิงบวก"},
82
+ "5": {"code": 5, "name": "very positive", "emoji": "🤩", "color": "#22c55e", "bg": "rgba(34, 197, 94, 0.2)", "description": "เชิงบวกมาก"},
83
  }
84
 
85
  def get_label_info(label: str) -> Dict:
 
158
  </div>
159
  """]
160
 
161
+ # Updated sentiment_counts to include all 5 sentiment levels plus question
162
+ sentiment_counts = {
163
+ "question": 0,
164
+ "very negative": 0,
165
+ "negative": 0,
166
+ "neutral": 0,
167
+ "positive": 0,
168
+ "very positive": 0,
169
+ "other": 0
170
+ }
171
  total_confidence = 0
172
  sentence_results = []
173
 
 
181
  label_info = get_label_info(label)
182
  label_name = label_info["name"]
183
 
184
+ # Increment count for the corresponding sentiment name
185
  if label_name in sentiment_counts:
186
  sentiment_counts[label_name] += 1
187
  else:
 
255
 
256
  # Create chart data for summary
257
  chart_items = []
258
+ # Ensure colors and emojis include all 6 categories (question + 5 sentiments)
259
+ colors = {
260
+ "question": "#60a5fa",
261
+ "very negative": "#ef4444",
262
+ "negative": "#f87171",
263
+ "neutral": "#facc15",
264
+ "positive": "#34d399",
265
+ "very positive": "#22c55e",
266
+ "other": "#64748b"
267
+ }
268
+ emojis = {
269
+ "question": "🤔",
270
+ "very negative": "😡",
271
+ "negative": "😢",
272
+ "neutral": "😐",
273
+ "positive": "😊",
274
+ "very positive": "🤩",
275
+ "other": "🔍"
276
+ }
277
 
278
+ # Iterate through all possible sentiment types to ensure they are displayed, even if count is 0
279
+ # Or, iterate through sentiment_counts.items() if you only want to display sentiments found in the text
280
+ for sentiment_name, count in sentiment_counts.items():
281
+ if sentiment_name == "other" and count == 0: # Don't show 'other' if no unknown labels
282
+ continue
283
+ if total_sentences == 0:
284
+ percentage = 0
285
+ else:
286
  percentage = (count / total_sentences) * 100
287
+
288
+ # Get description from LABEL_MAPPINGS using the sentiment name
289
+ # We can find it by iterating through LABEL_MAPPINGS values
290
+ description = next((info['description'] for info in LABEL_MAPPINGS.values() if info['name'] == sentiment_name), sentiment_name)
291
+
292
+ chart_items.append(f"""
293
+ <div style="display: flex; align-items: center; gap: 12px; padding: 12px; background: rgba(59, 130, 246, 0.1); border-radius: 8px;">
294
+ <span style="font-size: 24px;">{emojis.get(sentiment_name, '🔍')}</span>
295
+ <div style="flex: 1;">
296
+ <div style="font-weight: 600; color: #f8fafc; text-transform: capitalize;">{description}</div>
297
+ <div style="color: #94a3b8; font-size: 14px;">{count} ประโยค ({percentage:.1f}%)</div>
298
  </div>
299
+ <div style="width: 60px; height: 6px; background: #334155; border-radius: 3px; overflow: hidden;">
300
+ <div style="width: {percentage}%; height: 100%; background: {colors.get(sentiment_name, '#64748b')}; transition: all 0.3s ease;"></div>
301
+ </div>
302
+ </div>
303
+ """)
304
 
305
  html_parts.append(f"""
306
  <div style="padding: 24px; background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%);">
 
505
  <span>🗂️</span> คำอธิบายผลลัพธ์
506
  </div>
507
  <div class='legend-row'>
508
+ <div class='legend-item'><strong>🤩 เชิงบวกมาก</strong><br><small>Very Positive</small></div>
509
  <div class='legend-item'><strong>😊 เชิงบวก</strong><br><small>Positive</small></div>
 
510
  <div class='legend-item'><strong>😐 เป็นกลาง</strong><br><small>Neutral</small></div>
511
+ <div class='legend-item'><strong>😢 เชิงลบ</strong><br><small>Negative</small></div>
512
+ <div class='legend-item'><strong>😡 เชิงลบมาก</strong><br><small>Very Negative</small></div>
513
  <div class='legend-item'><strong>🤔 คำถาม</strong><br><small>Question</small></div>
514
  </div>
515
  </div>
 
541
  "docs_url": None,
542
  "redoc_url": None,
543
  }
544
+ )
545
+ ```