File size: 3,246 Bytes
32f5fdd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e9b5389
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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()