ErlangshenModel / app.py
xuanwsx's picture
Create app.py
8ea04ff verified
Raw
History Blame Contribute Delete
3.63 kB
import os
from datetime import datetime
import pandas as pd
import matplotlib.pyplot as plt
import gradio as gr
from transformers import pipeline
DATA_FILE = "stress_data.csv"
if not os.path.exists(DATA_FILE):
df = pd.DataFrame(columns=["date","score"])
df.to_csv(DATA_FILE,index=False)
emotion_model = pipeline(
"sentiment-analysis",
model="IDEA-CCNL/Erlangshen-Roberta-110M-Sentiment"
)
stress_keywords = [
"焦慮","壓力","煩","崩潰","絕望","害怕","痛苦",
"失眠","難過","憂鬱","無助","失落","疲倦"
]
crisis_keywords = [
"不想活","活不下去","想死","絕望","沒有意義"
]
violence_keywords = [
"放火","殺人","報復","傷害"
]
def stress_level(score):
if score < 30:
return "低壓力"
elif score < 60:
return "中等壓力"
elif score < 80:
return "高壓力"
else:
return "非常高壓力"
def detect_source(text):
if any(w in text for w in ["考試","成績","作業","報告"]):
return "學業壓力"
if any(w in text for w in ["朋友","同學","關係"]):
return "人際壓力"
if any(w in text for w in ["未來","人生","迷茫"]):
return "未來焦慮"
if any(w in text for w in ["失眠","睡不著"]):
return "睡眠壓力"
return "一般壓力"
advice = {
"學業壓力":{
"relief":"使用番茄鐘學習法,每40分鐘休息10分鐘",
"food":"增加B群食物:雞蛋、全穀類",
"life":"建立讀書計畫"
},
"人際壓力":{
"relief":"與信任的人聊聊",
"food":"Omega-3食物:魚類、堅果",
"life":"安排放鬆時間"
},
"未來焦慮":{
"relief":"寫下短期目標",
"food":"富含鎂食物:香蕉、菠菜",
"life":"每天運動30分鐘"
},
"睡眠壓力":{
"relief":"睡前冥想或深呼吸",
"food":"避免咖啡因",
"life":"睡前一小時不要滑手機"
},
"一般壓力":{
"relief":"散步或慢跑",
"food":"均衡飲食",
"life":"保持規律作息"
}
}
def analyze(text):
result = emotion_model(text)[0]
if result["label"] == "negative":
ai_score = result["score"] * 100
else:
ai_score = (1-result["score"]) * 40
kw_score = 0
for w in stress_keywords:
if w in text:
kw_score += 8
for w in crisis_keywords:
if w in text:
kw_score += 40
for w in violence_keywords:
if w in text:
kw_score += 30
total_score = min(ai_score*0.7 + kw_score*0.3 ,100)
level = stress_level(total_score)
source = detect_source(text)
adv = advice[source]
df = pd.read_csv(DATA_FILE)
new = pd.DataFrame({
"date":[datetime.now().strftime("%Y-%m-%d %H:%M")],
"score":[total_score]
})
df = pd.concat([df,new],ignore_index=True)
df.to_csv(DATA_FILE,index=False)
fig, ax = plt.subplots()
df["date"] = pd.to_datetime(df["date"])
ax.plot(df["date"],df["score"],marker="o")
ax.set_title("Stress Trend")
fig.autofmt_xdate()
avg = df["score"].mean()
dashboard = f"""
目前壓力:{total_score:.1f}
平均壓力:{avg:.1f}
"""
result_text = f"""
壓力分數:{total_score:.1f}
壓力等級:{level}
壓力來源:{source}
減壓方式:{adv['relief']}
飲食建議:{adv['food']}
生活建議:{adv['life']}
"""
return result_text,dashboard,fig
interface = gr.Interface(
fn=analyze,
inputs=gr.Textbox(lines=4,label="輸入你的心情"),
outputs=[
gr.Textbox(label="分析結果"),
gr.Textbox(label="壓力儀表板"),
gr.Plot(label="壓力趨勢")
],
title="AI心理壓力分析系統"
)
interface.launch()