Spaces:
Running
Running
File size: 8,393 Bytes
d964e2a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
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()
|