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
    )