fadimari commited on
Commit
13e1692
·
verified ·
1 Parent(s): 2c70247

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -30
app.py CHANGED
@@ -2,6 +2,7 @@ import gradio as gr
2
  from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
3
  import torch
4
  import time
 
5
 
6
  print("\n⏳ جاري تحميل نموذج Fine-Tashkeel (الدقيق)...")
7
 
@@ -19,7 +20,7 @@ LOADING_HTML = """
19
  <div style="text-align: center; padding: 2rem;">
20
  <div style="display: inline-block; animation: spin 1s linear infinite; font-size: 2.5rem;">⏳</div>
21
  <div style="font-size: 1.3rem; color: #667eea; margin-top: 1rem; font-weight: bold;">جاري العمل على التشكيل...</div>
22
- <div style="color: #999; margin-top: 0.5rem;">هذا النموذج دقيق وبطيء (20-30 ثانية)، يرجى الانتظار</div>
23
  </div>
24
  <style>
25
  @keyframes spin {
@@ -47,6 +48,7 @@ def count_diacritics(text):
47
  ]
48
  return sum(text.count(d) for d in diacritics)
49
 
 
50
  def run_model(text):
51
  if not text or not text.strip():
52
  error_msg = "❌ يرجى إدخال نص"
@@ -56,42 +58,53 @@ def run_model(text):
56
  try:
57
  start = time.time()
58
 
59
- # 1. تنظيف النص الأصلي
60
  full_clean_text = remove_diacritics(text)
61
 
62
- # 2. تقسيم النص إلى فقرات بناءً على الأسطر الجديدة
63
- # هذا يضمن أننا لا نرسل نصاً طويلاً جداً دفعة واحدة
64
  lines = full_clean_text.split('\n')
65
  final_result_parts = []
66
 
67
- # 3. معالجة كل سطر لوحده
68
  for line in lines:
69
- if not line.strip():
70
- final_result_parts.append(line) # الحفاظ على الأسطر الفارغة
 
71
  continue
72
-
73
- # تجهيز المدخلات للسطر الحالي
74
- inputs = tokenizer(
75
- line,
76
- return_tensors="pt",
77
- max_length=1024,
78
- truncation=True, # سيقطع السطر فقط إذا كان السطر الواحد أطول من 1024 توكن (نادر جداً)
79
- padding="max_length"
80
- )
81
 
82
- with torch.no_grad():
83
- outputs = model.generate(
84
- **inputs,
 
 
 
 
85
  max_length=1024,
86
- num_beams=1,
87
- early_stopping=True
88
  )
 
 
 
 
 
 
 
 
 
 
 
89
 
90
- # فك التشفير للسطر الحالي
91
- chunk_result = tokenizer.decode(outputs[0], skip_special_tokens=True)
92
- final_result_parts.append(chunk_result)
93
 
94
- # 4. تجميع النتائج مرة أخرى
95
  final_result = '\n'.join(final_result_parts)
96
 
97
  elapsed = time.time() - start
@@ -183,11 +196,6 @@ def generate_final_html(clean_text, result_text, stats, show_comparison, highlig
183
  <div style="font-size: 1.8rem; font-weight: bold; color: #667eea;">{stats.get('diacritics_count', 0)}</div>
184
  <div style="color: #666; font-size: 0.85rem; margin-top: 0.5rem;">علامة</div>
185
  </div>
186
- <div style="background: white; padding: 1.5rem; border-radius: 12px; text-align: center; box-shadow: 0 4px 15px rgba(102, 126, 234, 0.2); border-left: 4px solid #667eea;">
187
- <div style="font-size: 2.5rem;">🚀</div>
188
- <div style="font-size: 1.8rem; font-weight: bold; color: #667eea;">{stats.get('speed', 0)}</div>
189
- <div style="color: #666; font-size: 0.85rem; margin-top: 0.5rem;">كلمة/ثانية</div>
190
- </div>
191
  <div style="background: white; padding: 1.5rem; border-radius: 12px; text-align: center; box-shadow: 0 4px 15px rgba(102, 126, 234, 0.2); border-left: 4px solid #667eea;">
192
  <div style="font-size: 2.5rem;">🎯</div>
193
  <div style="font-size: 1.8rem; font-weight: bold; color: #667eea;">98%+</div>
 
2
  from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
3
  import torch
4
  import time
5
+ import textwrap # <--- مكتبة مهمة لتقسيم النص
6
 
7
  print("\n⏳ جاري تحميل نموذج Fine-Tashkeel (الدقيق)...")
8
 
 
20
  <div style="text-align: center; padding: 2rem;">
21
  <div style="display: inline-block; animation: spin 1s linear infinite; font-size: 2.5rem;">⏳</div>
22
  <div style="font-size: 1.3rem; color: #667eea; margin-top: 1rem; font-weight: bold;">جاري العمل على التشكيل...</div>
23
+ <div style="color: #999; margin-top: 0.5rem;">هذا النموذج دقيق وبطيء، نقوم بمعالجة النص جزءاً بجزء...</div>
24
  </div>
25
  <style>
26
  @keyframes spin {
 
48
  ]
49
  return sum(text.count(d) for d in diacritics)
50
 
51
+ # --- دالة التشكيل المعدلة (الحل هنا) ---
52
  def run_model(text):
53
  if not text or not text.strip():
54
  error_msg = "❌ يرجى إدخال نص"
 
58
  try:
59
  start = time.time()
60
 
61
+ # 1. تنظيف النص
62
  full_clean_text = remove_diacritics(text)
63
 
64
+ # 2. تقسيم النص الأصلي حسب الأسطر للحفاظ على الهيكلية
 
65
  lines = full_clean_text.split('\n')
66
  final_result_parts = []
67
 
68
+ # 3. معالجة كل سطر
69
  for line in lines:
70
+ line = line.strip()
71
+ if not line:
72
+ final_result_parts.append("") # سطر فارغ
73
  continue
74
+
75
+ # --- التعديل الجوهري: تقسيم السطر الطويل إلى قطع صغيرة ---
76
+ # نقسم السطر إلى أجزاء طولها 600 حرف تقريباً
77
+ # هذا يضمن أن النموذج يملك مساحة كافية لإضافة الحركات
78
+ chunks = textwrap.wrap(line, width=600, break_long_words=False, replace_whitespace=False)
79
+
80
+ line_result_parts = []
 
 
81
 
82
+ for chunk in chunks:
83
+ if not chunk.strip():
84
+ continue
85
+
86
+ inputs = tokenizer(
87
+ chunk,
88
+ return_tensors="pt",
89
  max_length=1024,
90
+ truncation=True
 
91
  )
92
+
93
+ with torch.no_grad():
94
+ outputs = model.generate(
95
+ **inputs,
96
+ max_length=1024, # نعطيه مساحة كاملة
97
+ num_beams=1, # سرعة أكبر
98
+ early_stopping=False # لا تتوقف حتى تنتهي تماماً
99
+ )
100
+
101
+ chunk_result = tokenizer.decode(outputs[0], skip_special_tokens=True)
102
+ line_result_parts.append(chunk_result)
103
 
104
+ # تجميع أجزاء السطر الواحد
105
+ final_result_parts.append(" ".join(line_result_parts))
 
106
 
107
+ # 4. تجميع النص النهائي
108
  final_result = '\n'.join(final_result_parts)
109
 
110
  elapsed = time.time() - start
 
196
  <div style="font-size: 1.8rem; font-weight: bold; color: #667eea;">{stats.get('diacritics_count', 0)}</div>
197
  <div style="color: #666; font-size: 0.85rem; margin-top: 0.5rem;">علامة</div>
198
  </div>
 
 
 
 
 
199
  <div style="background: white; padding: 1.5rem; border-radius: 12px; text-align: center; box-shadow: 0 4px 15px rgba(102, 126, 234, 0.2); border-left: 4px solid #667eea;">
200
  <div style="font-size: 2.5rem;">🎯</div>
201
  <div style="font-size: 1.8rem; font-weight: bold; color: #667eea;">98%+</div>