import gradio as gr from transformers import AutoTokenizer, AutoModelForMaskedLM, pipeline import random # تحميل نموذج صغير للغة العربية print("جاري تحميل النموذج الخفيف...") MODEL_NAME = "asafaya/bert-mini-arabic" # نموذج عربي أصغر بكثير tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) model = AutoModelForMaskedLM.from_pretrained(MODEL_NAME) # إنشاء توليد النصوص nlp = pipeline("fill-mask", model=model, tokenizer=tokenizer) print("تم تحميل النموذج بنجاح!") # عبارات افتتاحية مختلفة حسب المشاعر emotion_starters = { "سعيد": [ "أشعر بسعادة كبيرة لأن", "أنا سعيد جداً بـ", "الفرح يملأ قلبي عندما", "مما يسعدني حقاً هو" ], "حزين": [ "أشعر بالحزن بسبب", "ما يؤلمني هو", "يعتصر قلبي حزناً عندما", "الحزن يسكنني لأن" ], "غاضب": [ "أشعر بالغضب من", "ما يثير غضبي هو", "لا أستطيع تحمل", "يزعجني كثيراً أن" ], # يمكن إضافة المزيد للمشاعر الأخرى } # إضافة عبارات افتتاحية للمشاعر الأخرى for emotion in ["متحمس", "خائف", "متفائل", "متشائم", "مندهش", "مشتاق", "ممتن", "فخور", "مرتبك", "محبط", "هادئ"]: if emotion not in emotion_starters: emotion_starters[emotion] = [f"أشعر بأنني {emotion} لأن", f"عندما أكون {emotion} فإنني", f"ما يجعلني {emotion} هو"] # القائمة المنسدلة للمشاعر emotions = list(emotion_starters.keys()) def generate_text(emotion, length_choice): # تحويل اختيار الطول إلى عدد جمل length_options = {"قصير": 3, "متوسط": 5, "طويل": 8} num_sentences = length_options.get(length_choice, 5) # اختيار عبارة افتتاحية عشوائية starter = random.choice(emotion_starters[emotion]) text = starter # استخدام التنبؤ بالكلمات المُخفاة لإنشاء جمل for _ in range(num_sentences): try: # استخدام النموذج لتنبؤ كلمة جديدة if len(text) > 5: # التأكد من وجود نص كافٍ mask_input = text + " " + tokenizer.mask_token result = nlp(mask_input) predicted_word = result[0]['token_str'] if result else "والحياة" # الاستمرار في بناء النص text += " " + predicted_word # إضافة علامات ترقيم عشوائية if random.random() > 0.7: text += random.choice([".", "،", "؛", "!"]) except Exception as e: # إذا حدث خطأ، استمرار بكلمات بسيطة text += " " + random.choice(["الحياة", "الأمل", "المستقبل", "الذكريات", "التجارب"]) # تنظيف النص وإضافة علامة ترقيم في النهاية if not any(text.endswith(x) for x in [".", "!", "؟"]): text += "." return text # نفس CSS السابق css = """ :root { --rose-gold: #bd8c7d; --rose-gold-light: #d1a193; --black: #000000; --dark-gray: #121212; } body { background-color: var(--black) !important; background-image: url('data:image/svg+xml;utf8,أبتثج'); } .gradio-container { margin: 0 auto; background-color: var(--black) !important; max-width: 850px !important; } .main { background-color: var(--dark-gray) !important; border: 2px solid var(--rose-gold) !important; border-radius: 15px !important; box-shadow: 0 0 15px rgba(189, 140, 125, 0.3) !important; padding: 20px !important; position: relative; overflow: hidden; } .main::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 5px; background: linear-gradient(90deg, var(--black), var(--rose-gold), var(--black)); } h1, h2, h3, p, span, label { color: var(--rose-gold) !important; font-family: 'Amiri', 'Noto Sans Arabic', sans-serif !important; } .title { text-align: center; position: relative; padding-bottom: 15px; } .title::after { content: "۝"; position: absolute; bottom: -5px; left: 50%; transform: translateX(-50%); font-size: 24px; color: var(--rose-gold); opacity: 0.7; } .prose { color: var(--rose-gold-light) !important; } textarea, .output-text, .input-text { color: var(--rose-gold) !important; background-color: var(--dark-gray) !important; border: 1px solid var(--rose-gold) !important; border-radius: 8px !important; font-family: 'Amiri', 'Noto Sans Arabic', sans-serif !important; font-size: 18px !important; line-height: 1.6 !important; padding: 15px !important; box-shadow: inset 0 0 8px rgba(189, 140, 125, 0.1) !important; } button { background-color: var(--rose-gold) !important; color: var(--black) !important; border: none !important; border-radius: 8px !important; font-family: 'Amiri', 'Noto Sans Arabic', sans-serif !important; font-weight: bold !important; transition: all 0.3s ease !important; padding: 10px 20px !important; letter-spacing: 1px !important; } button:hover { background-color: var(--rose-gold-light) !important; box-shadow: 0 0 10px rgba(189, 140, 125, 0.6) !important; transform: translateY(-2px); } select, .dropdown { background-color: var(--dark-gray) !important; color: var(--rose-gold) !important; border: 1px solid var(--rose-gold) !important; border-radius: 8px !important; font-family: 'Amiri', 'Noto Sans Arabic', sans-serif !important; } .footer { border-top: 1px solid var(--rose-gold) !important; color: var(--rose-gold) !important; margin-top: 30px; padding-top: 15px; text-align: center; position: relative; } .footer::before { content: "♱"; position: absolute; top: -15px; left: 50%; transform: translateX(-50%); background-color: var(--dark-gray); padding: 0 15px; color: var(--rose-gold); font-size: 18px; } /* زخارف إضافية */ .corner-decoration { position: absolute; font-size: 24px; color: var(--rose-gold); opacity: 0.4; } .top-right { top: 15px; right: 15px; } .top-left { top: 15px; left: 15px; } .bottom-right { bottom: 15px; right: 15px; } .bottom-left { bottom: 15px; left: 15px; } .output-container { position: relative; padding: 10px; border-radius: 10px; border: 1px solid var(--rose-gold); background-color: rgba(0, 0, 0, 0.3); } .output-container::before { content: "۞"; font-size: 24px; color: var(--rose-gold); display: block; text-align: center; margin-bottom: 10px; opacity: 0.5; } """ # إنشاء واجهة المستخدم (نفس الواجهة السابقة) with gr.Blocks(css=css) as demo: with gr.Column(elem_classes=["main"]): gr.HTML("""
٭
٭
٭
٭

❁ اكتبلي ❁

مولد النصوص العربية بالمشاعر

أداة لتوليد نصوص عربية إبداعية بناءً على المشاعر التي تختارها

""") with gr.Row(): with gr.Column(scale=1): emotion = gr.Dropdown( choices=emotions, label="اختر المشاعر", value="سعيد" ) length = gr.Radio( choices=["قصير", "متوسط", "طويل"], label="طول النص", value="متوسط" ) generate_button = gr.Button("✨ توليد النص ✨") with gr.Column(scale=2): with gr.Box(elem_classes=["output-container"]): output = gr.Textbox( label="النص المولّد", lines=12, elem_classes=["output-text"] ) gr.HTML(""" """) generate_button.click( fn=generate_text, inputs=[emotion, length], outputs=output ) # تشغيل التطبيق demo.launch()