Azoz-7 commited on
Commit
49e0fea
·
verified ·
1 Parent(s): d964e2a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +58 -91
app.py CHANGED
@@ -1,48 +1,35 @@
1
  import re
 
2
 
 
 
 
3
  def transform_text(input_text):
4
  """
5
  تقوم هذه الدالة بتطبيق مجموعة من القواعد على النص المدخل
6
  وتعيد النص المصحّح/المعدّل.
7
  """
8
 
9
- # -------------------------------------
10
- # 1) إضافة علامة # بعد بعض الكلمات العامية المحددة:
11
- # ايش/ويش/ليش/عشان/علشان/لسى/يالله/والله/يلا/يااه/اووه/همن/ثمن
12
- # -------------------------------------
13
  pattern_hash = r"\b(ايش|إيش|ويش|ليش|عشان|علشان|لسى|يالله|والله|يلا|يااه|اووه|همن|ثمن)\b"
14
  input_text = re.sub(pattern_hash, r"\1#", input_text, flags=re.IGNORECASE)
15
 
16
- # -------------------------------------
17
  # 2) بعض التصحيحات الإملائية والفصيحة:
18
- # -------------------------------------
19
- # هذه بدل هاذي
20
  input_text = re.sub(r"\bهاذي\b", "هذه", input_text)
21
- # هؤلاء بدل هذول
22
  input_text = re.sub(r"\bهذول\b", "هؤلاء", input_text)
23
- # (أنتي|انتي) -> أنت
24
  input_text = re.sub(r"\b(أنتي|انتي)\b", "أنت", input_text, flags=re.IGNORECASE)
25
- # معاك -> معك
26
  input_text = re.sub(r"\bمعاك\b", "معك", input_text)
27
- # اللي -> الذي (قد تحتاج لسياق أكثر دقة لتحديد (التي) عند التأنيث)
28
  input_text = re.sub(r"\bاللي\b", "الذي", input_text)
29
 
30
- # -------------------------------------
31
- # 3) تصحيح بعض الهمزات الشائعة (تأكل، تأخذ)
32
- # -------------------------------------
33
  input_text = re.sub(r"\bتاكل\b", "تأكل", input_text)
34
  input_text = re.sub(r"\bتاخذ\b", "تأخذ", input_text)
35
 
36
- # -------------------------------------
37
  # 4) إزالة همزة فعل الأمر (مثال مبسط: إذهب -> اذهب)
38
- # -------------------------------------
39
  pattern_amr = r"\bإ([ضذصثقفغعهخحجةشسيبلاتنم])(.*?)(\b)"
40
  input_text = re.sub(pattern_amr, r"ا\1\2", input_text)
41
 
42
- # -------------------------------------
43
  # 5) تحويل الأسئلة إلى علامة استفهام بدلاً من النقطة
44
- # (اعتماداً على كلمات استفهام شائعة)
45
- # -------------------------------------
46
  question_words = [
47
  "كيف", "لماذا", "لمَ", "هل", "متى", "أين",
48
  "أيش#", "ايش#", "ويش#", "ليش#", "وش", "ما", "من",
@@ -52,131 +39,111 @@ def transform_text(input_text):
52
  pattern_q = rf"(\b{q_word}\b)\."
53
  input_text = re.sub(pattern_q, rf"\1؟", input_text, flags=re.IGNORECASE)
54
 
55
- # -------------------------------------
56
- # 6) تحويل الرقم 11 إلى "إحدى عشر" (مثال بسيط)
57
- # -------------------------------------
58
- # input_text = re.sub(r"\b11\b", "إحدى عشر", input_text)
59
-
60
- # -------------------------------------
61
- # 7) إزالة النقاط في نهاية الجمل
62
- # -------------------------------------
63
  input_text = re.sub(r"\.(\s|$)", r"\1", input_text)
64
 
65
- # -------------------------------------
66
- # 8) استبدال التردّد أو التمتمة (آآ / آه / آ ...)
67
- # بالرمز $ (وفق القاعدة الجديدة)
68
- # -------------------------------------
69
- # أمثلة: "آآ" أو "آه" أو "آ" إذا أتت منفردة أو متبوعة بمسافة أو فاصلة...
70
- # طبعًا يمكنك توسيع النمط بحسب الحاجة.
71
  pattern_stammer = r"\b(آآ+|آه+|آ)\b"
72
  input_text = re.sub(pattern_stammer, " $", input_text)
73
 
74
- # إذا هناك حالة مثل "آآالبيت" (بدون مسافة) وتريد استبدال الجزء "آآ" فقط،
75
- # قد تلزمك معالجة مختلفة:
76
- # input_text = re.sub(r"آآ+", "$", input_text)
77
-
78
- # -------------------------------------
79
- # 9) وضع علامة ~ بعد الكلمات الأعجمية
80
- # (مثل كوميدينة -> كوميدينة~)
81
- # وُرد في الأمثلة: كوميدينة، أجبورة...
82
- # -------------------------------------
83
- # لتبسيط المثال، نبحث عن كلمات معيّنة فقط.
84
  foreign_words = ["كوميدينة", "أجبورة"]
85
  for fw in foreign_words:
86
  pattern_fw = rf"\b{fw}\b"
87
  input_text = re.sub(pattern_fw, fw + "~", input_text, flags=re.IGNORECASE)
88
 
89
- # -------------------------------------
90
- # 10) معالجة الضحك والبكاء البسيط:
91
- # إذا وردت عبارة "ضحك بسيط" أو "بكاء خفيف"
92
- # نجعلها بين قوسين مربعين: [ضحك بسيط] أو [بكاء خفيف]
93
- # -------------------------------------
94
  input_text = re.sub(r"\bضحك بسيط\b", "[ضحك بسيط]", input_text)
95
  input_text = re.sub(r"\bبكاء خفيف\b", "[بكاء خفيف]", input_text)
96
 
97
- # -------------------------------------
98
- # يمكن إضافة/تطوير المزيد من القواعد بنفس الأسلوب...
99
- # -------------------------------------
100
-
101
  return input_text
102
 
 
 
 
103
 
104
  def reformat_transcript(lines):
105
  """
106
- تأخذ قائمة الأسطر بالصيغة القديمة:
107
- 00:02:15 المسجل
108
- السلام عليكم...
109
- 00:02:17 المشارك
110
- وعليكم السلام...
111
- وتعيدها بالشكل المطلوب:
112
- , (المسجل) [00:02:15] السلام عليكم...
113
- , (المشارك) [00:02:17] وعليكم السلام...
 
 
 
 
 
114
  """
 
115
  output_lines = []
116
  i = 0
117
  while i < len(lines):
118
  line = lines[i].strip()
119
-
120
- # نحاول التقاط التوقيت + الاسم في بداية السطر
121
- # صيغة التوقيت: HH:MM:SS (ساعتان، دقيقتان، ثانيتان)
122
- # بعده فراغ + اسم (قد يكون "المسجل"/"المشارك"/غيرهما)
123
- match = re.match(r'^(\d{2}:\d{2}:\d{2})\s+(.+)$', line)
124
- if match:
125
- # إذا نجحت المطابقة؛ نستخرج التوقيت والاسم
126
- time_code = match.group(1)
127
- speaker = match.group(2).strip()
128
 
129
- # نقرأ السطر التالي لافتراض أنه نص الحديث
 
 
 
 
 
 
 
 
 
 
 
 
130
  text_line = ""
131
  if i+1 < len(lines):
132
- text_line = lines[i+1].rstrip("\n")
133
  else:
134
  text_line = ""
135
 
136
- # يمكن هنا تطبيق أي تصحيحات على "text_line" لو أردت:
137
  text_line = transform_text(text_line)
138
 
139
- # نصنع السطر بالصيغة المطلوبة:
140
- # , (المتكلم) [التوقيت] الكلام...
141
- formatted = f", ({speaker}) [{time_code}] {text_line}"
142
  output_lines.append(formatted)
143
 
144
- i += 2 # تخطّى سطر الاسم والتوقيت + سطر النص
 
145
  else:
146
- # إذا لم يتطابق السطر مع صيغة "توقيت + اسم"
147
- # فقد يكون سطرًا فارغًا أو خارج التنسيق المطلوب
148
- # بإمكانك إما تجاهله أو إضافته كما هو
149
  i += 1
150
 
151
  return output_lines
152
 
153
-
154
- import gradio as gr
155
- import re
156
-
157
  def pipeline(raw_text):
158
  """
159
  تأخذ ال��صّ المُدخل (كاملًا)، تفصّله سطرًا سطرًا،
160
  ثم تعيد تنسيقه بالنمط المطلوب. تعيد الناتج كسلسلة نصية.
161
  """
162
- # نحصل على الأسطر
163
  lines = raw_text.splitlines()
164
- # نُعيد التنسيق
165
  reformatted_lines = reformat_transcript(lines)
166
- # نجمعها في نص واحد للعرض
167
  final_text = "\n".join(reformatted_lines)
168
  return final_text
169
 
 
 
 
170
  demo = gr.Interface(
171
  fn=pipeline,
172
- inputs=gr.Textbox(lines=10, placeholder="ألصق النص هنا..." , label="النص المفرغ"),
173
  outputs=gr.Textbox(lines=10 , label="النص المعالج"),
174
- title="تنسيق النص المفرغ وفق القواعد المطلوبة",
 
175
  )
176
 
177
  ##########################################################
178
- # 5) تشغيل الواجهة
179
  ##########################################################
180
  if __name__ == "__main__":
181
- demo.launch()
182
-
 
1
  import re
2
+ import gradio as gr
3
 
4
+ ##########################################################
5
+ # 1) دالّة التصحيح اللغوي/الإملائي (كما في سؤالك السابق)
6
+ ##########################################################
7
  def transform_text(input_text):
8
  """
9
  تقوم هذه الدالة بتطبيق مجموعة من القواعد على النص المدخل
10
  وتعيد النص المصحّح/المعدّل.
11
  """
12
 
13
+ # 1) إضافة علامة # بعد بعض الكلمات العامية المحددة
 
 
 
14
  pattern_hash = r"\b(ايش|إيش|ويش|ليش|عشان|علشان|لسى|يالله|والله|يلا|يااه|اووه|همن|ثمن)\b"
15
  input_text = re.sub(pattern_hash, r"\1#", input_text, flags=re.IGNORECASE)
16
 
 
17
  # 2) بعض التصحيحات الإملائية والفصيحة:
 
 
18
  input_text = re.sub(r"\bهاذي\b", "هذه", input_text)
 
19
  input_text = re.sub(r"\bهذول\b", "هؤلاء", input_text)
 
20
  input_text = re.sub(r"\b(أنتي|انتي)\b", "أنت", input_text, flags=re.IGNORECASE)
 
21
  input_text = re.sub(r"\bمعاك\b", "معك", input_text)
 
22
  input_text = re.sub(r"\bاللي\b", "الذي", input_text)
23
 
24
+ # 3) تصحيح بعض الهمزات الشائعة
 
 
25
  input_text = re.sub(r"\bتاكل\b", "تأكل", input_text)
26
  input_text = re.sub(r"\bتاخذ\b", "تأخذ", input_text)
27
 
 
28
  # 4) إزالة همزة فعل الأمر (مثال مبسط: إذهب -> اذهب)
 
29
  pattern_amr = r"\bإ([ضذصثقفغعهخحجةشسيبلاتنم])(.*?)(\b)"
30
  input_text = re.sub(pattern_amr, r"ا\1\2", input_text)
31
 
 
32
  # 5) تحويل الأسئلة إلى علامة استفهام بدلاً من النقطة
 
 
33
  question_words = [
34
  "كيف", "لماذا", "لمَ", "هل", "متى", "أين",
35
  "أيش#", "ايش#", "ويش#", "ليش#", "وش", "ما", "من",
 
39
  pattern_q = rf"(\b{q_word}\b)\."
40
  input_text = re.sub(pattern_q, rf"\1؟", input_text, flags=re.IGNORECASE)
41
 
42
+ # 6) إزالة النقاط في نهاية الجمل
 
 
 
 
 
 
 
43
  input_text = re.sub(r"\.(\s|$)", r"\1", input_text)
44
 
45
+ # 7) استبدال التردّد أو التمتمة (آآ / آه / آ ...) بالرمز $
 
 
 
 
 
46
  pattern_stammer = r"\b(آآ+|آه+|آ)\b"
47
  input_text = re.sub(pattern_stammer, " $", input_text)
48
 
49
+ # 8) وضع علامة ~ بعد الكلمات الأعجمية (إن وجدت)
 
 
 
 
 
 
 
 
 
50
  foreign_words = ["كوميدينة", "أجبورة"]
51
  for fw in foreign_words:
52
  pattern_fw = rf"\b{fw}\b"
53
  input_text = re.sub(pattern_fw, fw + "~", input_text, flags=re.IGNORECASE)
54
 
55
+ # 9) معالجة الضحك والبكاء البسيط
 
 
 
 
56
  input_text = re.sub(r"\bضحك بسيط\b", "[ضحك بسيط]", input_text)
57
  input_text = re.sub(r"\bبكاء خفيف\b", "[بكاء خفيف]", input_text)
58
 
 
 
 
 
59
  return input_text
60
 
61
+ ##########################################################
62
+ # 2) دالّة إعادة التنسيق للإدخال بالشكل الجديد
63
+ ##########################################################
64
 
65
  def reformat_transcript(lines):
66
  """
67
+ نتوقع الشكل:
68
+ [المتحدث 1] (0:00 - 0:02)
69
+ السلام عليكم.
70
+
71
+ [المتحدث 2] (0:02 - 0:05)
72
+ وعليكم السلام...
73
+
74
+ [المتحدث 1] (0:06 - 0:08)
75
+ الله يبقى شخبارا...
76
+ ونريد تحويله إلى:
77
+ , (المتحدث 1) [0:00 - 0:02] السلام عليكم.
78
+ , (المتحدث 2) [0:02 - 0:05] وعليكم السلام...
79
+ , (المتحدث 1) [0:06 - 0:08] الله يبقى شخبارا...
80
  """
81
+
82
  output_lines = []
83
  i = 0
84
  while i < len(lines):
85
  line = lines[i].strip()
 
 
 
 
 
 
 
 
 
86
 
87
+ # نحاول التقاط الصيغة: [المتحدث X] (0:00 - 0:02)
88
+ # تعبير نمطي مثل:
89
+ # ^\[(.*?)\]\s*\((.*?)\)$
90
+ # حيث:
91
+ # group(1) -> "المتحدث 1"
92
+ # group(2) -> "0:00 - 0:02"
93
+ pattern = r'^\[(.*?)\]\s*\((.*?)\)$'
94
+ match = re.match(pattern, line)
95
+ if match:
96
+ speaker = match.group(1) # "المتحدث 1"
97
+ time_range = match.group(2) # "0:00 - 0:02"
98
+
99
+ # السطر التالي متوقع أن يكون النص
100
  text_line = ""
101
  if i+1 < len(lines):
102
+ text_line = lines[i+1].rstrip("\n").strip()
103
  else:
104
  text_line = ""
105
 
106
+ # نطبّق التصحيح اللغوي على النص
107
  text_line = transform_text(text_line)
108
 
109
+ # الصيغة المطلوبة: , (المتحدث 1) [0:00 - 0:02] النص
110
+ formatted = f", ({speaker}) [{time_range}] {text_line}"
 
111
  output_lines.append(formatted)
112
 
113
+ # تجاوز سطرين: سطر المربع + سطر النص
114
+ i += 2
115
  else:
116
+ # إذا لم يطابق، نتجاهل هذا السطر أو نحتفظ به (هنا نتجاهله)
 
 
117
  i += 1
118
 
119
  return output_lines
120
 
121
+ ##########################################################
122
+ # 3) دالّة pipeline لتجميع العملية
123
+ ##########################################################
 
124
  def pipeline(raw_text):
125
  """
126
  تأخذ ال��صّ المُدخل (كاملًا)، تفصّله سطرًا سطرًا،
127
  ثم تعيد تنسيقه بالنمط المطلوب. تعيد الناتج كسلسلة نصية.
128
  """
 
129
  lines = raw_text.splitlines()
 
130
  reformatted_lines = reformat_transcript(lines)
 
131
  final_text = "\n".join(reformatted_lines)
132
  return final_text
133
 
134
+ ##########################################################
135
+ # 4) إنشاء واجهة Gradio
136
+ ##########################################################
137
  demo = gr.Interface(
138
  fn=pipeline,
139
+ inputs=gr.Textbox(lines=10, placeholder="ألصق النص هنا..." , label="النص المفرغ (الصيغة الجديدة)"),
140
  outputs=gr.Textbox(lines=10 , label="النص المعالج"),
141
+ title="تنسيق النص المفرغ وفق الصيغة الجديدة",
142
+ description="ألصق النص بالصيغ: [المتحدث X] (0:00 - 0:02) في سطر، والسطر التالي هو محتواه."
143
  )
144
 
145
  ##########################################################
146
+ # 5) تشغيل الواجهة مع رابط عام (إذا أمكن)
147
  ##########################################################
148
  if __name__ == "__main__":
149
+ demo.launch(share=True)