OmidSakaki's picture
Update app.py
b99d28d verified
import gradio as gr
from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification
import requests
import torch
# مدل شما (merged version که push کردی)
MODEL_REPO = "OmidSakaki/mental-health-deberta"
print("در حال بارگذاری مدل و توکنایزر...")
tokenizer = AutoTokenizer.from_pretrained(MODEL_REPO)
model = AutoModelForSequenceClassification.from_pretrained(MODEL_REPO)
# ساخت pipeline برای طبقه‌بندی
classifier = pipeline(
"text-classification",
model=model,
tokenizer=tokenizer,
device=0 if torch.cuda.is_available() else -1
)
# API ترجمه فارسی به انگلیسی (MyMemory - رایگان)
TRANSLATE_API_URL = "https://api.mymemory.translated.net/get"
def translate_to_english(text_fa: str) -> str:
if not text_fa or not text_fa.strip():
return "متن وارد نشده است"
params = {
"q": text_fa,
"langpair": "fa|en"
}
try:
response = requests.get(TRANSLATE_API_URL, params=params, timeout=12)
response.raise_for_status()
data = response.json()
translated = data.get("responseData", {}).get("translatedText", "")
return translated if translated else "ترجمه انجام نشد"
except Exception as e:
return f"خطا در ترجمه: {str(e)}"
def classify_mental_health(text_fa: str) -> str:
if not text_fa or not text_fa.strip():
return "لطفاً متن فارسی وارد کنید."
# ترجمه به انگلیسی
text_en = translate_to_english(text_fa)
# خروجی پایه (در صورت خطا استفاده می‌شود)
result_text = (
f"متن ترجمه‌شده به انگلیسی:\n{text_en}\n\n"
)
try:
# طبقه‌بندی
result = classifier(text_en, truncation=True, max_length=512)[0]
label_en = result['label']
score = result['score'] * 100
label_map = {
'Normal': 'نرمال / عادی',
'Depression': 'افسردگی',
'Anxiety': 'اضطراب',
'Suicidal': 'افکار خودکشی'
}
label_fa = label_map.get(label_en, label_en)
# توصیه حمایتی
advice = ""
if label_en == 'Depression':
advice = (
"احساس افسردگی سنگین است، اما شما تنها نیستید و کمک وجود دارد.\n"
"امروز با یک فرد مورد اعتماد صحبت کنید.\n"
"فعالیت‌های کوچک لذت‌بخش را امتحان کنید.\n"
"خواب و تغذیه منظم را جدی بگیرید.\n"
"حتماً به روانشناس یا روانپزشک مراجعه کنید – درمان مؤثر است.\n"
"شما ارزشمند هستید و شرایط می‌تواند بهتر شود."
)
elif label_en == 'Anxiety':
advice = (
"اضطراب زیاد آزاردهنده است، اما قابل کنترل است.\n"
"نفس عمیق بکشید (۴ ثانیه دم، ۴ نگه، ۶ بازدم).\n"
"به اطرافتان توجه کنید (۵ چیز ببینید، ۴ چیز لمس کنید).\n"
"از محرک‌ها (کافئین، اخبار) دوری کنید.\n"
"با کسی صحبت کنید.\n"
"این احساس می‌گذرد و شما قوی هستید."
)
elif label_en == 'Suicidal':
advice = (
"اگر افکار خودکشی دارید، لطفاً همین حالا کمک بگیرید.\n"
"فوراً با ۱۲۳ (اورژانس اجتماعی) یا ۱۴۸۰ (مشاوره بهزیستی) تماس بگیرید.\n"
"وسایل خطرناک را دور کنید.\n"
"با یک فرد نزدیک صحبت کنید.\n"
"به مرکز درمانی بروید.\n"
"زندگی شما ارزشمند است – کمک وجود دارد."
)
# خروجی موفق
#result_text = f"متن ترجمه‌شده به انگلیسی:\n{text_en}\n\n"
result_text += f"وضعیت تشخیص داده شده: **{label_fa}**\n"
result_text += f"اطمینان مدل: {score:.1f}%\n\n"
if advice:
result_text += "**توصیه حمایتی کوتاه:**\n" + advice + "\n\n"
result_text += (
"⚠️ **توجه مهم:**\n"
"این فقط یک تحلیل اولیه توسط هوش مصنوعی است و جایگزین نظر متخصص روانشناس یا روانپزشک نمی‌شود.\n"
"در موارد بحران یا احساس خطر فوراً با خطوط حمایتی (۱۲۳ یا ۱۴۸۰ در ایران) تماس بگیرید یا به نزدیک‌ترین مرکز درمانی مراجعه کنید."
)
except Exception as e:
result_text += f"\n\nجزئیات خطا: {str(e)}"
return result_text
# رابط کاربری Gradio
demo = gr.Interface(
fn=classify_mental_health,
inputs=gr.Textbox(
label="متن فارسی خود را وارد کنید",
placeholder="مثال: احساس می‌کنم دیگه هیچ امیدی ندارم...",
lines=7,
max_lines=15
),
outputs=gr.Textbox(
label="نتیجه تحلیل و توصیه",
lines=12
),
title="تحلیل وضعیت سلامت روان از روی متن فارسی",
description=(
"متن فارسی بنویسید → توسط مدل تحلیل می‌شود → "
"نتیجه و توصیه حمایتی به فارسی نمایش داده می‌شود.\n\n"
"کلاس‌های تشخیص: نرمال، افسردگی، اضطراب، افکار خودکشی\n\n"
"این ابزار فقط جنبه آزمایشی و آموزشی دارد و جایگزین مشاوره حرفه‌ای نیست.\n"
"در موارد بحران فوراً با ۱۲۳ یا ۱۴۸۰ تماس بگیرید."
),
examples=[
["مدام نگرانم و نمی‌تونم آرام باشم"],
["دیگه هیچی برام مهم نیست، خسته شدم"],
["احساس می‌کنم زندگی ارزش ادامه دادن نداره"]
],
cache_examples=False,
theme=gr.themes.Soft(primary_hue="blue")
)
if __name__ == "__main__":
demo.launch(
server_name="0.0.0.0",
server_port=7860,
debug=False
)