Spaces:
Sleeping
Sleeping
# -*- coding: utf-8 -*- | |
""" | |
مساعد الطالب الذكي - نسخة محسنة | |
تطبيق تعليمي متكامل للطلاب باللغة العربية | |
""" | |
import gradio as gr | |
import torch | |
import random | |
import datetime | |
import json | |
from datetime import datetime, timedelta | |
# تحقق من توفر المكتبات وتثبيتها إذا لزم الأمر | |
try: | |
from transformers import pipeline, AutoTokenizer, AutoModelForSeq2SeqLM | |
except ImportError: | |
import subprocess | |
import sys | |
subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'transformers']) | |
from transformers import pipeline, AutoTokenizer, AutoModelForSeq2SeqLM | |
# ---------------------- وظائف معالجة النصوص ---------------------- # | |
def summarize_text(text, max_length=150): | |
"""تلخيص النص العربي باستخدام نموذج مناسب""" | |
if not text or len(text.strip()) < 50: | |
return "النص قصير جداً أو فارغ. يرجى إدخال نص أطول للتلخيص." | |
try: | |
# استخدام نموذج خفيف للتلخيص | |
summarizer = pipeline( | |
"summarization", | |
model="yalsaffar/mt5-small-Arabic-Summarization", | |
device=0 if torch.cuda.is_available() else -1 | |
) | |
# تقسيم النص إلى أجزاء إذا كان طويلاً | |
max_chunk_length = 512 | |
chunks = [text[i:i+max_chunk_length] for i in range(0, len(text), max_chunk_length)] | |
summaries = [] | |
for chunk in chunks[:3]: # نأخذ أول 3 أجزاء فقط لتجنب استهلاك الموارد | |
if len(chunk.strip()) > 50: # تجاهل الأجزاء القصيرة جداً | |
summary = summarizer(chunk, max_length=max_length, min_length=30, do_sample=False) | |
summaries.append(summary[0]['summary_text']) | |
if not summaries: | |
return "لم نتمكن من تلخيص النص. يرجى التأكد من أن النص مكتوب باللغة العربية وأنه يحتوي على معلومات كافية." | |
return " ".join(summaries) | |
except Exception as e: | |
return f"حدث خطأ أثناء التلخيص: {str(e)}" | |
def generate_questions(text, num_questions=3): | |
"""توليد أسئلة من النص العربي""" | |
if not text or len(text.strip()) < 50: | |
return "النص قصير جداً أو فارغ. يرجى إدخال نص أطول لتوليد الأسئلة." | |
try: | |
# استخدام نموذج خفيف لتوليد الأسئلة | |
# نظراً لأن النماذج المتخصصة قد تكون ثقيلة، نستخدم نهجاً مبسطاً | |
sentences = text.split('.') | |
questions = [] | |
# اختيار جمل عشوائية وتحويلها إلى أسئلة | |
selected_sentences = random.sample(sentences, min(num_questions + 2, len(sentences))) | |
for sentence in selected_sentences: | |
sentence = sentence.strip() | |
if len(sentence) > 15: # تجاهل الجمل القصيرة جداً | |
# تحويل الجملة إلى سؤال بطريقة بسيطة | |
if "هو" in sentence: | |
question = sentence.replace("هو", "ما هو") + "؟" | |
elif "هي" in sentence: | |
question = sentence.replace("هي", "ما هي") + "؟" | |
elif "كان" in sentence: | |
question = sentence.replace("كان", "ماذا كان") + "؟" | |
elif "يمكن" in sentence: | |
question = sentence.replace("يمكن", "كيف يمكن") + "؟" | |
else: | |
# إضافة كلمة استفهام في بداية الجملة | |
question_starters = ["ما هو", "كيف", "لماذا", "متى", "أين"] | |
question = random.choice(question_starters) + " " + sentence + "؟" | |
questions.append(question) | |
if len(questions) >= num_questions: | |
break | |
if not questions: | |
return "لم نتمكن من توليد أسئلة من هذا النص. يرجى تجربة نص آخر." | |
return "\n\n".join(questions) | |
except Exception as e: | |
return f"حدث خطأ أثناء توليد الأسئلة: {str(e)}" | |
def extract_keywords(text, num_keywords=10): | |
"""استخراج الكلمات المفتاحية من النص العربي""" | |
if not text or len(text.strip()) < 50: | |
return "النص قصير جداً أو فارغ. يرجى إدخال نص أطول لاستخراج الكلمات المفتاحية." | |
try: | |
# تنظيف النص | |
text = text.replace('\n', ' ').replace('\r', ' ') | |
words = text.split() | |
# إزالة الكلمات القصيرة والحروف | |
stop_words = ["في", "من", "على", "إلى", "عن", "مع", "هذا", "هذه", "ذلك", "تلك", | |
"هو", "هي", "أنا", "نحن", "أنت", "أنتم", "هم", "و", "أو", "ثم", "لكن", | |
"ف", "ب", "ل", "ك", "و", "ا", "ال", "إن", "أن", "لا", "ما", "لم"] | |
filtered_words = [word for word in words if len(word) > 2 and word not in stop_words] | |
# حساب تكرار الكلمات | |
word_freq = {} | |
for word in filtered_words: | |
if word in word_freq: | |
word_freq[word] += 1 | |
else: | |
word_freq[word] = 1 | |
# ترتيب الكلمات حسب التكرار | |
sorted_words = sorted(word_freq.items(), key=lambda x: x[1], reverse=True) | |
# اختيار الكلمات الأكثر تكراراً | |
top_keywords = sorted_words[:num_keywords] | |
if not top_keywords: | |
return "لم نتمكن من استخراج كلمات مفتاحية من هذا النص. يرجى تجربة نص آخر." | |
# تنسيق النتيجة | |
result = "الكلمات المفتاحية:\n\n" | |
for i, (word, freq) in enumerate(top_keywords, 1): | |
result += f"{i}. {word} (التكرار: {freq})\n" | |
return result | |
except Exception as e: | |
return f"حدث خطأ أثناء استخراج الكلمات المفتاحية: {str(e)}" | |
def generate_mind_map(text): | |
"""إنشاء خريطة ذهنية بسيطة من النص العربي""" | |
if not text or len(text.strip()) < 50: | |
return "النص قصير جداً أو فارغ. يرجى إدخال نص أطول لإنشاء الخريطة الذهنية." | |
try: | |
# تقسيم النص إلى فقرات وجمل | |
paragraphs = text.split('\n') | |
sentences = text.split('.') | |
# استخراج العنوان الرئيسي (أول جملة أو أول 50 حرف) | |
main_title = sentences[0].strip() if sentences and len(sentences[0]) > 5 else text[:50] + "..." | |
# استخراج العناوين الفرعية (بداية كل فقرة أو جمل مختارة) | |
subtitles = [] | |
# من الفقرات | |
for para in paragraphs: | |
if len(para.strip()) > 20: | |
first_sentence = para.split('.')[0].strip() | |
if first_sentence and len(first_sentence) > 15 and first_sentence not in subtitles: | |
subtitles.append(first_sentence) | |
# إذا لم نجد عناوين فرعية كافية، نأخذ من الجمل | |
if len(subtitles) < 3: | |
for sentence in sentences[1:]: | |
if len(sentence.strip()) > 15 and sentence.strip() not in subtitles: | |
subtitles.append(sentence.strip()) | |
if len(subtitles) >= 5: | |
break | |
# إنشاء الخريطة الذهنية بتنسيق Markdown | |
mind_map = f"# {main_title}\n\n" | |
for i, subtitle in enumerate(subtitles[:5], 1): | |
mind_map += f"## {subtitle}\n" | |
# إضافة بعض النقاط تحت كل عنوان فرعي | |
related_sentences = [s.strip() for s in sentences if subtitle not in s and len(s.strip()) > 10] | |
for j, related in enumerate(random.sample(related_sentences, min(3, len(related_sentences))), 1): | |
if len(related) > 10: | |
mind_map += f" - {related}\n" | |
mind_map += "\n" | |
return mind_map | |
except Exception as e: | |
return f"حدث خطأ أثناء إنشاء الخريطة الذهنية: {str(e)}" | |
def create_flashcards(text, num_cards=5): | |
"""إنشاء بطاقات تعليمية من النص العربي""" | |
if not text or len(text.strip()) < 50: | |
return "النص قصير جداً أو فارغ. يرجى إدخال نص أطول لإنشاء البطاقات التعليمية." | |
try: | |
# تقسيم النص إلى جمل | |
sentences = [s.strip() for s in text.split('.') if len(s.strip()) > 15] | |
if len(sentences) < 2: | |
return "النص لا يحتوي على جمل كافية لإنشاء البطاقات التعليمية. يرجى إدخال نص أطول." | |
# إنشاء البطاقات التعليمية | |
flashcards = [] | |
# اختيار جمل عشوائية | |
selected_sentences = random.sample(sentences, min(num_cards * 2, len(sentences))) | |
for i in range(0, len(selected_sentences) - 1, 2): | |
if i + 1 < len(selected_sentences): | |
question = selected_sentences[i] | |
answer = selected_sentences[i + 1] | |
# تحويل الجملة الأولى إلى سؤال إذا لم تكن كذلك | |
if not question.endswith('?') and not question.endswith('؟'): | |
question_starters = ["ما هو", "كيف", "لماذا", "اشرح", "وضح"] | |
question = random.choice(question_starters) + " " + question + "؟" | |
flashcards.append({"question": question, "answer": answer}) | |
if len(flashcards) >= num_cards: | |
break | |
if not flashcards: | |
return "لم نتمكن من إنشاء بطاقات تعليمية من هذا النص. يرجى تجربة نص آخر." | |
# تنسيق النتيجة كنص بدلاً من JSON | |
result = "البطاقات التعليمية:\n\n" | |
for i, card in enumerate(flashcards, 1): | |
result += f"بطاقة {i}:\n" | |
result += f"السؤال: {card['question']}\n" | |
result += f"الإجابة: {card['answer']}\n\n" | |
return result | |
except Exception as e: | |
return f"حدث خطأ أثناء إنشاء البطاقات التعليمية: {str(e)}" | |
def create_study_schedule(subject_name, start_date_str, exam_date_str, importance=3): | |
"""إنشاء جدول مراجعة باستخدام تقنية المراجعة المتباعدة""" | |
try: | |
# تحويل التواريخ من نص إلى كائنات datetime | |
try: | |
start_date = datetime.strptime(start_date_str, "%Y-%m-%d") | |
exam_date = datetime.strptime(exam_date_str, "%Y-%m-%d") | |
except ValueError: | |
return "صيغة التاريخ غير صحيحة. يرجى استخدام الصيغة YYYY-MM-DD (مثال: 2025-06-20)." | |
if start_date >= exam_date: | |
return "تاريخ بدء المراجعة يجب أن يكون قبل تاريخ الامتحان." | |
# حساب عدد الأيام المتاحة للمراجعة | |
days_available = (exam_date - start_date).days | |
if days_available < 1: | |
return "لا توجد أيام كافية للمراجعة. يرجى اختيار تاريخ بدء أبكر." | |
# تحديد عدد جلسات المراجعة بناءً على الأهمية وعدد الأيام المتاحة | |
if importance <= 1: | |
num_sessions = min(3, days_available) | |
elif importance == 2: | |
num_sessions = min(5, days_available) | |
else: # importance >= 3 | |
num_sessions = min(7, days_available) | |
# إنشاء جدول المراجعة باستخدام تقنية المراجعة المتباعدة | |
schedule = [] | |
# الجلسة الأولى تكون في يوم البدء | |
current_date = start_date | |
schedule.append({ | |
"session": 1, | |
"date": current_date.strftime("%Y-%m-%d"), | |
"day": ["الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد"][current_date.weekday()], | |
"focus": "مراجعة شاملة للمادة" | |
}) | |
# توزيع باقي الجلسات بشكل متباعد | |
intervals = [1, 2, 4, 7, 12, 20] # فترات المراجعة المتباعدة بالأيام | |
for i in range(1, num_sessions): | |
# حساب تاريخ الجلسة التالية | |
if i < len(intervals): | |
days_to_add = intervals[i-1] | |
else: | |
days_to_add = intervals[-1] | |
current_date = current_date + timedelta(days=days_to_add) | |
# التأكد من أن تاريخ الجلسة قبل تاريخ الامتحان | |
if current_date >= exam_date: | |
# إذا تجاوزنا تاريخ الامتحان، نضع الجلسة قبل يوم من الامتحان | |
current_date = exam_date - timedelta(days=1) | |
# تحديد التركيز لكل جلسة | |
if i == num_sessions - 1: | |
focus = "مراجعة نهائية وحل أسئلة سابقة" | |
elif i == 1: | |
focus = "مراجعة المفاهيم الأساسية" | |
elif i == 2: | |
focus = "حل تمارين وأمثلة" | |
else: | |
focus = "مراجعة النقاط الصعبة" | |
schedule.append({ | |
"session": i + 1, | |
"date": current_date.strftime("%Y-%m-%d"), | |
"day": ["الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد"][current_date.weekday()], | |
"focus": focus | |
}) | |
# إذا وصلنا إلى يوم قبل الامتحان، نتوقف | |
if current_date >= exam_date - timedelta(days=1): | |
break | |
# إضافة يوم الامتحان | |
schedule.append({ | |
"session": "الامتحان", | |
"date": exam_date.strftime("%Y-%m-%d"), | |
"day": ["الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد"][exam_date.weekday()], | |
"focus": "يوم الامتحان" | |
}) | |
# تنسيق النتيجة كنص | |
result = f"جدول المراجعة لمادة: {subject_name}\n\n" | |
for session in schedule: | |
if session["session"] == "الامتحان": | |
result += f"📝 {session['date']} ({session['day']}): {session['focus']}\n" | |
else: | |
result += f"📚 جلسة {session['session']}: {session['date']} ({session['day']}) - {session['focus']}\n" | |
return result | |
except Exception as e: | |
return f"حدث خطأ أثناء إنشاء جدول المراجعة: {str(e)}" | |
def analyze_exam_questions(questions_text): | |
"""تحليل أنماط أسئلة الامتحانات""" | |
if not questions_text or len(questions_text.strip()) < 20: | |
return "النص قصير جداً أو فارغ. يرجى إدخال أسئلة امتحانات سابقة للتحليل." | |
try: | |
# تقسيم النص إلى أسئلة منفصلة | |
questions = [q.strip() for q in questions_text.split('\n') if len(q.strip()) > 5 and ('؟' in q or '?' in q)] | |
if len(questions) < 2: | |
return "لم نتمكن من تحديد أسئلة كافية للتحليل. يرجى التأكد من فصل كل سؤال بسطر جديد وإنهاء الأسئلة بعلامة استفهام." | |
# تحليل أنواع الأسئلة | |
question_types = { | |
"تعريف": 0, | |
"شرح": 0, | |
"مقارنة": 0, | |
"تحليل": 0, | |
"تطبيق": 0, | |
"أخرى": 0 | |
} | |
for q in questions: | |
q_lower = q.lower() | |
if any(word in q_lower for word in ["عرف", "ما هو", "ما هي", "من هو"]): | |
question_types["تعريف"] += 1 | |
elif any(word in q_lower for word in ["اشرح", "وضح", "بين", "فسر"]): | |
question_types["شرح"] += 1 | |
elif any(word in q_lower for word in ["قارن", "الفرق", "الاختلاف"]): | |
question_types["مقارنة"] += 1 | |
elif any(word in q_lower for word in ["حلل", "ناقش", "قيم"]): | |
question_types["تحليل"] += 1 | |
elif any(word in q_lower for word in ["طبق", "استخدم", "احسب"]): | |
question_types["تطبيق"] += 1 | |
else: | |
question_types["أخرى"] += 1 | |
# تحليل الكلمات المفتاحية | |
all_words = " ".join(questions).split() | |
word_freq = {} | |
stop_words = ["ما", "هو", "هي", "كيف", "لماذا", "متى", "أين", "من", "في", "على", "إلى", "عن", "مع"] | |
for word in all_words: | |
if len(word) > 2 and word not in stop_words: | |
if word in word_freq: | |
word_freq[word] += 1 | |
else: | |
word_freq[word] = 1 | |
# ترتيب الكلمات حسب التكرار | |
sorted_words = sorted(word_freq.items(), key=lambda x: x[1], reverse=True) | |
top_keywords = sorted_words[:10] | |
# تنسيق النتيجة | |
result = f"تحليل {len(questions)} سؤال:\n\n" | |
result += "أنواع الأسئلة:\n" | |
for q_type, count in question_types.items(): | |
if count > 0: | |
percentage = (count / len(questions)) * 100 | |
result += f"- {q_type}: {count} ({percentage:.1f}%)\n" | |
result += "\nالمواضيع الأكثر تكراراً:\n" | |
for word, freq in top_keywords: | |
result += f"- {word}: {freq} مرات\n" | |
result += "\nتوصيات للمراجعة:\n" | |
# تحديد نوع السؤال الأكثر تكراراً | |
most_common_type = max(question_types.items(), key=lambda x: x[1])[0] | |
result += f"1. التركيز على الإجابة على أسئلة {most_common_type}\n" | |
# توصيات بناءً على الكلمات المفتاحية | |
result += f"2. مراجعة المواضيع المتعلقة بـ: {', '.join([w for w, _ in top_keywords[:5]])}\n" | |
# توصية عامة | |
result += "3. التدرب على الإجابة على الأسئلة بأسلوب منظم ومختصر\n" | |
return result | |
except Exception as e: | |
return f"حدث خطأ أثناء تحليل أسئلة الامتحانات: {str(e)}" | |
# ---------------------- واجهة المستخدم ---------------------- # | |
def create_interface(): | |
"""إنشاء واجهة المستخدم باستخدام Gradio""" | |
# الشعار والعنوان | |
title = """ | |
<div style="text-align: center; margin-bottom: 1rem"> | |
<h1>مساعد الطالب الذكي</h1> | |
<p>أداة تعليمية متكاملة للطلاب باستخدام الذكاء الاصطناعي</p> | |
</div> | |
""" | |
# إنشاء واجهة المستخدم | |
with gr.Blocks(css="footer {visibility: hidden}") as demo: | |
gr.HTML(title) | |
with gr.Tabs(): | |
# علامة تبويب تلخيص النصوص | |
with gr.Tab("تلخيص النصوص"): | |
with gr.Row(): | |
with gr.Column(): | |
summarize_input = gr.Textbox( | |
label="أدخل النص المراد تلخيصه", | |
placeholder="أدخل النص هنا...", | |
lines=10 | |
) | |
summarize_length = gr.Slider( | |
label="طول التلخيص", | |
minimum=50, | |
maximum=300, | |
value=150, | |
step=10 | |
) | |
summarize_button = gr.Button("تلخيص النص") | |
with gr.Column(): | |
summarize_output = gr.Textbox( | |
label="نتيجة التلخيص", | |
lines=10 | |
) | |
summarize_button.click( | |
fn=summarize_text, | |
inputs=[summarize_input, summarize_length], | |
outputs=summarize_output | |
) | |
# علامة تبويب توليد الأسئلة | |
with gr.Tab("توليد الأسئلة"): | |
with gr.Row(): | |
with gr.Column(): | |
questions_input = gr.Textbox( | |
label="أدخل النص المراد توليد أسئلة منه", | |
placeholder="أدخل النص هنا...", | |
lines=10 | |
) | |
questions_count = gr.Slider( | |
label="عدد الأسئلة", | |
minimum=1, | |
maximum=10, | |
value=3, | |
step=1 | |
) | |
questions_button = gr.Button("توليد الأسئلة") | |
with gr.Column(): | |
questions_output = gr.Textbox( | |
label="الأسئلة المولدة", | |
lines=10 | |
) | |
questions_button.click( | |
fn=generate_questions, | |
inputs=[questions_input, questions_count], | |
outputs=questions_output | |
) | |
# علامة تبويب استخراج الكلمات المفتاحية | |
with gr.Tab("استخراج الكلمات المفتاحية"): | |
with gr.Row(): | |
with gr.Column(): | |
keywords_input = gr.Textbox( | |
label="أدخل النص المراد استخراج الكلمات المفتاحية منه", | |
placeholder="أدخل النص هنا...", | |
lines=10 | |
) | |
keywords_count = gr.Slider( | |
label="عدد الكلمات المفتاحية", | |
minimum=5, | |
maximum=20, | |
value=10, | |
step=1 | |
) | |
keywords_button = gr.Button("استخراج الكلمات المفتاحية") | |
with gr.Column(): | |
keywords_output = gr.Textbox( | |
label="الكلمات المفتاحية", | |
lines=10 | |
) | |
keywords_button.click( | |
fn=extract_keywords, | |
inputs=[keywords_input, keywords_count], | |
outputs=keywords_output | |
) | |
# علامة تبويب الخرائط الذهنية | |
with gr.Tab("الخرائط الذهنية"): | |
with gr.Row(): | |
with gr.Column(): | |
mindmap_input = gr.Textbox( | |
label="أدخل النص المراد إنشاء خريطة ذهنية له", | |
placeholder="أدخل النص هنا...", | |
lines=10 | |
) | |
mindmap_button = gr.Button("إنشاء الخريطة الذهنية") | |
with gr.Column(): | |
mindmap_output = gr.Markdown( | |
label="الخريطة الذهنية" | |
) | |
mindmap_button.click( | |
fn=generate_mind_map, | |
inputs=mindmap_input, | |
outputs=mindmap_output | |
) | |
# علامة تبويب البطاقات التعليمية | |
with gr.Tab("البطاقات التعليمية"): | |
with gr.Row(): | |
with gr.Column(): | |
flashcards_input = gr.Textbox( | |
label="أدخل النص المراد إنشاء بطاقات تعليمية منه", | |
placeholder="أدخل النص هنا...", | |
lines=10 | |
) | |
flashcards_count = gr.Slider( | |
label="عدد البطاقات", | |
minimum=3, | |
maximum=10, | |
value=5, | |
step=1 | |
) | |
flashcards_button = gr.Button("إنشاء البطاقات التعليمية") | |
with gr.Column(): | |
flashcards_output = gr.Textbox( | |
label="البطاقات التعليمية", | |
lines=15 | |
) | |
flashcards_button.click( | |
fn=create_flashcards, | |
inputs=[flashcards_input, flashcards_count], | |
outputs=flashcards_output | |
) | |
# علامة تبويب منظم المراجعات | |
with gr.Tab("منظم المراجعات"): | |
with gr.Row(): | |
with gr.Column(): | |
subject_name = gr.Textbox( | |
label="اسم المادة", | |
placeholder="مثال: الرياضيات" | |
) | |
start_date = gr.Textbox( | |
label="تاريخ بدء المراجعة (YYYY-MM-DD)", | |
placeholder="مثال: 2025-06-20", | |
value=datetime.now().strftime("%Y-%m-%d") | |
) | |
exam_date = gr.Textbox( | |
label="تاريخ الامتحان (YYYY-MM-DD)", | |
placeholder="مثال: 2025-07-10", | |
value=(datetime.now() + timedelta(days=14)).strftime("%Y-%m-%d") | |
) | |
importance = gr.Slider( | |
label="أهمية المادة", | |
minimum=1, | |
maximum=5, | |
value=3, | |
step=1 | |
) | |
schedule_button = gr.Button("إنشاء جدول المراجعة") | |
with gr.Column(): | |
schedule_output = gr.Textbox( | |
label="جدول المراجعة", | |
lines=15 | |
) | |
schedule_button.click( | |
fn=create_study_schedule, | |
inputs=[subject_name, start_date, exam_date, importance], | |
outputs=schedule_output | |
) | |
# علامة تبويب تحليل أسئلة الامتحانات | |
with gr.Tab("تحليل أسئلة الامتحانات"): | |
with gr.Row(): | |
with gr.Column(): | |
exam_questions = gr.Textbox( | |
label="أدخل أسئلة الامتحانات السابقة (سؤال واحد في كل سطر)", | |
placeholder="مثال:\nما هو تعريف الخلية؟\nاشرح نظرية فيثاغورس؟\nقارن بين الخلية النباتية والخلية الحيوانية؟", | |
lines=10 | |
) | |
analyze_button = gr.Button("تحليل الأسئلة") | |
with gr.Column(): | |
analysis_output = gr.Textbox( | |
label="نتائج التحليل", | |
lines=15 | |
) | |
analyze_button.click( | |
fn=analyze_exam_questions, | |
inputs=exam_questions, | |
outputs=analysis_output | |
) | |
# معلومات إضافية | |
gr.Markdown(""" | |
### كيفية الاستخدام | |
1. اختر الميزة التي تريد استخدامها من علامات التبويب أعلاه | |
2. أدخل النص المطلوب واضبط الإعدادات حسب الحاجة | |
3. انقر على الزر المناسب للحصول على النتيجة | |
### ملاحظات | |
- يعمل التطبيق بشكل أفضل مع النصوص العربية الفصحى | |
- قد يستغرق تحميل النماذج بعض الوقت عند أول استخدام | |
- للحصول على أفضل النتائج، استخدم نصوصًا واضحة وخالية من الأخطاء | |
""") | |
return demo | |
# إنشاء واجهة المستخدم | |
demo = create_interface() | |
# نقطة الدخول الرئيسية لـ Hugging Face Spaces | |
if __name__ == "__main__": | |
demo.launch() | |