Spaces:
Sleeping
Sleeping
import re | |
import numpy as np | |
from transformers import pipeline | |
import nltk | |
from nltk.tokenize import sent_tokenize | |
from collections import Counter | |
import os | |
# تنزيل البيانات اللازمة لـ NLTK إذا لم تكن موجودة | |
try: | |
nltk.data.find('tokenizers/punkt') | |
except LookupError: | |
nltk.download('punkt') | |
def analyze_content_readability(text): | |
""" | |
تحليل قابلية قراءة النص | |
""" | |
# التحقق من وجود النص | |
if not text or not isinstance(text, str): | |
return { | |
'level': 'غير محدد', | |
'avg_sentence_length': 0, | |
'avg_word_length': 0, | |
'word_count': 0, | |
'sentence_count': 0 | |
} | |
# تقسيم النص إلى جمل | |
sentences = sent_tokenize(text) | |
sentences = [s.strip() for s in sentences if s.strip()] | |
# حساب عدد الجمل | |
sentence_count = len(sentences) | |
# تقسيم النص إلى كلمات | |
words = re.findall(r'\b\w+\b', text) | |
# حساب عدد الكلمات | |
word_count = len(words) | |
# حساب متوسط طول الجملة | |
avg_sentence_length = word_count / sentence_count if sentence_count > 0 else 0 | |
# حساب متوسط طول الكلمة | |
avg_word_length = sum(len(word) for word in words) / word_count if word_count > 0 else 0 | |
# تقييم مستوى القراءة | |
if avg_sentence_length > 20 or avg_word_length > 6: | |
level = 'صعب' | |
elif avg_sentence_length > 15 or avg_word_length > 5: | |
level = 'متوسط' | |
else: | |
level = 'سهل' | |
return { | |
'level': level, | |
'avg_sentence_length': avg_sentence_length, | |
'avg_word_length': avg_word_length, | |
'word_count': word_count, | |
'sentence_count': sentence_count | |
} | |
def analyze_sentiment(text): | |
""" | |
تحليل المشاعر في النص | |
""" | |
# التحقق من وجود النص | |
if not text or not isinstance(text, str): | |
return { | |
'label': 'NEUTRAL', | |
'score': 0.5 | |
} | |
try: | |
# استخدام نموذج تحليل المشاعر | |
sentiment_analyzer = pipeline("sentiment-analysis") | |
result = sentiment_analyzer(text) | |
return result[0] | |
except Exception as e: | |
print(f"خطأ في تحليل المشاعر: {str(e)}") | |
# في حالة حدوث خطأ، إرجاع تحليل بسيط | |
positive_words = ["رائع", "جميل", "ممتاز", "فاخر", "مريح", "متميز", "مثالي"] | |
negative_words = ["سيء", "رديء", "مزعج", "مكلف", "صغير", "قديم"] | |
positive_count = sum(1 for word in positive_words if word in text.lower()) | |
negative_count = sum(1 for word in negative_words if word in text.lower()) | |
if positive_count > negative_count: | |
return {"label": "POSITIVE", "score": 0.8} | |
elif negative_count > positive_count: | |
return {"label": "NEGATIVE", "score": 0.8} | |
else: | |
return {"label": "NEUTRAL", "score": 0.5} | |
def improve_content(text, target_audience): | |
""" | |
تحسين المحتوى بناءً على الجمهور المستهدف | |
""" | |
# التحقق من وجود النص | |
if not text or not isinstance(text, str): | |
return { | |
'readability': { | |
'level': 'غير محدد', | |
'avg_sentence_length': 0, | |
'word_count': 0, | |
'sentence_count': 0 | |
}, | |
'improvements': [] | |
} | |
# تحليل قابلية القراءة | |
readability = analyze_content_readability(text) | |
# قائمة التحسينات | |
improvements = [] | |
# تحسينات بناءً على الجمهور المستهدف | |
if target_audience == "عائلات": | |
if readability['level'] == 'صعب': | |
improvements.append("تبسيط اللغة لتناسب العائلات") | |
if "أطفال" not in text.lower() and "عائل" not in text.lower(): | |
improvements.append("إضافة معلومات عن أنشطة الأطفال") | |
if "آمن" not in text.lower() and "أمان" not in text.lower(): | |
improvements.append("التأكيد على عوامل الأمان للعائلات") | |
elif target_audience == "شباب": | |
if "مغامرة" not in text.lower() and "نشاط" not in text.lower(): | |
improvements.append("إضافة معلومات عن الأنشطة والمغامرات") | |
if "حفلات" not in text.lower() and "سهرات" not in text.lower(): | |
improvements.append("ذكر الأنشطة الليلية والترفيهية") | |
if "رياضة" not in text.lower() and "رياضي" not in text.lower(): | |
improvements.append("إضافة معلومات عن الأنشطة الرياضية") | |
elif target_audience == "كبار السن": | |
if readability['level'] == 'صعب': | |
improvements.append("تبسيط اللغة وتقصير الجمل") | |
if "هدوء" not in text.lower() and "راحة" not in text.lower(): | |
improvements.append("التركيز على الراحة والهدوء") | |
if "صحي" not in text.lower() and "صحة" not in text.lower(): | |
improvements.append("إضافة معلومات عن الخدمات الصحية والرعاية") | |
# تحسينات عامة | |
if readability['avg_sentence_length'] > 25: | |
improvements.append("تقصير الجمل لتحسين قابلية القراءة") | |
if readability['word_count'] < 100: | |
improvements.append("إضافة المزيد من المحتوى لزيادة الشمولية") | |
if "صور" not in text.lower() and "صورة" not in text.lower(): | |
improvements.append("إضافة وصف للصور والمناظر") | |
if "سعر" not in text.lower() and "تكلفة" not in text.lower() and "جنيه" not in text.lower(): | |
improvements.append("إضافة معلومات عن الأسعار والتكاليف") | |
return { | |
'readability': readability, | |
'improvements': improvements | |
} | |
def extract_key_phrases(text, num_phrases=5): | |
""" | |
استخراج العبارات الرئيسية من النص | |
""" | |
# التحقق من وجود النص | |
if not text or not isinstance(text, str): | |
return [] | |
try: | |
# تقسيم النص إلى جمل | |
sentences = sent_tokenize(text) | |
# إزالة الجمل القصيرة جداً | |
sentences = [s for s in sentences if len(s.split()) > 3] | |
if not sentences: | |
return [] | |
# ترتيب الجمل حسب الطول (افتراض أن الجمل الأطول قد تحتوي على معلومات أكثر أهمية) | |
sorted_sentences = sorted(sentences, key=lambda x: len(x.split()), reverse=True) | |
# اختيار أهم الجمل | |
key_phrases = sorted_sentences[:num_phrases] | |
return key_phrases | |
except Exception as e: | |
print(f"خطأ في استخراج العبارات الرئيسية: {str(e)}") | |
return [] | |
def analyze_content_completeness(text, chalet_data=None): | |
""" | |
تحليل اكتمال المحتوى | |
""" | |
# التحقق من وجود النص | |
if not text or not isinstance(text, str): | |
return { | |
'completeness_score': 0, | |
'missing_elements': ['وصف الشاليه', 'الموقع', 'المرافق', 'الأسعار', 'الخدمات'] | |
} | |
# العناصر الأساسية التي يجب أن يتضمنها المحتوى | |
essential_elements = { | |
'وصف الشاليه': ['شاليه', 'منتجع', 'فيلا'], | |
'الموقع': ['يقع', 'موقع', 'مكان', 'بالقرب من'], | |
'المرافق': ['مسبح', 'شاطئ', 'حديقة', 'تراس', 'مطبخ', 'غرفة', 'حمام'], | |
'الأسعار': ['سعر', 'تكلفة', 'جنيه', 'ليلة', 'يوم'], | |
'الخدمات': ['خدمة', 'واي فاي', 'تكييف', 'تنظيف', 'استقبال'] | |
} | |
# إذا كانت بيانات الشاليه متوفرة، أضف عناصر خاصة | |
if chalet_data and isinstance(chalet_data, dict): | |
if 'target_audience' in chalet_data: | |
if chalet_data['target_audience'] == 'عائلات': | |
essential_elements['أنشطة للأطفال'] = ['أطفال', 'عائلة', 'ألعاب', 'ترفيه'] | |
elif chalet_data['target_audience'] == 'شباب': | |
essential_elements['أنشطة للشباب'] = ['رياضة', 'مغامرة', 'حفلات', 'نشاط'] | |
# تحقق من وجود كل عنصر في النص | |
missing_elements = [] | |
found_elements = [] | |
for element, keywords in essential_elements.items(): | |
if not any(keyword in text.lower() for keyword in keywords): | |
missing_elements.append(element) | |
else: | |
found_elements.append(element) | |
# حساب درجة الاكتمال | |
completeness_score = len(found_elements) / len(essential_elements) * 100 | |
return { | |
'completeness_score': completeness_score, | |
'missing_elements': missing_elements, | |
'found_elements': found_elements | |
} | |
def compare_contents(text1, text2): | |
""" | |
مقارنة محتويين لتحديد أيهما أفضل | |
""" | |
# التحقق من وجود النصوص | |
if not text1 or not text2 or not isinstance(text1, str) or not isinstance(text2, str): | |
return { | |
'better_content': 'غير محدد', | |
'comparison': {} | |
} | |
# تحليل قابلية القراءة | |
readability1 = analyze_content_readability(text1) | |
readability2 = analyze_content_readability(text2) | |
# تحليل المشاعر | |
sentiment1 = analyze_sentiment(text1) | |
sentiment2 = analyze_sentiment(text2) | |
# تحليل الاكتمال | |
completeness1 = analyze_content_completeness(text1) | |
completeness2 = analyze_content_completeness(text2) | |
# تحويل تقييم المشاعر إلى قيمة رقمية | |
sentiment_score1 = sentiment1['score'] if sentiment1['label'] == 'POSITIVE' else (0.5 if sentiment1['label'] == 'NEUTRAL' else 1 - sentiment1['score']) | |
sentiment_score2 = sentiment2['score'] if sentiment2['label'] == 'POSITIVE' else (0.5 if sentiment2['label'] == 'NEUTRAL' else 1 - sentiment2['score']) | |
# حساب الدرجة الإجمالية | |
# الوزن: قابلية القراءة (30%)، المشاعر (30%)، الاكتمال (40%) | |
readability_score1 = 1 if readability1['level'] == 'سهل' else (0.7 if readability1['level'] == 'متوسط' else 0.4) | |
readability_score2 = 1 if readability2['level'] == 'سهل' else (0.7 if readability2['level'] == 'متوسط' else 0.4) | |
total_score1 = (readability_score1 * 0.3) + (sentiment_score1 * 0.3) + (completeness1['completeness_score'] / 100 * 0.4) | |
total_score2 = (readability_score2 * 0.3) + (sentiment_score2 * 0.3) + (completeness2['completeness_score'] / 100 * 0.4) | |
# تحديد المحتوى الأفضل | |
better_content = 'الأول' if total_score1 > total_score2 else 'الثاني' if total_score2 > total_score1 else 'متعادل' | |
return { | |
'better_content': better_content, | |
'comparison': { | |
'content1': { | |
'readability': readability1, | |
'sentiment': sentiment1, | |
'completeness': completeness1['completeness_score'], | |
'total_score': total_score1 * 100 | |
}, | |
'content2': { | |
'readability': readability2, | |
'sentiment': sentiment2, | |
'completeness': completeness2['completeness_score'], | |
'total_score': total_score2 * 100 | |
} | |
} | |
} | |
def save_analysis_results(analysis, filename): | |
""" | |
حفظ نتائج التحليل في ملف | |
""" | |
try: | |
import json | |
# إنشاء مجلد للتحليلات إذا لم يكن موجوداً | |
if not os.path.exists("analysis_results"): | |
os.makedirs("analysis_results") | |
# حفظ التحليل | |
save_path = os.path.join("analysis_results", filename) | |
with open(save_path, 'w', encoding='utf-8') as f: | |
json.dump(analysis, f, ensure_ascii=False, indent=4) | |
return save_path | |
except Exception as e: | |
print(f"خطأ في حفظ نتائج التحليل: {str(e)}") | |
return None | |
def load_analysis_results(filename): | |
""" | |
تحميل نتائج التحليل من ملف | |
""" | |
try: | |
import json | |
# التحقق من وجود الملف | |
file_path = os.path.join("analysis_results", filename) | |
if not os.path.exists(file_path): | |
print(f"الملف {filename} غير موجود") | |
return None | |
# تحميل التحليل | |
with open(file_path, 'r', encoding='utf-8') as f: | |
analysis = json.load(f) | |
return analysis | |
except Exception as e: | |
print(f"خطأ في تحميل نتائج التحليل: {str(e)}") | |
return None | |