File size: 6,736 Bytes
e1dab92 fedcda4 e1dab92 ae5d016 3b0b07e e1dab92 ae5d016 e1dab92 ae5d016 3b0b07e e1dab92 dabdef3 3b0b07e e1dab92 3b0b07e ae5d016 e1dab92 ae5d016 e1dab92 3b0b07e e1dab92 3b0b07e dabdef3 e1dab92 ae5d016 3b0b07e fb53d34 dabdef3 e1dab92 ae5d016 b99d28d fb53d34 ae5d016 3b0b07e dabdef3 3b0b07e ae5d016 3b0b07e dabdef3 3b0b07e dabdef3 ae5d016 dabdef3 ae5d016 dabdef3 ae5d016 dabdef3 ae5d016 dabdef3 ae5d016 dabdef3 ae5d016 dabdef3 ae5d016 3b0b07e ae5d016 e1dab92 ae5d016 e1dab92 ae5d016 dabdef3 3b0b07e dabdef3 3b0b07e dabdef3 3b0b07e ae5d016 e1dab92 dabdef3 ae5d016 dabdef3 e1dab92 3b0b07e dabdef3 e1dab92 3b0b07e | 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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | 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
) |