Azoz-7's picture
Create app.py
d964e2a verified
raw
history blame
8.39 kB
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()