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

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +182 -0
app.py ADDED
@@ -0,0 +1,182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ "أيش#", "ايش#", "ويش#", "ليش#", "وش", "ما", "من",
49
+ "أين", "أيمكن", "أحقًا"
50
+ ]
51
+ for q_word in question_words:
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
+