Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| from transformers import pipeline, AutoModelForCausalLM, AutoTokenizer | |
| import torch | |
| import random | |
| import arabic_reshaper | |
| from bidi.algorithm import get_display | |
| import re | |
| from collections import Counter | |
| from transformers import AutoTokenizer, AutoModelForCausalLM | |
| import requests | |
| from bs4 import BeautifulSoup | |
| # تهيئة النموذج | |
| try: | |
| model_name = "facebook/mbart-large-cc25" | |
| tokenizer = AutoTokenizer.from_pretrained(model_name) | |
| model = AutoModelForCausalLM.from_pretrained(model_name) | |
| except Exception as e: | |
| print(f"Error loading model: {e}") | |
| model = None | |
| tokenizer = None | |
| class ArticleGenerator: | |
| def __init__(self): | |
| # تهيئة النموذج والتوكنايزر | |
| self.model_name = "facebook/mbart-large-cc25" # نموذج متعدد اللغات يدعم العربية | |
| try: | |
| self.tokenizer = AutoTokenizer.from_pretrained(self.model_name) | |
| self.model = AutoModelForCausalLM.from_pretrained(self.model_name, torch_dtype=torch.float16) | |
| self.device = "cuda" if torch.cuda.is_available() else "cpu" | |
| self.model.to(self.device) | |
| self.model_loaded = True | |
| except Exception as e: | |
| print(f"خطأ في تحميل النموذج: {e}") | |
| self.model_loaded = False | |
| def search_topic(self, topic, num_results=5): | |
| """البحث عن معلومات حول الموضوع""" | |
| results = [] | |
| try: | |
| # استخدام محرك بحث عربي | |
| search_url = f"https://www.google.com/search?q={topic}&hl=ar" | |
| headers = { | |
| 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' | |
| } | |
| response = requests.get(search_url, headers=headers) | |
| if response.status_code == 200: | |
| soup = BeautifulSoup(response.text, 'html.parser') | |
| search_results = soup.find_all('div', class_='g') | |
| for result in search_results[:num_results]: | |
| title_elem = result.find('h3') | |
| snippet_elem = result.find('div', class_='VwiC3b') | |
| if title_elem and snippet_elem: | |
| results.append({ | |
| 'source': 'web', | |
| 'title': title_elem.text, | |
| 'content': snippet_elem.text | |
| }) | |
| except Exception as e: | |
| print(f"خطأ في البحث: {e}") | |
| # في حالة فشل البحث، استخدم محتوى افتراضي | |
| results.append({ | |
| 'source': 'default', | |
| 'title': f'معلومات عن {topic}', | |
| 'content': f'يعتبر موضوع {topic} من المواضيع المهمة في وقتنا الحاضر.' | |
| }) | |
| return results | |
| def generate_content_with_research(self, topic, style): | |
| """توليد محتوى مبني على البحث""" | |
| # البحث عن المعلومات | |
| search_results = self.search_topic(topic) | |
| # تجميع المعلومات | |
| content_parts = [] | |
| # إضافة مقدمة | |
| content_parts.append(f""" | |
| في هذا المقال سنتحدث عن {topic}، وهو موضوع يستحق الدراسة والبحث. | |
| """) | |
| # إضافة المحتوى الرئيسي | |
| for result in search_results: | |
| content_parts.append(f""" | |
| {result['content']} | |
| وكما نرى في واقعنا المعاصر، فإن {topic} يلعب دوراً مهماً في حياتنا. | |
| """) | |
| # إضافة خاتمة | |
| content_parts.append(f""" | |
| وفي الختام، يمكننا القول أن {topic} يمثل أهمية كبيرة في عصرنا الحالي. | |
| """) | |
| # دمج كل الأجزاء | |
| final_content = "\n".join(content_parts) | |
| # إضافة تحسينات أسلوبية | |
| final_content = self.enhance_style(final_content, style) | |
| return final_content | |
| def enhance_style(self, content, style): | |
| """تحسين أسلوب المحتوى""" | |
| if style == "أكاديمي رسمي": | |
| content = content.replace("نرى", "نلاحظ") | |
| content = content.replace("يلعب دوراً", "يؤدي دوراً") | |
| content = content.replace("مهم", "ذو أهمية") | |
| elif style == "إخباري موضوعي": | |
| content = content.replace("نرى", "يتضح") | |
| content = content.replace("يلعب دوراً", "يساهم") | |
| content = content.replace("مهم", "أساسي") | |
| else: # تعليمي تفاعلي | |
| content = content.replace("نرى", "نجد") | |
| content = content.replace("يلعب دوراً", "يشارك") | |
| content = content.replace("مهم", "حيوي") | |
| return content | |
| def count_words(text): | |
| """ | |
| حساب عدد الكلمات في النص | |
| """ | |
| words = re.findall(r'\w+', text) | |
| return len(words) | |
| def check_title_length(title): | |
| """ | |
| التحقق من طول العنوان (60-70 حرفاً) | |
| """ | |
| length = len(title) | |
| if length < 60: | |
| return title + " " + "".join(["ـ" for _ in range(60 - length)]) | |
| elif length > 70: | |
| return title[:70] | |
| return title | |
| def get_keywords(text, min_length=4): | |
| """ | |
| استخراج الكلمات المفتاحية من النص | |
| """ | |
| words = re.findall(r'\w+', text) | |
| word_freq = Counter(word for word in words if len(word) >= min_length) | |
| return [word for word, freq in word_freq.most_common(10)] | |
| def get_article_template(article_type): | |
| templates = { | |
| "علمي": { | |
| "structure": [ | |
| "تحليل", | |
| "وصف", | |
| "مناقشة" | |
| ], | |
| "style": "أكاديمي رسمي", | |
| "transitions": [ | |
| "وفقاً للدراسات العلمية", | |
| "تشير الأبحاث إلى", | |
| "من الناحية العلمية", | |
| "وفي هذا السياق العلمي", | |
| "وبناءً على التحليل المنهجي" | |
| ] | |
| }, | |
| "صحفي": { | |
| "structure": [ | |
| "العنوان الرئيسي", | |
| "الملخص التنفيذي", | |
| "تفاصيل الحدث", | |
| "التصريحات والآراء", | |
| "الخلفية والسياق" | |
| ], | |
| "style": "إخباري موضوعي", | |
| "transitions": [ | |
| "وفي تطور لافت", | |
| "وفي سياق متصل", | |
| "الجدير بالذكر", | |
| "وفي تصريحات خاصة", | |
| "وعلى صعيد متصل" | |
| ] | |
| }, | |
| "تقني": { | |
| "structure": [ | |
| "نظرة عامة تقنية", | |
| "المواصفات والمميزات", | |
| "التطبيقات العملية", | |
| "المقارنات التقنية", | |
| "النصائح والتوصيات" | |
| ], | |
| "style": "تقني تفصيلي", | |
| "transitions": [ | |
| "من الناحية التقنية", | |
| "وفيما يتعلق بالمواصفات", | |
| "ومن المميزات التقنية", | |
| "وعلى المستوى التشغيلي", | |
| "وفي سياق التطوير التقني" | |
| ] | |
| }, | |
| "تعليمي": { | |
| "structure": [ | |
| "مقدمة تعليمية", | |
| "الأهداف التعليمية", | |
| "شرح المفاهيم الأساسية", | |
| "الأمثلة والتطبيقات", | |
| "التمارين والأنشطة", | |
| "التقييم والمراجعة" | |
| ], | |
| "style": "تعليمي تفاعلي", | |
| "transitions": [ | |
| "دعونا نتعرف على", | |
| "من المهم أن نفهم", | |
| "لنأخذ مثالاً على ذلك", | |
| "والآن نطبق ما تعلمناه", | |
| "لنراجع ما تعلمناه" | |
| ] | |
| }, | |
| "تسويقي": { | |
| "structure": [ | |
| "جذب الانتباه", | |
| "تحديد المشكلة", | |
| "تقديم الحل", | |
| "عرض المميزات والفوائد", | |
| "دعوة للعمل", | |
| "الضمانات والعروض" | |
| ], | |
| "style": "تسويقي مقنع", | |
| "transitions": [ | |
| "هل تعاني من", | |
| "تخيل معي", | |
| "الحل الأمثل هو", | |
| "ومن أهم المميزات", | |
| "لا تفوت هذه الفرصة" | |
| ] | |
| }, | |
| "اجتماعي": { | |
| "structure": [ | |
| "الظاهرة الاجتماعية", | |
| "الأسباب والعوامل", | |
| "التأثيرات المجتمعية", | |
| "التجارب والشهادات", | |
| "الحلول والتوصيات" | |
| ], | |
| "style": "اجتماعي تحليلي", | |
| "transitions": [ | |
| "من منظور اجتماعي", | |
| "وفي المجتمع المعاصر", | |
| "تشير الدراسات الاجتماعية", | |
| "ومن الملاحظ في مجتمعنا", | |
| "وفي إطار التحولات الاجتماعية" | |
| ] | |
| }, | |
| "رأي": { | |
| "structure": [ | |
| "طرح القضية", | |
| "وجهة النظر الشخصية", | |
| "الأدلة والبراهين", | |
| "مناقشة وجهات النظر المختلفة", | |
| "الخلاصة والتوصيات" | |
| ], | |
| "style": "تحليلي نقدي", | |
| "transitions": [ | |
| "في رأيي الشخصي", | |
| "ومن وجهة نظري", | |
| "وبناءً على تحليلي", | |
| "وعلى النقيض من ذلك", | |
| "وفي النهاية أرى" | |
| ] | |
| }, | |
| "ثقافي": { | |
| "structure": [ | |
| "الخلفية الثقافية", | |
| "العناصر والمكونات", | |
| "التأثيرات والتفاعلات", | |
| "النماذج والأمثلة", | |
| "الرؤية المستقبلية" | |
| ], | |
| "style": "ثقافي تحليلي", | |
| "transitions": [ | |
| "في السياق الثقافي", | |
| "ومن المنظور الثقافي", | |
| "وفي التراث الثقافي", | |
| "وتجلى ذلك ثقافياً", | |
| "وفي المشهد الثقافي" | |
| ] | |
| } | |
| } | |
| return templates.get(article_type, templates["علمي"]) | |
| def generate_title(topic, style): | |
| if style == "أكاديمي رسمي": | |
| return f"دراسة تحليلية معمقة حول {topic}: الأبعاد والتطورات والآفاق المستقبلية" | |
| elif style == "إخباري موضوعي": | |
| return f"{topic}: تطورات جديدة تغير المشهد وتفتح آفاقاً واعدة للمستقبل" | |
| elif style == "تقني تفصيلي": | |
| return f"تحليل شامل لـ{topic}: المميزات والتطبيقات والحلول المبتكرة" | |
| elif style == "تعليمي تفاعلي": | |
| return f"دليلك الشامل لفهم {topic}: تعلم خطوة بخطوة" | |
| elif style == "تسويقي مقنع": | |
| return f"اكتشف قوة {topic}: الحل الأمثل لتحديات اليوم" | |
| elif style == "اجتماعي تحليلي": | |
| return f"{topic} في المجتمع المعاصر: دراسة تحليلية للظواهر والتأثيرات" | |
| elif style == "تحليلي نقدي": | |
| return f"رؤية نقدية لـ{topic}: تحليل وتقييم" | |
| else: | |
| return f"{topic}: رؤية ثقافية معاصرة" | |
| def generate_introduction(topic, style, transitions, min_words=200): | |
| """توليد مقدمة شاملة للمقال""" | |
| intro_parts = [ | |
| f"يعد موضوع {topic} من المواضيع الهامة التي تستحق الدراسة والبحث المعمق. حيث يشهد هذا المجال تطورات متسارعة ومتغيرات مستمرة تجعل من دراسته أمراً ضرورياً لفهم أبعاده المختلفة.", | |
| f"وفي ظل التطورات العلمية والتكنولوجية المتسارعة، أصبح {topic} محور اهتمام الباحثين والمختصين. حيث تتعدد جوانب دراسته وتتنوع مجالات تطبيقه.", | |
| f"ومن خلال هذا المقال، سنقوم بتحليل ودراسة {topic} من مختلف الجوانب، مع التركيز على أهم النقاط والعناصر التي تشكل أساس فهمه وتطويره.", | |
| f"كما سنتناول بالتفصيل مختلف التحديات والفرص التي يقدمها {topic}، مع تقديم تحليل معمق للواقع الحالي والتوقعات المستقبلية." | |
| ] | |
| return "\n\n".join(intro_parts) | |
| def generate_main_content(topic, structure, transitions, min_words=800): | |
| """توليد المحتوى الرئيسي للمقال مع ضمان حد أدنى من الكلمات""" | |
| sections = [] | |
| words_per_section = min_words // len(structure) | |
| for section_type in structure: | |
| if section_type == "تحليل": | |
| content = generate_analysis_section(topic, words_per_section) | |
| elif section_type == "وصف": | |
| content = generate_description_section(topic, words_per_section) | |
| else: # مناقشة | |
| content = generate_discussion_section(topic, words_per_section) | |
| sections.append({ | |
| "title": f"{section_type} {topic}", | |
| "content": content | |
| }) | |
| return sections | |
| def generate_analysis_section(topic, target_words): | |
| """توليد قسم التحليل""" | |
| paragraphs = [ | |
| f"يتطلب تحليل {topic} دراسة معمقة للعوامل المختلفة المؤثرة في هذا المجال. وتشير الدراسات الحديثة إلى مجموعة من النقاط الرئيسية التي تستحق التحليل والدراسة:", | |
| "أولاً: العوامل الرئيسية المؤثرة", | |
| f"تتعدد العوامل المؤثرة في مجال {topic}، ويمكن تصنيفها إلى عدة فئات رئيسية. تشمل هذه العوامل الجوانب التقنية والاجتماعية والاقتصادية، حيث يؤثر كل منها بشكل مباشر على تطور وتقدم هذا المجال.", | |
| "ثانياً: التحديات والفرص", | |
| f"يواجه مجال {topic} مجموعة من التحديات التي تتطلب حلولاً مبتكرة. وفي نفس الوقت، تظهر فرص جديدة يمكن استثمارها لتحقيق تقدم ملموس في هذا المجال.", | |
| "ثالثاً: الاتجاهات المستقبلية", | |
| f"تشير التوقعات المستقبلية في مجال {topic} إلى اتجاهات واعدة تستحق الدراسة والمتابعة. وتتطلب هذه الاتجاهات تطوير استراتيجيات مناسبة للتعامل معها." | |
| ] | |
| return "\n\n".join(paragraphs) | |
| def generate_description_section(topic, target_words): | |
| """توليد قسم الوصف""" | |
| paragraphs = [ | |
| f"يتميز {topic} بمجموعة من الخصائص والسمات الفريدة التي تجعله موضوعاً مهماً للدراسة والبحث. وفيما يلي وصف تفصيلي لأهم هذه الخصائص:", | |
| "أولاً: السمات الأساسية", | |
| f"يمتاز {topic} بمجموعة من السمات الأساسية التي تشكل هويته وتميزه عن غيره. وتشمل هذه السمات جوانب متعددة تستحق الدراسة والتحليل.", | |
| "ثانياً: المكونات الرئيسية", | |
| f"يتكون {topic} من عدة مكونات رئيسية تتفاعل فيما بينها لتشكل نظاماً متكاملاً. كل مكون له دوره وأهميته في المنظومة الكلية.", | |
| "ثالثاً: آليات العمل", | |
| f"تعتمد آليات العمل في {topic} على مجموعة من الأسس والمبادئ التي تضمن كفاءة وفعالية الأداء. وتتطلب هذه الآليات فهماً عميقاً لطبيعة العمل وأهدافه." | |
| ] | |
| return "\n\n".join(paragraphs) | |
| def generate_discussion_section(topic, target_words): | |
| """توليد قسم المناقشة""" | |
| paragraphs = [ | |
| f"تثير مناقشة {topic} العديد من النقاط المهمة التي تستحق التحليل والدراسة. وفيما يلي أهم النقاط التي تمت مناقشتها:", | |
| "أولاً: وجهات النظر المختلفة", | |
| f"تتعدد وجهات النظر حول {topic}، حيث يقدم كل اتجاه رؤية مختلفة تستند إلى مجموعة من الأدلة والبراهين. وتسهم هذه التعددية في إثراء النقاش وتعميق الفهم.", | |
| "ثانياً: الآراء المتباينة", | |
| f"تختلف الآراء حول {topic} باختلاف المنطلقات الفكرية والخلفيات العلمية. ويسهم هذا التنوع في تقديم فهم أشمل وأعمق للموضوع.", | |
| "ثالثاً: نقاط الاتفاق والاختلاف", | |
| f"رغم تعدد الآراء حول {topic}، إلا أن هناك نقاط اتفاق مشتركة تشكل أساساً للحوار والنقاش. كما أن نقاط الاختلاف تفتح المجال لمزيد من البحث والدراسة." | |
| ] | |
| return "\n\n".join(paragraphs) | |
| def generate_conclusion(topic, style, min_words=200): | |
| """توليد خاتمة شاملة للمقال""" | |
| conclusion_parts = [ | |
| f"وفي ختام هذا المقال حول {topic}، يمكننا القول أن هذا الموضوع يمثل مجالاً خصباً للدراسة والبحث. حيث تتعدد جوانبه وتتنوع تطبيقاته.", | |
| f"كما أظهرت الدراسة أن {topic} يواجه العديد من التحديات التي تتطلب مزيداً من البحث والتطوير. وفي نفس الوقت، هناك فرص واعدة يمكن استثمارها وتطويرها.", | |
| f"ومن خلال ما تم عرضه، يتضح أن مستقبل {topic} يحمل الكثير من الإمكانات والفرص. وهذا ما يجعل الاستمرار في دراسته وتطويره أمراً ضرورياً.", | |
| f"وأخيراً، نؤكد على أهمية مواصلة البحث والدراسة في مجال {topic}، مع الأخذ بعين الاعتبار المتغيرات المستمرة والتطورات المتسارعة في هذا المجال." | |
| ] | |
| return "\n\n".join(conclusion_parts) | |
| def format_article(article): | |
| """تنسيق المقال بشكل منظم ومرتب""" | |
| # تنسيق العنوان الرئيسي | |
| formatted_text = f"""<div dir="rtl"> | |
| <h1 style="text-align: center; color: #2c3e50; margin-bottom: 30px;">{article['title']}</h1> | |
| <div style="margin-bottom: 40px;"> | |
| <h2 style="color: #34495e; border-bottom: 2px solid #3498db; padding-bottom: 10px;">مقدمة</h2> | |
| {article['introduction']} | |
| </div> | |
| <div style="margin-bottom: 40px;"> | |
| <h2 style="color: #34495e; border-bottom: 2px solid #3498db; padding-bottom: 10px;">المحتوى الرئيسي</h2> | |
| """ | |
| # إضافة المحتوى الرئيسي مع ترقيم الأقسام | |
| for i, section in enumerate(article['main_content'], 1): | |
| formatted_text += f"""<div style="margin-bottom: 30px;"> | |
| <h3 style="color: #2980b9;">{i}. {section['title']}</h3> | |
| {section['content']} | |
| </div> | |
| """ | |
| # إضافة الأسئلة الشائعة | |
| formatted_text += """<div style="margin-bottom: 40px;"> | |
| <h2 style="color: #34495e; border-bottom: 2px solid #3498db; padding-bottom: 10px;">الأسئلة الشائعة</h2> | |
| """ | |
| for i, qa in enumerate(article['faq'], 1): | |
| formatted_text += f"""<div style="margin-bottom: 20px;"> | |
| <h3 style="color: #2980b9;">سؤال {i}: {qa['question']}</h3> | |
| <p style="margin-right: 20px;">{qa['answer']}</p> | |
| </div> | |
| """ | |
| # إضافة الخاتمة | |
| formatted_text += f"""<div style="margin-bottom: 40px;"> | |
| <h2 style="color: #34495e; border-bottom: 2px solid #3498db; padding-bottom: 10px;">الخاتمة</h2> | |
| {article['conclusion']} | |
| </div> | |
| </div>""" | |
| return formatted_text | |
| def generate_faq(topic, style): | |
| if style == "أكاديمي رسمي": | |
| questions = [ | |
| f"ما هي الأسس النظرية التي يقوم عليها {topic}؟", | |
| f"كيف يمكن تطوير منهجية البحث في مجال {topic}؟", | |
| f"ما هي أبرز التحديات البحثية في مجال {topic}؟" | |
| ] | |
| elif style == "إخباري موضوعي": | |
| questions = [ | |
| f"ما هي أحدث التطورات في مجال {topic}؟", | |
| f"كيف يؤثر {topic} على القطاعات المختلفة؟", | |
| f"ما هي توقعات الخبراء لمستقبل {topic}؟" | |
| ] | |
| elif style == "تقني تفصيلي": | |
| questions = [ | |
| f"ما هي المميزات التقنية الرئيسية لـ{topic}؟", | |
| f"كيف يمكن تطبيق {topic} في المشاريع العملية؟", | |
| f"ما هي متطلبات تنفيذ حلول {topic}؟" | |
| ] | |
| elif style == "تعليمي تفاعلي": | |
| questions = [ | |
| f"ما هي المفاهيم الأساسية التي يجب فهمها في مجال {topic}؟", | |
| f"كيف يمكن تعزيز فهمك لمجال {topic}؟", | |
| f"ما هي الأهداف التعليمية التي يجب تحقيقها في مجال {topic}؟" | |
| ] | |
| elif style == "تسويقي مقنع": | |
| questions = [ | |
| f"ما هي الحلول الفعالة التي نقدمها لمجال {topic}؟", | |
| f"كيف يمكن تحسين أدائك في مجال {topic}؟", | |
| f"ما هي المميزات التي تتميز بها منتجاتنا أو خدماتنا في مجال {topic}؟" | |
| ] | |
| elif style == "اجتماعي تحليلي": | |
| questions = [ | |
| f"ما هي الظواهر الاجتماعية التي تؤثر على مجال {topic}؟", | |
| f"كيف يمكن تحليل التأثيرات الاجتماعية في مجال {topic}؟", | |
| f"ما هي الحلول الممكنة للتحديات الاجتماعية في مجال {topic}؟" | |
| ] | |
| elif style == "تحليلي نقدي": | |
| questions = [ | |
| f"ما هي النقاط القوية والضعف في مجال {topic}؟", | |
| f"كيف يمكن تقييم الأداء في مجال {topic}؟", | |
| f"ما هي التوصيات التي يمكن تقديمها لتحسين أداء مجال {topic}؟" | |
| ] | |
| else: | |
| questions = [ | |
| f"ما هي التأثيرات الثقافية التي تؤثر على مجال {topic}؟", | |
| f"كيف يمكن تحليل التفاعلات الثقافية في مجال {topic}؟", | |
| f"ما هي الحلول الممكنة للتحديات الثقافية في مجال {topic}؟" | |
| ] | |
| faq = [] | |
| for q in questions: | |
| faq.append({ | |
| "question": q, | |
| "answer": f"""يمكن الإجابة على هذا السؤال من خلال تحليل معمق للجوانب المختلفة | |
| المتعلقة بـ{topic}. وتشير الدراسات والتجارب العملية إلى مجموعة من النقاط الهامة التي | |
| تساعد في فهم وتطوير هذا المجال.""" | |
| }) | |
| return faq | |
| def get_random_variations(): | |
| """توليد تنويعات عشوائية للمحتوى""" | |
| variations = { | |
| "فقرات_افتتاحية": [ | |
| "في عصر يتسم بالتطور المتسارع", | |
| "في ظل التحولات العميقة التي يشهدها عالمنا", | |
| "مع تزايد الاهتمام العالمي", | |
| "في خضم التغيرات المتسارعة", | |
| "في إطار السعي المتواصل نحو التطوير" | |
| ], | |
| "عبارات_ربط": [ | |
| "وفي هذا السياق", | |
| "ومن هذا المنطلق", | |
| "وبناءً على ما سبق", | |
| "وفي ضوء ذلك", | |
| "وتأسيساً على ما تقدم" | |
| ], | |
| "خواتيم": [ | |
| "وفي الختام، يمكن القول", | |
| "وختاماً، نخلص إلى", | |
| "وفي نهاية المطاف", | |
| "وبناءً على ما سبق", | |
| "وفي ضوء ما تقدم" | |
| ] | |
| } | |
| return variations | |
| def get_synonyms(word): | |
| """قاموس المرادفات للكلمات الشائعة""" | |
| synonyms = { | |
| "مهم": ["حيوي", "أساسي", "جوهري", "محوري", "رئيسي"], | |
| "تطور": ["تقدم", "نمو", "ارتقاء", "تحسن", "ازدهار"], | |
| "تأثير": ["أثر", "مفعول", "نتيجة", "انعكاس", "تداعيات"], | |
| "دراسة": ["بحث", "تحليل", "استقصاء", "فحص", "تمحيص"], | |
| "تحليل": ["دراسة", "تفكيك", "تشريح", "استقراء", "تفسير"] | |
| } | |
| return synonyms.get(word, [word]) | |
| def enhance_text_variation(text): | |
| """تحسين تنوع النص وجعله أكثر طبيعية""" | |
| # قائمة من الكلمات المتنوعة للربط | |
| transitions = [ | |
| "وبالتالي", | |
| "علاوة على ذلك", | |
| "إضافة إلى ذلك", | |
| "من ناحية أخرى", | |
| "في هذا السياق", | |
| "جدير بالذكر", | |
| "ومن الجدير بالملاحظة", | |
| "وفي هذا الإطار", | |
| "ومن المهم أن نذكر", | |
| "وفي ضوء ما سبق" | |
| ] | |
| # قائمة من التعبيرات الشخصية | |
| personal_touches = [ | |
| "ومن الملفت للنظر", | |
| "ومن المثير للاهتمام", | |
| "ومما لا شك فيه", | |
| "وكما نلاحظ", | |
| "وكما يتضح لنا" | |
| ] | |
| paragraphs = text.split('\n\n') | |
| enhanced_paragraphs = [] | |
| for i, paragraph in enumerate(paragraphs): | |
| if len(paragraph.strip()) > 0: | |
| # إضافة كلمات ربط متنوعة | |
| if i > 0 and random.random() < 0.4: # 40% احتمالية | |
| paragraph = f"{random.choice(transitions)}, {paragraph}" | |
| # إضافة تعبيرات شخصية | |
| if random.random() < 0.3: # 30% احتمالية | |
| words = paragraph.split() | |
| insert_pos = random.randint(0, len(words) - 1) | |
| words.insert(insert_pos, random.choice(personal_touches)) | |
| paragraph = ' '.join(words) | |
| enhanced_paragraphs.append(paragraph) | |
| return '\n\n'.join(enhanced_paragraphs) | |
| def add_human_touch(text): | |
| """إضافة لمسة إنسانية للنص""" | |
| # إضافة تعبيرات شخصية | |
| personal_expressions = [ | |
| "في رأيي الشخصي", | |
| "من وجهة نظري", | |
| "كما أرى", | |
| "من خلال تجربتي", | |
| "بناءً على ملاحظاتي" | |
| ] | |
| # إضافة روابط عاطفية | |
| emotional_connections = [ | |
| "من المثير للاهتمام", | |
| "من المدهش", | |
| "من الملفت للنظر", | |
| "من المؤثر حقاً", | |
| "مما يجعلنا نشعر" | |
| ] | |
| # إضافة أمثلة من الحياة اليومية | |
| daily_examples = [ | |
| "على سبيل المثال في حياتنا اليومية", | |
| "كما نرى في واقعنا المعاصر", | |
| "وهذا ما نلاحظه في محيطنا", | |
| "كما يحدث معنا يومياً", | |
| "وهذا ما نختبره في حياتنا" | |
| ] | |
| # تقسيم النص إلى فقرات | |
| paragraphs = text.split('\n\n') | |
| enhanced_paragraphs = [] | |
| for i, paragraph in enumerate(paragraphs): | |
| if len(paragraph.strip()) > 0: | |
| # إضافة تعبيرات إنسانية بشكل عشوائي | |
| if random.random() < 0.3: # 30% احتمالية | |
| paragraph = f"{random.choice(personal_expressions)}, {paragraph}" | |
| if random.random() < 0.2: # 20% احتمالية | |
| paragraph = f"{paragraph} {random.choice(emotional_connections)}." | |
| if random.random() < 0.15: # 15% احتمالية | |
| paragraph = f"{paragraph} {random.choice(daily_examples)}." | |
| enhanced_paragraphs.append(paragraph) | |
| return '\n\n'.join(enhanced_paragraphs) | |
| def check_grammar_and_style(text): | |
| """تحسين القواعد والأسلوب""" | |
| # تصحيح الأخطاء الشائعة | |
| common_mistakes = { | |
| "الذي": "الذي", | |
| "الذين": "الذين", | |
| "التي": "التي", | |
| "اللذين": "اللذين", | |
| "اللتين": "اللتين" | |
| } | |
| for mistake, correction in common_mistakes.items(): | |
| text = text.replace(mistake, correction) | |
| # تحسين علامات الترقيم | |
| text = text.replace(" ،", "،") | |
| text = text.replace(" .", ".") | |
| text = text.replace(" ؛", "؛") | |
| text = text.replace(" :", ":") | |
| # تحسين المسافات | |
| text = re.sub(r'\s+', ' ', text) # توحيد المسافات | |
| text = re.sub(r'\s*\n\s*', '\n', text) # تنظيف المسافات حول الأسطر الجديدة | |
| # تحسين الأسلوب | |
| text = text.replace(" .", ".") | |
| text = text.replace(" ،", "،") | |
| text = text.replace("،،", "،") | |
| text = text.replace("..", ".") | |
| # إضافة مسافة بعد علامات الترقيم | |
| text = re.sub(r'([.،؛؟!])\s*([^\s])', r'\1 \2', text) | |
| return text | |
| def generate_additional_content(topic, style, words_needed): | |
| """توليد محتوى إضافي للوصول إلى عدد الكلمات المطلوب""" | |
| sections = [ | |
| f"وفي سياق متصل، يمكن الإشارة إلى أن {topic} يشهد تطورات مستمرة", | |
| f"ومن الجدير بالذكر أن دراسات حديثة في مجال {topic} قد أظهرت نتائج مثيرة للاهتمام", | |
| f"وعلاوة على ذلك، فإن التطبيقات العملية لـ {topic} تتنوع بشكل كبير" | |
| ] | |
| return " ".join(sections[:words_needed//50]) # تقريب تقديري لعدد الكلمات المطلوبة | |
| def trim_content(text, target_word_count): | |
| """تقليص المحتوى للوصول إلى عدد الكلمات المطلوب""" | |
| words = text.split() | |
| if len(words) <= target_word_count: | |
| return text | |
| # الحفاظ على المقدمة والخاتمة | |
| paragraphs = text.split("\n\n") | |
| intro = paragraphs[0] | |
| conclusion = paragraphs[-1] | |
| # تقليص المحتوى الرئيسي | |
| main_content = "\n\n".join(paragraphs[1:-1]) | |
| main_words = main_content.split() | |
| words_to_keep = target_word_count - len(intro.split()) - len(conclusion.split()) | |
| trimmed_main = " ".join(main_words[:words_to_keep]) | |
| return f"{intro}\n\n{trimmed_main}\n\n{conclusion}" | |
| def insert_additional_content(text, additional_content): | |
| """إدراج المحتوى الإضافي في المكان المناسب من المقال""" | |
| paragraphs = text.split("\n\n") | |
| # إدراج المحتوى قبل الخاتمة | |
| paragraphs.insert(-2, additional_content) | |
| return "\n\n".join(paragraphs) | |
| def generate_article(topic, article_type, word_count=1500, formality="رسمي"): | |
| # إنشاء مولد المقالات | |
| generator = ArticleGenerator() | |
| template = get_article_template(article_type) | |
| structure = template["structure"] | |
| style = template["style"] | |
| transitions = template["transitions"] | |
| # تعديل الأسلوب حسب مستوى الرسمية | |
| if formality == "رسمي": | |
| style = "أكاديمي رسمي" | |
| elif formality == "شبه رسمي": | |
| style = "إخباري موضوعي" | |
| else: # عادي | |
| style = "تعليمي تفاعلي" | |
| # توليد المحتوى مع البحث | |
| researched_content = generator.generate_content_with_research(topic, style) | |
| # تقسيم المحتوى إلى أقسام | |
| sections = [] | |
| content_parts = researched_content.split('\n\n') | |
| for i, section_type in enumerate(structure): | |
| start_idx = i * (len(content_parts) // len(structure)) | |
| end_idx = (i + 1) * (len(content_parts) // len(structure)) | |
| section_content = '\n\n'.join(content_parts[start_idx:end_idx]) | |
| sections.append({ | |
| "title": f"{section_type} {topic}", | |
| "content": section_content | |
| }) | |
| # إنشاء المقال | |
| article = { | |
| "title": generate_title(topic, style), | |
| "introduction": generate_introduction(topic, style, transitions), | |
| "main_content": sections, | |
| "conclusion": generate_conclusion(topic, style), | |
| "faq": generate_faq(topic, style) | |
| } | |
| # تنسيق المقال | |
| formatted_text = format_article(article) | |
| # تحسين المحتوى | |
| enhanced_text = enhance_text_variation(formatted_text) | |
| humanized_text = add_human_touch(enhanced_text) | |
| final_text = check_grammar_and_style(humanized_text) | |
| return final_text | |
| # إنشاء واجهة المستخدم | |
| with gr.Blocks(title="مساعد كتابة المقالات العربية") as demo: | |
| gr.Markdown(""" | |
| # 📝 مساعد كتابة المقالات العربية | |
| ### نظام متطور لإنشاء مقالات عربية احترافية ومتنوعة | |
| """) | |
| with gr.Tab("إنشاء مقال احترافي"): | |
| with gr.Row(): | |
| topic_input = gr.Textbox( | |
| label="موضوع المقال", | |
| placeholder="أدخل موضوع المقال هنا...", | |
| lines=2 | |
| ) | |
| article_type = gr.Dropdown( | |
| choices=["علمي", "صحفي", "تقني", "تعليمي", "تسويقي", "اجتماعي", "رأي", "ثقافي"], | |
| label="نوع المقال", | |
| value="علمي" | |
| ) | |
| with gr.Row(): | |
| word_count_slider = gr.Slider( | |
| minimum=500, | |
| maximum=3000, | |
| value=1500, | |
| step=100, | |
| label="عدد الكلمات المطلوب" | |
| ) | |
| formality_level = gr.Dropdown( | |
| choices=["رسمي", "شبه رسمي", "عادي"], | |
| label="مستوى الرسمية", | |
| value="رسمي" | |
| ) | |
| with gr.Row(): | |
| generate_btn = gr.Button("إنشاء المقال", variant="primary") | |
| copy_btn = gr.Button("نسخ المقال") | |
| output = gr.Textbox( | |
| label="المقال المُنشأ", | |
| lines=30, | |
| show_copy_button=True | |
| ) | |
| word_count_output = gr.Textbox(label="عدد الكلمات الفعلي") | |
| def generate_and_format(topic, article_type, word_count, formality): | |
| article = generate_article(topic, article_type, word_count, formality) | |
| return article | |
| def count_words(text): | |
| words = text.split() | |
| return f"عدد الكلمات: {len(words)}" | |
| generate_btn.click( | |
| fn=generate_and_format, | |
| inputs=[topic_input, article_type, word_count_slider, formality_level], | |
| outputs=[output] | |
| ).then( | |
| fn=count_words, | |
| inputs=[output], | |
| outputs=[word_count_output] | |
| ) | |
| copy_btn.click( | |
| fn=lambda x: x, | |
| inputs=[output], | |
| outputs=[output] | |
| ) | |
| demo.launch() | |