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() | |