thomson99's picture
Upload app.py
ed3c0cc verified
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()