import re def transform_text(input_text): """ تقوم هذه الدالة بتطبيق مجموعة من القواعد على النص المدخل وتعيد النص المصحّح/المعدّل. """ # ------------------------------------- # 1) إضافة علامة # بعد بعض الكلمات العامية المحددة: # ايش/ويش/ليش/عشان/علشان/لسى/يالله/والله/يلا/يااه/اووه/همن/ثمن # ------------------------------------- pattern_hash = r"\b(ايش|إيش|ويش|ليش|عشان|علشان|لسى|يالله|والله|يلا|يااه|اووه|همن|ثمن)\b" input_text = re.sub(pattern_hash, r"\1#", input_text, flags=re.IGNORECASE) # ------------------------------------- # 2) بعض التصحيحات الإملائية والفصيحة: # ------------------------------------- # هذه بدل هاذي input_text = re.sub(r"\bهاذي\b", "هذه", input_text) # هؤلاء بدل هذول input_text = re.sub(r"\bهذول\b", "هؤلاء", input_text) # (أنتي|انتي) -> أنت input_text = re.sub(r"\b(أنتي|انتي)\b", "أنت", input_text, flags=re.IGNORECASE) # معاك -> معك input_text = re.sub(r"\bمعاك\b", "معك", input_text) # اللي -> الذي (قد تحتاج لسياق أكثر دقة لتحديد (التي) عند التأنيث) input_text = re.sub(r"\bاللي\b", "الذي", input_text) # ------------------------------------- # 3) تصحيح بعض الهمزات الشائعة (تأكل، تأخذ) # ------------------------------------- input_text = re.sub(r"\bتاكل\b", "تأكل", input_text) input_text = re.sub(r"\bتاخذ\b", "تأخذ", input_text) # ------------------------------------- # 4) إزالة همزة فعل الأمر (مثال مبسط: إذهب -> اذهب) # ------------------------------------- pattern_amr = r"\bإ([ضذصثقفغعهخحجةشسيبلاتنم])(.*?)(\b)" input_text = re.sub(pattern_amr, r"ا\1\2", input_text) # ------------------------------------- # 5) تحويل الأسئلة إلى علامة استفهام بدلاً من النقطة # (اعتماداً على كلمات استفهام شائعة) # ------------------------------------- question_words = [ "كيف", "لماذا", "لمَ", "هل", "متى", "أين", "أيش#", "ايش#", "ويش#", "ليش#", "وش", "ما", "من", "أين", "أيمكن", "أحقًا" ] for q_word in question_words: pattern_q = rf"(\b{q_word}\b)\." input_text = re.sub(pattern_q, rf"\1؟", input_text, flags=re.IGNORECASE) # ------------------------------------- # 6) تحويل الرقم 11 إلى "إحدى عشر" (مثال بسيط) # ------------------------------------- # input_text = re.sub(r"\b11\b", "إحدى عشر", input_text) # ------------------------------------- # 7) إزالة النقاط في نهاية الجمل # ------------------------------------- input_text = re.sub(r"\.(\s|$)", r"\1", input_text) # ------------------------------------- # 8) استبدال التردّد أو التمتمة (آآ / آه / آ ...) # بالرمز $ (وفق القاعدة الجديدة) # ------------------------------------- # أمثلة: "آآ" أو "آه" أو "آ" إذا أتت منفردة أو متبوعة بمسافة أو فاصلة... # طبعًا يمكنك توسيع النمط بحسب الحاجة. pattern_stammer = r"\b(آآ+|آه+|آ)\b" input_text = re.sub(pattern_stammer, " $", input_text) # إذا هناك حالة مثل "آآالبيت" (بدون مسافة) وتريد استبدال الجزء "آآ" فقط، # قد تلزمك معالجة مختلفة: # input_text = re.sub(r"آآ+", "$", input_text) # ------------------------------------- # 9) وضع علامة ~ بعد الكلمات الأعجمية # (مثل كوميدينة -> كوميدينة~) # وُرد في الأمثلة: كوميدينة، أجبورة... # ------------------------------------- # لتبسيط المثال، نبحث عن كلمات معيّنة فقط. foreign_words = ["كوميدينة", "أجبورة"] for fw in foreign_words: pattern_fw = rf"\b{fw}\b" input_text = re.sub(pattern_fw, fw + "~", input_text, flags=re.IGNORECASE) # ------------------------------------- # 10) معالجة الضحك والبكاء البسيط: # إذا وردت عبارة "ضحك بسيط" أو "بكاء خفيف" # نجعلها بين قوسين مربعين: [ضحك بسيط] أو [بكاء خفيف] # ------------------------------------- input_text = re.sub(r"\bضحك بسيط\b", "[ضحك بسيط]", input_text) input_text = re.sub(r"\bبكاء خفيف\b", "[بكاء خفيف]", input_text) # ------------------------------------- # يمكن إضافة/تطوير المزيد من القواعد بنفس الأسلوب... # ------------------------------------- return input_text def reformat_transcript(lines): """ تأخذ قائمة الأسطر بالصيغة القديمة: 00:02:15 المسجل السلام عليكم... 00:02:17 المشارك وعليكم السلام... وتعيدها بالشكل المطلوب: , (المسجل) [00:02:15] السلام عليكم... , (المشارك) [00:02:17] وعليكم السلام... """ output_lines = [] i = 0 while i < len(lines): line = lines[i].strip() # نحاول التقاط التوقيت + الاسم في بداية السطر # صيغة التوقيت: HH:MM:SS (ساعتان، دقيقتان، ثانيتان) # بعده فراغ + اسم (قد يكون "المسجل"/"المشارك"/غيرهما) match = re.match(r'^(\d{2}:\d{2}:\d{2})\s+(.+)$', line) if match: # إذا نجحت المطابقة؛ نستخرج التوقيت والاسم time_code = match.group(1) speaker = match.group(2).strip() # نقرأ السطر التالي لافتراض أنه نص الحديث text_line = "" if i+1 < len(lines): text_line = lines[i+1].rstrip("\n") else: text_line = "" # يمكن هنا تطبيق أي تصحيحات على "text_line" لو أردت: text_line = transform_text(text_line) # نصنع السطر بالصيغة المطلوبة: # , (المتكلم) [التوقيت] الكلام... formatted = f", ({speaker}) [{time_code}] {text_line}" output_lines.append(formatted) i += 2 # تخطّى سطر الاسم والتوقيت + سطر النص else: # إذا لم يتطابق السطر مع صيغة "توقيت + اسم" # فقد يكون سطرًا فارغًا أو خارج التنسيق المطلوب # بإمكانك إما تجاهله أو إضافته كما هو i += 1 return output_lines import gradio as gr import re def pipeline(raw_text): """ تأخذ النصّ المُدخل (كاملًا)، تفصّله سطرًا سطرًا، ثم تعيد تنسيقه بالنمط المطلوب. تعيد الناتج كسلسلة نصية. """ # نحصل على الأسطر lines = raw_text.splitlines() # نُعيد التنسيق reformatted_lines = reformat_transcript(lines) # نجمعها في نص واحد للعرض final_text = "\n".join(reformatted_lines) return final_text demo = gr.Interface( fn=pipeline, inputs=gr.Textbox(lines=10, placeholder="ألصق النص هنا..." , label="النص المفرغ"), outputs=gr.Textbox(lines=10 , label="النص المعالج"), title="تنسيق النص المفرغ وفق القواعد المطلوبة", ) ########################################################## # 5) تشغيل الواجهة ########################################################## if __name__ == "__main__": demo.launch()