File size: 3,881 Bytes
ba88116
 
 
fc1db8d
 
 
 
 
 
 
 
 
 
 
ba88116
 
fc1db8d
ba88116
 
fc1db8d
 
 
 
 
ba88116
fc1db8d
 
 
 
 
 
 
ba88116
fc1db8d
ba88116
fc1db8d
ba88116
 
 
 
 
fc1db8d
ba88116
 
 
fc1db8d
41dd28e
fc1db8d
ba88116
fc1db8d
ba88116
 
fc1db8d
ba88116
fc1db8d
 
41dd28e
 
ba88116
 
 
fc1db8d
ba88116
 
 
 
 
 
 
fc1db8d
41dd28e
ba88116
fc1db8d
ba88116
fc1db8d
41dd28e
 
fc1db8d
 
 
 
ba88116
 
fc1db8d
 
41dd28e
 
ba88116
 
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
import os
import subprocess
import sys
import gradio as gr

# ---------------------------------------------------------
# إعداد البيئة (هام جداً لتجنب مشاكل الصلاحيات في Hugging Face)
# ---------------------------------------------------------
# نحدد مساراً محلياً لتخزين البيانات بدلاً من مجلد النظام المحمي
os.environ["CAMELTOOLS_DATA"] = os.path.join(os.getcwd(), "camel_data")

# التأكد من إنشاء المجلد
if not os.path.exists(os.environ["CAMELTOOLS_DATA"]):
    os.makedirs(os.environ["CAMELTOOLS_DATA"])

# ---------------------------------------------------------
# خطوة 1: تثبيت البيانات مع تجاوز طلب الموافقة (Auto-Confirm)
# ---------------------------------------------------------
def install_camel_data():
    print("⏳ جاري تحميل بيانات Camel Tools (قد يستغرق 2-3 دقائق)...")
    
    # اسم الحزمة المطلوبة لنموذج MLE
    package_name = "disambig-mle-calima-msa-r13"
    
    try:
        # نستخدم الأمر 'yes' ونمرره لأمر التحميل للموافقة التلقائية على أي سؤال
        # هذا الأمر يعادل ضغط 'y' ثم Enter
        cmd = f"yes | camel_data -i {package_name}"
        subprocess.run(cmd, shell=True, check=True)
        print("✅ تم تحميل البيانات بنجاح.")
    except subprocess.CalledProcessError as e:
        print(f"❌ فشل التحميل: {e}")
    except Exception as e:
        print(f"❌ حدث خطأ غير متوقع: {e}")

# استدعاء دالة التحميل
install_camel_data()

# ---------------------------------------------------------
# خطوة 2: استدعاء المكتبات وبناء النموذج
# ---------------------------------------------------------
# نقوم بالاستيراد هنا بعد ضمان وجود البيانات
from camel_tools.disambig.mle import MLEDisambiguator
from camel_tools.tagger.default import DefaultTagger

print("⏳ جاري تحميل نموذج التشكيل في الذاكرة...")

tagger = None
try:
    # تحميل الموديل المحدد
    mle = MLEDisambiguator.pretrained('calima-msa-r13')
    tagger = DefaultTagger(mle, 'diac')
    print("✅ النموذج جاهز للعمل!")
except Exception as e:
    print(f"❌ خطأ قاتل في تحميل الموديل: {e}")
    # لن نوقف البرنامج حتى تعمل الواجهة وتظهر الخطأ للمستخدم

def diacritize_text(text):
    if not text:
        return ""
    if tagger is None:
        return "خطأ: فشل تحميل ملفات اللغة (Camel Tools Data). راجع السجلات (Logs)."
    
    try:
        words = text.split()
        diacritized_words = tagger.tag(words)
        result = ' '.join(diacritized_words)
        return result
    except Exception as e:
        return f"Error processing text: {str(e)}"

# ---------------------------------------------------------
# خطوة 3: واجهة المستخدم (متوافقة مع Gradio الجديد)
# ---------------------------------------------------------
# تم إزالة allow_flagging لأنه يسبب مشاكل في النسخ الجديدة
iface = gr.Interface(
    fn=diacritize_text,
    inputs=gr.Textbox(lines=3, placeholder="اكتب النص هنا...", label="النص العربي", rtl=True),
    outputs=gr.Textbox(label="النص المشكّل", rtl=True),
    title="Camel Tools Diacritizer 🐫",
    description="API للتشكيل باستخدام نموذج MLE Disambiguator (calima-msa-r13).",
    examples=[
        ["ذهبت الى المدرسة وشربت الماء"],
        ["القراءة غذاء الروح والعقل"]
    ]
)

if __name__ == "__main__":
    iface.launch()