Dusit-P commited on
Commit
3b6a7f7
·
verified ·
1 Parent(s): c968c6a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +54 -21
app.py CHANGED
@@ -246,6 +246,13 @@ def predict_many(text_block: str, model_choice: str):
246
  raise
247
 
248
  def predict_csv(file_obj, model_choice: str, review_col_override: str = "", shop_col_override: str = ""):
 
 
 
 
 
 
 
249
  try:
250
  if file_obj is None:
251
  return pd.DataFrame(), None, go.Figure(), go.Figure(), go.Figure(), pd.DataFrame(), "กรุณาอัปโหลดไฟล์ CSV"
@@ -260,40 +267,66 @@ def predict_csv(file_obj, model_choice: str, review_col_override: str = "", shop
260
  if rev_col not in df.columns:
261
  raise ValueError(f"ไม่พบคอลัมน์รีวิว '{rev_col}' ใน CSV (columns = {list(df.columns)})")
262
 
263
- # === กรองแถวที่ใช้ได้จริง ===
264
  reviews_norm = df[rev_col].apply(_norm_text)
265
- mask_use = reviews_norm.apply(_is_substantive_text)
266
- skipped = int((~mask_use).sum())
267
-
268
- used_df = df.loc[mask_use].copy()
269
- if used_df.empty:
270
- empty = pd.DataFrame(columns=["review","negative(%)","positive(%)","label"])
271
- return empty, None, go.Figure(), go.Figure(), go.Figure(), pd.DataFrame(), "ไม่พบรีวิวที่เป็นข้อความ"
272
-
273
- results = _predict_batch(used_df[rev_col].astype(str).tolist(), model_name)
274
- out = pd.DataFrame(results, columns=["review","negative(%)","positive(%)","label"])
275
-
276
- if shop_col and shop_col in used_df.columns:
277
- out.insert(0, "shop", used_df[shop_col].astype(str).fillna(""))
278
-
279
- # ไฟล์ผลลัพธ์สำหรับดาวน์โหลด
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
280
  tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".csv")
281
  out.to_csv(tmp.name, index=False, encoding="utf-8-sig")
282
 
283
- # กราฟ/สรุปรวม
284
- fig_bar, fig_pie, info_md = _make_figures(out)
285
- # กราฟ/ตารางต่อร้าน (ถ้ามี shop)
286
- fig_shop, tbl_shop = _shop_summary(out)
 
 
 
 
 
 
287
 
288
  # แนบข้อความบอกคอลัมน์ที่ใช้ + จำนวนแถวที่ถูกข้าม
289
  info_md = (
290
  f"{info_md} \n"
291
  f"ใช้คอลัมน์รีวิว: {rev_col}"
292
- + (f" | คอลัมน์ร้าน: {shop_col}" if ("shop" in out.columns) else " | ไม่มีคอลัมน์ร้าน")
293
  + f" \n- Skipped (empty/non-text): {skipped}"
294
  )
295
 
296
  return out, tmp.name, fig_bar, fig_pie, fig_shop, tbl_shop, info_md
 
297
  except Exception as e:
298
  print("ERROR in predict_csv:", repr(e))
299
  traceback.print_exc()
 
246
  raise
247
 
248
  def predict_csv(file_obj, model_choice: str, review_col_override: str = "", shop_col_override: str = ""):
249
+ """
250
+ พฤติกรรม:
251
+ - ไม่ตัดแถวทิ้ง: แถว invalid ยังอยู่ เรียงตามไฟล์เดิม
252
+ - review ของแถว invalid = NA, ไม่คำนวณผลลัพธ์
253
+ - shop คงค่าจากไฟล์เดิม ไม่แปลงเป็นสตริง
254
+ - กราฟ/สรุป คำนวณจากเฉพาะแถว valid
255
+ """
256
  try:
257
  if file_obj is None:
258
  return pd.DataFrame(), None, go.Figure(), go.Figure(), go.Figure(), pd.DataFrame(), "กรุณาอัปโหลดไฟล์ CSV"
 
267
  if rev_col not in df.columns:
268
  raise ValueError(f"ไม่พบคอลัมน์รีวิว '{rev_col}' ใน CSV (columns = {list(df.columns)})")
269
 
270
+ # === เตรียมรีวิวและมาสก์แถวที่ 'มีเนื้อหา' เท่านั้น ===
271
  reviews_norm = df[rev_col].apply(_norm_text)
272
+ mask_valid = reviews_norm.apply(_is_substantive_text)
273
+ idx_valid = df.index[mask_valid].tolist()
274
+ skipped = int((~mask_valid).sum())
275
+
276
+ # === พยากรณ์เฉพาะแถวที่ valid ===
277
+ results = []
278
+ if len(idx_valid) > 0:
279
+ texts_valid = reviews_norm.loc[idx_valid].tolist()
280
+ results = _predict_batch(texts_valid, model_name) # list[dict] ตามลำดับ idx_valid
281
+
282
+ # === สร้าง DataFrame ผลลัพธ์ "ครบทุกแถว" ตามลำดับเดิม ===
283
+ out = pd.DataFrame(index=df.index, columns=["review","negative(%)","positive(%)","label"])
284
+
285
+ # review: valid → normalized text, invalid → NA
286
+ out.loc[idx_valid, "review"] = reviews_norm.loc[idx_valid].values
287
+ out.loc[~mask_valid, "review"] = pd.NA
288
+
289
+ # เติมผลพยากรณ์กลับตาม index เดิมสำหรับแถว valid
290
+ for i, idx in enumerate(idx_valid):
291
+ p = results[i]
292
+ out.at[idx, "negative(%)"] = p["negative(%)"]
293
+ out.at[idx, "positive(%)"] = p["positive(%)"]
294
+ out.at[idx, "label"] = p["label"]
295
+
296
+ # แทรกคอลัมน์ shop ด้านหน้า (คงค่าตามต้นฉบับโดยไม่ .astype(str))
297
+ if shop_col and shop_col in df.columns:
298
+ out.insert(0, "shop", df[shop_col])
299
+ else:
300
+ out.insert(0, "shop", pd.Series([pd.NA]*len(out), index=out.index))
301
+
302
+ # === เตรียมข้อมูล "เฉพาะแถวที่ valid" ไว้ทำกราฟ/สรุป ===
303
+ out_valid = out.loc[idx_valid].copy()
304
+
305
+ # ไฟล์ผลลัพธ์สำหรับดาวน์โหลด → ครบทุกแถว
306
  tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".csv")
307
  out.to_csv(tmp.name, index=False, encoding="utf-8-sig")
308
 
309
+ if out_valid.empty:
310
+ empty_fig = go.Figure()
311
+ info_md = "ไม่พบรีวิวที่เป็นข้อความ\n- Skipped (empty/non-text): {}".format(skipped)
312
+ empty_tbl = pd.DataFrame(columns=["shop","total","positive","negative","positive_rate(%)","negative_rate(%)"])
313
+ return out, tmp.name, empty_fig, empty_fig, empty_fig, empty_tbl, info_md
314
+
315
+ # กราฟ/สรุปรวม (จากแถวที่ valid เท่านั้น)
316
+ fig_bar, fig_pie, info_md = _make_figures(out_valid)
317
+ # กราฟ/ตารางต่อร้าน (ใช้เฉพาะ valid)
318
+ fig_shop, tbl_shop = _shop_summary(out_valid)
319
 
320
  # แนบข้อความบอกคอลัมน์ที่ใช้ + จำนวนแถวที่ถูกข้าม
321
  info_md = (
322
  f"{info_md} \n"
323
  f"ใช้คอลัมน์รีวิว: {rev_col}"
324
+ + (f" | คอลัมน์ร้าน: {shop_col}" if shop_col and (shop_col in df.columns) else " | ไม่มีคอลัมน์ร้าน")
325
  + f" \n- Skipped (empty/non-text): {skipped}"
326
  )
327
 
328
  return out, tmp.name, fig_bar, fig_pie, fig_shop, tbl_shop, info_md
329
+
330
  except Exception as e:
331
  print("ERROR in predict_csv:", repr(e))
332
  traceback.print_exc()