Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import pandas as pd | |
| import matplotlib.pyplot as plt | |
| from datetime import datetime | |
| import os | |
| from transformers import pipeline | |
| # CSV 檔案位置 | |
| DATA_FILE = "/tmp/stress_data.csv" | |
| # 初始化 transformers 分析 pipeline | |
| # 這裡使用假設的中文情緒分析模型 | |
| # 如果你有心理壓力專用模型,替換 model="你的模型名稱" | |
| classifier = pipeline( | |
| "text-classification", | |
| model="uer/roberta-base-finetuned-chinanews-chinese", # 中文分類範例 | |
| device=-1 # CPU;若有 GPU,可設成 0 | |
| ) | |
| # 分析函數 | |
| def analyze(text): | |
| # 用模型預測 | |
| pred = classifier(text)[0] # 回傳 dict: {'label': 'POSITIVE', 'score': 0.95} | |
| label = pred['label'] | |
| score = pred['score'] | |
| # 假設我們把正面 -> 壓力低,負面 -> 壓力高 | |
| if label in ["POSITIVE", "positive"]: | |
| stress_score = int((1 - score) * 100) # 正面越高,壓力越低 | |
| else: | |
| stress_score = int(score * 100) # 負面越高,壓力越高 | |
| result_text = f"文字分析結果:情緒標籤 {label},壓力指數 {stress_score}" | |
| # 儲存資料 | |
| save_data(text, stress_score) | |
| # 生成趨勢圖 | |
| fig = plot_trend() | |
| return result_text, fig | |
| # 以下函數維持不變 | |
| def save_data(text, score): | |
| now = datetime.now() | |
| df = pd.DataFrame([[now, text, score]], columns=["timestamp", "text", "stress"]) | |
| if os.path.exists(DATA_FILE): | |
| df.to_csv(DATA_FILE, mode="a", header=False, index=False) | |
| else: | |
| df.to_csv(DATA_FILE, index=False) | |
| def plot_trend(): | |
| fig, ax = plt.subplots(figsize=(6,3)) | |
| if not os.path.exists(DATA_FILE): | |
| ax.text(0.5, 0.5, "暫無資料", ha='center', va='center') | |
| ax.set_axis_off() | |
| return fig | |
| df = pd.read_csv(DATA_FILE) | |
| df['timestamp'] = pd.to_datetime(df['timestamp']) | |
| ax.plot(df['timestamp'], df['stress'], marker='o', linestyle='-') | |
| ax.set_title("心理壓力趨勢") | |
| ax.set_xlabel("時間") | |
| ax.set_ylabel("壓力指數") | |
| ax.grid(True) | |
| plt.xticks(rotation=30) | |
| return fig | |
| def reset_data(): | |
| if os.path.exists(DATA_FILE): | |
| os.remove(DATA_FILE) | |
| fig, ax = plt.subplots() | |
| ax.text(0.5, 0.5, "資料已重置", ha='center', va='center') | |
| ax.set_axis_off() | |
| return "資料已重置", fig | |
| # Gradio 介面維持不變 | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# 中文心理壓力分析器") | |
| gr.Markdown("""這是一款結合 BERT 深度學習模型與關鍵詞分析的心理壓力評估工具。 | |
| 輸入中文文字,它就能分析文字隱含的心理壓力,並生成壓力分數與趨勢圖。""") | |
| with gr.Row(): | |
| text_input = gr.Textbox( | |
| label="和我聊聊吧", | |
| placeholder="說說今天的心情或煩惱...", | |
| lines=5 | |
| ) | |
| with gr.Row(): | |
| submit_btn = gr.Button("分析") | |
| reset_btn = gr.Button("重置資料") | |
| result_text = gr.Textbox(label="分析結果") | |
| trend_plot = gr.Plot(label="心理壓力趨勢") | |
| submit_btn.click(analyze, inputs=text_input, outputs=[result_text, trend_plot]) | |
| reset_btn.click(reset_data, inputs=None, outputs=[result_text, trend_plot]) | |
| demo.launch() |