chalet_jornal / content_analysis.py
Medon90ae's picture
Update content_analysis.py
3779958 verified
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