Spaces:
Sleeping
Sleeping
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() | |