Spaces:
Sleeping
Sleeping
import streamlit as st | |
import pandas as pd | |
import numpy as np | |
import matplotlib.pyplot as plt | |
from data_collection import extract_tourism_trends, load_chalet_data, analyze_chalet_data | |
from content_creation import generate_tourism_article, extract_keywords, generate_article_title, generate_meta_description | |
from content_analysis import analyze_content_readability, analyze_sentiment, improve_content, analyze_content_completeness, compare_contents, save_analysis_results | |
from media_generation import enhance_multiple_images, create_image_prompt, suggest_image_improvements, save_enhanced_image, get_chalet_images_from_dataset | |
from performance_analysis import analyze_content_performance, create_performance_charts, load_performance_data, add_performance_record, analyze_performance_trends, analyze_content_keywords_performance, create_keyword_performance_chart | |
from data_management import load_tourism_datasets, filter_dataset_by_criteria, analyze_dataset, extract_keywords_from_dataset, save_dataset_to_csv, load_dataset_from_csv, merge_datasets | |
from audience_targeting import create_audience_segments, analyze_audience_segments, create_segment_visualization, generate_targeted_content, load_audience_data_from_file, save_audience_segments | |
from model_training import get_available_models, create_training_data_from_chalets, save_training_data, login_to_huggingface, prepare_sentiment_data, train_sentiment_model | |
# إضافة استيراد للوظائف الجديدة | |
from content_automation import automated_content_creation, batch_content_creation, create_content_for_trending_topics | |
import os | |
import datetime | |
# إعداد الصفحة | |
st.set_page_config( | |
page_title="شاليه صحفي - نظام المحتوى السياحي الذكي", | |
page_icon="🏝️", | |
layout="wide", | |
initial_sidebar_state="expanded" | |
) | |
# العنوان الرئيسي | |
st.title("🏝️ نظام شاليه_صحفي للمحتوى السياحي الذكي") | |
st.markdown("---") | |
# تهيئة حالة الجلسة | |
if 'chalet_data' not in st.session_state: | |
st.session_state.chalet_data = None | |
if 'tourism_dataset' not in st.session_state: | |
st.session_state.tourism_dataset = None | |
if 'performance_data' not in st.session_state: | |
st.session_state.performance_data = load_performance_data() | |
if 'audience_data' not in st.session_state: | |
st.session_state.audience_data = None | |
if 'logged_in_hf' not in st.session_state: | |
st.session_state.logged_in_hf = False | |
# القائمة الجانبية للتنقل | |
menu = ["الصفحة الرئيسية", "جمع البيانات", "إنشاء المحتوى", "تحليل المحتوى", | |
"توليد الوسائط", "تحليل الأداء", "إدارة البيانات", "استهداف الجمهور", "تدريب النماذج", "أتمتة المحتوى"] | |
choice = st.sidebar.selectbox("اختر الوظيفة", menu) | |
# عرض الصفحة المناسبة حسب الاختيار | |
if choice == "الصفحة الرئيسية": | |
st.subheader("مرحباً بك في نظام شاليه_صحفي") | |
st.write("""هذا النظام يجمع بين الصحافة والذكاء الاصطناعي والتسويق السياحي لإنشاء محتوى صحفي | |
مستهدف يسوّق للشاليهات بطريقة فعالة ومبتكرة.""") | |
# عرض المكونات الرئيسية للنظام | |
st.subheader("المكونات الرئيسية للنظام") | |
col1, col2 = st.columns(2) | |
with col1: | |
st.markdown("### 📊 جمع وتحليل البيانات") | |
st.markdown("- استخراج البيانات من مصادر الأخبار") | |
st.markdown("- تحليل اتجاهات السياحة") | |
st.markdown("### ✍️ إنشاء المحتوى") | |
st.markdown("- إنشاء مقالات صحفية بأساليب متنوعة") | |
st.markdown("- توليد محتوى مستهدف للشرائح المختلفة") | |
st.markdown("### 🔍 تحليل المحتوى") | |
st.markdown("- تحليل قابلية القراءة") | |
st.markdown("- تحليل المشاعر واستخراج الكلمات المفتاحية") | |
with col2: | |
st.markdown("### 🖼️ توليد الوسائط") | |
st.markdown("- تحسين صور الشاليهات") | |
st.markdown("- اقتراحات لتصوير الشاليهات") | |
st.markdown("### 📈 تحليل الأداء") | |
st.markdown("- قياس تأثير المحتوى على المبيعات") | |
st.markdown("- تحليل سلوك المستخدمين") | |
st.markdown("### 👥 استهداف الجمهور") | |
st.markdown("- تحليل وتصنيف شرائح الجمهور") | |
st.markdown("- تخصيص المحتوى لكل شريحة") | |
# عرض إحصائيات النظام | |
st.subheader("إحصائيات النظام") | |
stats_col1, stats_col2, stats_col3 = st.columns(3) | |
with stats_col1: | |
# عدد الشاليهات في قاعدة البيانات | |
if st.session_state.tourism_dataset is not None: | |
chalet_count = len(st.session_state.tourism_dataset) | |
else: | |
chalet_count = 0 | |
st.metric("عدد الشاليهات", chalet_count) | |
with stats_col2: | |
# عدد المقالات المنشأة | |
if os.path.exists("analysis_results"): | |
analysis_count = len([f for f in os.listdir("analysis_results") if f.endswith(".json")]) | |
else: | |
analysis_count = 0 | |
st.metric("عدد التحليلات", analysis_count) | |
with stats_col3: | |
# عدد الصور المحسنة | |
if os.path.exists("enhanced_images"): | |
image_count = len([f for f in os.listdir("enhanced_images") if f.endswith((".jpg", ".png", ".jpeg"))]) | |
else: | |
image_count = 0 | |
st.metric("عدد الصور المحسنة", image_count) | |
elif choice == "جمع البيانات": | |
st.subheader("جمع وتحليل البيانات السياحية") | |
tab1, tab2 = st.tabs(["اتجاهات السياحة", "بيانات الشاليهات"]) | |
with tab1: | |
st.write("### استخراج اتجاهات السياحة") | |
if st.button("استخراج اتجاهات السياحة"): | |
with st.spinner("جاري استخراج اتجاهات السياحة..."): | |
trends = extract_tourism_trends() | |
st.write("### اتجاهات السياحة الحالية:") | |
for trend in trends: | |
st.write(f"- [{trend['title']}]({trend['link']})") | |
st.write(f" المصدر: {trend['source']}, تاريخ النشر: {trend['pubDate']}") | |
with tab2: | |
st.write("### جمع وتحليل بيانات الشاليهات") | |
data_source = st.radio( | |
"اختر مصدر البيانات:", | |
["استخراج من الويب", "تحميل من ملف CSV"] | |
) | |
if data_source == "استخراج من الويب": | |
if st.button("استخراج بيانات الشاليهات من الويب"): | |
with st.spinner("جاري استخراج بيانات الشاليهات..."): | |
chalets = scrape_chalets_from_web() | |
if chalets: | |
df = pd.DataFrame(chalets) | |
st.session_state.chalet_data = df | |
st.success(f"تم استخراج {len(df)} شاليه بنجاح!") | |
# حفظ البيانات في ملف CSV | |
df.to_csv("real_chalets_data.csv", index=False) | |
st.info("تم حفظ البيانات في ملف real_chalets_data.csv") | |
# عرض البيانات | |
st.write("### بيانات الشاليهات:") | |
st.dataframe(df) | |
else: | |
st.error("لم يتم العثور على أي بيانات للشاليهات") | |
else: # تحميل من ملف CSV | |
uploaded_file = st.file_uploader("قم برفع ملف CSV يحتوي على بيانات الشاليهات", type="csv") | |
if uploaded_file is not None: | |
df = pd.read_csv(uploaded_file) | |
st.session_state.chalet_data = df | |
st.success(f"تم تحميل {len(df)} شاليه بنجاح!") | |
# عرض البيانات | |
st.write("### بيانات الشاليهات:") | |
st.dataframe(df) | |
# تحليل البيانات | |
if st.session_state.chalet_data is not None: | |
if st.button("تحليل بيانات الشاليهات"): | |
with st.spinner("جاري تحليل بيانات الشاليهات..."): | |
analysis = analyze_chalet_data(st.session_state.chalet_data) | |
st.write("### تحليل البيانات:") | |
col1, col2 = st.columns(2) | |
with col1: | |
st.write(f"عدد الشاليهات: {analysis['total_chalets']}") | |
st.write(f"متوسط السعر: {analysis['avg_price']:.2f} جنيه") | |
st.write(f"أقصى سعة: {analysis['max_capacity']} أشخاص") | |
st.write(f"الموقع الأكثر شعبية: {analysis['popular_location']}") | |
with col2: | |
st.write(f"متوسط التقييم: {analysis['avg_rating']:.2f} من 5") | |
st.write(f"نطاق الأسعار: من {analysis['price_range'][0]} إلى {analysis['price_range'][1]} جنيه") | |
st.write(f"أهم المميزات: {analysis['top_amenities']}") | |
st.write("### توزيع الجمهور المستهدف:") | |
if analysis['audience_distribution']: | |
audience_df = pd.DataFrame.from_dict(analysis['audience_distribution'], orient='index', columns=['العدد']) | |
st.bar_chart(audience_df) | |
else: | |
st.info("لا توجد بيانات كافية عن الجمهور المستهدف") | |
elif choice == "إنشاء المحتوى": | |
st.subheader("إنشاء المحتوى الصحفي السياحي") | |
# تهيئة المتغيرات | |
selected_chalet = None | |
# إضافة خيار لاختيار شاليه من البيانات | |
if st.session_state.chalet_data is not None: | |
chalet_options = st.session_state.chalet_data['name'].tolist() | |
selected_chalet_name = st.selectbox("اختر شاليه من البيانات:", [""] + chalet_options) | |
if selected_chalet_name: | |
# استخراج بيانات الشاليه المحدد | |
selected_chalet = st.session_state.chalet_data[st.session_state.chalet_data['name'] == selected_chalet_name].iloc[0].to_dict() | |
# عرض معلومات الشاليه | |
st.write("### معلومات الشاليه") | |
col1, col2 = st.columns(2) | |
with col1: | |
st.write(f"**الموقع:** {selected_chalet['location']}") | |
if 'price' in selected_chalet: | |
st.write(f"**السعر:** {selected_chalet['price']} جنيه") | |
if 'capacity' in selected_chalet: | |
st.write(f"**السعة:** {selected_chalet['capacity']} أشخاص") | |
with col2: | |
if 'rating' in selected_chalet: | |
st.write(f"**التقييم:** {selected_chalet['rating']} من 5") | |
if 'season' in selected_chalet: | |
st.write(f"**الموسم:** {selected_chalet['season']}") | |
if 'target_audience' in selected_chalet: | |
st.write(f"**الجمهور المستهدف:** {selected_chalet['target_audience']}") | |
if 'amenities' in selected_chalet: | |
st.write(f"**المميزات:** {selected_chalet['amenities']}") | |
if 'description' in selected_chalet: | |
st.write(f"**الوصف:** {selected_chalet['description']}") | |
# إضافة خيار لإدخال بيانات شاليه يدوياً | |
st.write("### أو أدخل بيانات شاليه يدوياً") | |
chalet_name = st.text_input("اسم الشاليه:") | |
chalet_location = st.text_input("موقع الشاليه:") | |
style = st.selectbox("اختر أسلوب المقال:", ["informative", "promotional", "narrative"]) | |
if st.button("إنشاء المقال"): | |
if selected_chalet or (chalet_name and chalet_location): | |
with st.spinner("جاري إنشاء المقال..."): | |
if selected_chalet: | |
# استخدام بيانات الشاليه المحدد | |
article = generate_tourism_article(selected_chalet, style) | |
chalet_data = selected_chalet | |
else: | |
# استخدام البيانات المدخلة يدوياً | |
manual_chalet_data = { | |
"name": chalet_name, | |
"location": chalet_location | |
} | |
article = generate_tourism_article(manual_chalet_data, style) | |
chalet_data = manual_chalet_data | |
# إنشاء عنوان للمقال | |
title = generate_article_title(chalet_data, style) | |
st.write(f"### {title}") | |
# إنشاء وصف تعريفي | |
meta_description = generate_meta_description(chalet_data, style) | |
st.write(f"*{meta_description}*") | |
st.write("### المقال المُنشأ:") | |
st.write(article) | |
# استخراج الكلمات المفتاحية | |
keywords = extract_keywords(article) | |
st.write("### الكلمات المفتاحية:") | |
st.write(", ".join(keywords)) | |
# إضافة زر لحفظ المقال | |
if st.button("حفظ المقال"): | |
# إنشاء مجلد للمقالات إذا لم يكن موجوداً | |
if not os.path.exists("articles"): | |
os.makedirs("articles") | |
# إنشاء اسم الملف | |
filename = f"articles/{chalet_data['name'].replace(' ', '_')}_{style}_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.txt" | |
# حفظ المقال | |
with open(filename, 'w', encoding='utf-8') as f: | |
f.write(f"{title}\n\n") | |
f.write(f"{meta_description}\n\n") | |
f.write(article) | |
f.write("\n\nالكلمات المفتاحية: " + ", ".join(keywords)) | |
st.success(f"تم حفظ المقال في {filename}") | |
else: | |
st.error("يرجى اختيار شاليه من القائمة أو إدخال اسم الشاليه وموقعه") | |
elif choice == "تحليل المحتوى": | |
st.subheader("تحليل وتحسين المحتوى") | |
tab1, tab2 = st.tabs(["تحليل المحتوى", "مقارنة المحتويات"]) | |
with tab1: | |
text_to_analyze = st.text_area("أدخل النص للتحليل:", height=200) | |
target_audience = st.selectbox("الجمهور المستهدف:", ["عائلات", "شباب", "كبار السن", "عام"]) | |
if st.button("تحليل وتحسين"): | |
if text_to_analyze: | |
with st.spinner("جاري تحليل المحتوى..."): | |
# تحليل قابلية القراءة | |
readability = analyze_content_readability(text_to_analyze) | |
# تحليل المشاعر | |
sentiment = analyze_sentiment(text_to_analyze) | |
# تحليل اكتمال المحتوى | |
completeness = analyze_content_completeness(text_to_analyze) | |
# اقتراحات التحسين | |
improvements = improve_content(text_to_analyze, target_audience) | |
# عرض النتائج | |
st.write("### تحليل قابلية القراءة:") | |
st.write(f"مستوى القراءة: {readability['level']}") | |
st.write(f"متوسط طول الجملة: {readability['avg_sentence_length']:.1f} كلمة") | |
st.write(f"عدد الكلمات: {readability['word_count']}") | |
st.write(f"عدد الجمل: {readability['sentence_count']}") | |
st.write("### تحليل المشاعر:") | |
sentiment_label = "إيجابي" if sentiment['label'] == "POSITIVE" else "سلبي" if sentiment['label'] == "NEGATIVE" else "محايد" | |
st.write(f"النبرة العامة: {sentiment_label} (الثقة: {sentiment['score']:.2f})") | |
st.write("### تحليل اكتمال المحتوى:") | |
st.write(f"درجة الاكتمال: {completeness['completeness_score']:.1f}%") | |
if completeness['missing_elements']: | |
st.write("العناصر المفقودة:") | |
for element in completeness['missing_elements']: | |
st.write(f"- {element}") | |
st.write("### اقتراحات التحسين:") | |
if improvements['improvements']: | |
for improvement in improvements['improvements']: | |
st.write(f"- {improvement}") | |
else: | |
st.write("المحتوى جيد ولا يحتاج إلى تحسينات كبيرة.") | |
# حفظ نتائج التحليل | |
if st.button("حفظ نتائج التحليل"): | |
analysis_results = { | |
"text": text_to_analyze, | |
"target_audience": target_audience, | |
"readability": readability, | |
"sentiment": { | |
"label": sentiment_label, | |
"score": sentiment['score'] | |
}, | |
"completeness": { | |
"score": completeness['completeness_score'], | |
"missing_elements": completeness['missing_elements'] | |
}, | |
"improvements": improvements['improvements'] | |
} | |
saved_path = save_analysis_results(analysis_results, f"analysis_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.json") | |
if saved_path: | |
st.success(f"تم حفظ نتائج التحليل في {saved_path}") | |
else: | |
st.error("يرجى إدخال نص للتحليل") | |
with tab2: | |
st.write("### مقارنة بين محتويين") | |
text1 = st.text_area("المحتوى الأول:", height=150) | |
text2 = st.text_area("المحتوى الثاني:", height=150) | |
if st.button("مقارنة المحتويين"): | |
if text1 and text2: | |
with st.spinner("جاري مقارنة المحتويين..."): | |
comparison = compare_contents(text1, text2) | |
st.write(f"### المحتوى الأفضل: {comparison['better_content']}") | |
st.write("### مقارنة تفصيلية:") | |
col1, col2 = st.columns(2) | |
with col1: | |
st.write("**المحتوى الأول:**") | |
st.write(f"مستوى القراءة: {comparison['comparison']['content1']['readability']['level']}") | |
sentiment_label1 = "إيجابي" if comparison['comparison']['content1']['sentiment']['label'] == "POSITIVE" else "سلبي" if comparison['comparison']['content1']['sentiment']['label'] == "NEGATIVE" else "محايد" | |
st.write(f"المشاعر: {sentiment_label1} (الثقة: {comparison['comparison']['content1']['sentiment']['score']:.2f})") | |
st.write(f"درجة الاكتمال: {comparison['comparison']['content1']['completeness']:.1f}%") | |
st.write(f"الدرجة الإجمالية: {comparison['comparison']['content1']['total_score']:.1f}%") | |
with col2: | |
st.write("**المحتوى الثاني:**") | |
st.write(f"مستوى القراءة: {comparison['comparison']['content2']['readability']['level']}") | |
sentiment_label2 = "إيجابي" if comparison['comparison']['content2']['sentiment']['label'] == "POSITIVE" else "سلبي" if comparison['comparison']['content2']['sentiment']['label'] == "NEGATIVE" else "محايد" | |
st.write(f"المشاعر: {sentiment_label2} (الثقة: {comparison['comparison']['content2']['sentiment']['score']:.2f})") | |
st.write(f"درجة الاكتمال: {comparison['comparison']['content2']['completeness']:.1f}%") | |
st.write(f"الدرجة الإجمالية: {comparison['comparison']['content2']['total_score']:.1f}%") | |
else: | |
st.error("يرجى إدخال كلا المحتويين للمقارنة") | |
elif choice == "توليد الوسائط": | |
st.subheader("تحسين صور الشاليهات") | |
# تعريف المتغيرات قبل استخدامها | |
chalet_name = st.text_input("اسم الشاليه:") | |
chalet_location = st.text_input("موقع الشاليه:") | |
target_audience = st.selectbox("الجمهور المستهدف:", ["", "عائلات", "أزواج", "شباب"]) | |
uploaded_files = st.file_uploader("قم برفع صور الشاليه (يمكنك رفع أكثر من صورة)", type=["jpg", "jpeg", "png"], accept_multiple_files=True) | |
enhancement_type = st.radio( | |
"اختر نوع التحسين:", | |
["brightness", "contrast", "sharpness", "professional"], | |
format_func=lambda x: { | |
"brightness": "زيادة السطوع", | |
"contrast": "تحسين التباين", | |
"sharpness": "زيادة الحدة", | |
"professional": "تحسين احترافي شامل" | |
}[x] | |
) | |
if uploaded_files: | |
st.write("### الصور الأصلية") | |
for uploaded_file in uploaded_files: | |
st.image(uploaded_file, caption="الصورة الأصلية", use_container_width=True) | |
if st.button("تحسين الصور"): | |
with st.spinner("جاري تحسين الصور..."): | |
enhanced_images, descriptions = enhance_multiple_images(uploaded_files, enhancement_type) | |
st.write("### الصور بعد التحسين") | |
for i, (enhanced_image, description) in enumerate(zip(enhanced_images, descriptions)): | |
st.image(enhanced_image, caption=description, use_container_width=True) | |
# إضافة زر لتنزيل الصورة المحسنة | |
if st.button(f"حفظ الصورة {i+1}"): | |
# حفظ الصورة | |
filename = f"{chalet_name}_{enhancement_type}_{i+1}.jpg" | |
saved_path = save_enhanced_image(enhanced_image, filename) | |
if saved_path: | |
st.success(f"تم حفظ الصورة في {saved_path}") | |
else: | |
st.info("يرجى رفع صورة واحدة أو أكثر للشاليه أولاً.") | |
# الآن هذه المتغيرات تم تعريفها قبل استخدامها هنا | |
if chalet_name or chalet_location or target_audience: | |
chalet_data = { | |
"name": chalet_name, | |
"location": chalet_location, | |
"target_audience": target_audience | |
} | |
st.write("### اقتراحات لتصوير الشاليه") | |
suggestions = suggest_image_improvements(chalet_data) | |
for suggestion in suggestions: | |
st.write(f"- {suggestion}") | |
elif choice == "تحليل الأداء": | |
st.subheader("تحليل أداء المحتوى") | |
tab1, tab2, tab3 = st.tabs(["بيانات الأداء", "تحليل الأداء", "اتجاهات الأداء"]) | |
with tab1: | |
st.write("### إدارة بيانات أداء المحتوى") | |
# إضافة سجل أداء جديد | |
st.write("#### إضافة سجل أداء جديد") | |
content_id = st.text_input("معرف المحتوى:") | |
content_type = st.selectbox("نوع المحتوى:", ["informative", "promotional", "narrative"]) | |
views = st.number_input("عدد المشاهدات:", min_value=0, value=0) | |
engagement = st.number_input("معدل التفاعل (%):", min_value=0.0, max_value=100.0, value=0.0) | |
conversion = st.number_input("معدل التحويل (%):", min_value=0.0, max_value=100.0, value=0.0) | |
publish_date = st.date_input("تاريخ النشر:", datetime.datetime.now()) | |
if st.button("إضافة سجل"): | |
if content_id and content_type: | |
result = add_performance_record( | |
content_id, | |
content_type, | |
views, | |
engagement, | |
conversion, | |
publish_date.strftime("%Y-%m-%d") | |
) | |
if result: | |
st.success("تم إضافة سجل الأداء بنجاح") | |
# تحديث البيانات في حالة الجلسة | |
st.session_state.performance_data = load_performance_data() | |
else: | |
st.error("حدث خطأ أثناء إضافة سجل الأداء") | |
else: | |
st.error("يرجى إدخال معرف المحتوى ونوعه على الأقل") | |
# عرض البيانات الحالية | |
st.write("### بيانات أداء المحتوى الحالية") | |
if st.session_state.performance_data is not None and not st.session_state.performance_data.empty: | |
st.dataframe(st.session_state.performance_data) | |
else: | |
st.info("لا توجد بيانات أداء متاحة حالياً") | |
with tab2: | |
st.write("### تحليل أداء المحتوى") | |
if st.session_state.performance_data is not None and not st.session_state.performance_data.empty: | |
if st.button("تحليل الأداء"): | |
with st.spinner("جاري تحليل البيانات..."): | |
# تحليل الأداء | |
analysis = analyze_content_performance(st.session_state.performance_data) | |
# عرض النتائج | |
st.write("### ملخص الأداء") | |
col1, col2, col3 = st.columns(3) | |
with col1: | |
st.metric("متوسط المشاهدات", f"{analysis['avg_metrics']['avg_views']:.0f}") | |
with col2: | |
st.metric("متوسط التفاعل", f"{analysis['avg_metrics']['avg_engagement']:.2f}%") | |
with col3: | |
st.metric("متوسط التحويل", f"{analysis['avg_metrics']['avg_conversion']:.2f}%") | |
if analysis['best_content']: | |
st.write("### أفضل محتوى") | |
st.write(f"المعرف: {analysis['best_content']['content_id']}") | |
st.write(f"النوع: {analysis['best_content']['content_type']}") | |
st.write(f"معدل التحويل: {analysis['best_content']['conversion']:.2f}%") | |
if analysis['worst_content']: | |
st.write("### أسوأ محتوى") | |
st.write(f"المعرف: {analysis['worst_content']['content_id']}") | |
st.write(f"النوع: {analysis['worst_content']['content_type']}") | |
st.write(f"معدل التحويل: {analysis['worst_content']['conversion']:.2f}%") | |
if not analysis['correlations'].empty: | |
st.write("### العلاقات بين المقاييس") | |
st.dataframe(analysis['correlations']) | |
# عرض الرسوم البيانية | |
st.write("### الرسوم البيانية") | |
fig = create_performance_charts(st.session_state.performance_data) | |
st.pyplot(fig) | |
# تحليل أداء الكلمات المفتاحية | |
if 'keywords' in st.session_state.performance_data.columns: | |
st.write("### تحليل أداء الكلمات المفتاحية") | |
keywords_analysis = analyze_content_keywords_performance(st.session_state.performance_data) | |
if keywords_analysis['top_keywords']: | |
st.write("#### أفضل الكلمات المفتاحية أداءً:") | |
for keyword in keywords_analysis['top_keywords']: | |
st.write(f"- {keyword['keyword']}: معدل التحويل {keyword['performance']['avg_conversion']:.2f}%") | |
# عرض رسم بياني لأداء الكلمات المفتاحية | |
fig = create_keyword_performance_chart(keywords_analysis) | |
st.pyplot(fig) | |
else: | |
st.info("لا توجد بيانات أداء كافية للتحليل") | |
with tab3: | |
st.write("### اتجاهات الأداء بمرور الوقت") | |
days = st.slider("عدد الأيام للتحليل:", min_value=7, max_value=90, value=30) | |
if st.button("تحليل الاتجاهات"): | |
with st.spinner("جاري تحليل اتجاهات الأداء..."): | |
trends = analyze_performance_trends(days) | |
if trends['trend_views'] or trends['trend_engagement'] or trends['trend_conversion']: | |
# عرض اتجاهات المشاهدات | |
if trends['trend_views']: | |
st.write("#### اتجاه المشاهدات") | |
views_df = pd.DataFrame(trends['trend_views']) | |
st.line_chart(views_df.set_index('date')['value']) | |
# عرض اتجاهات التفاعل | |
if trends['trend_engagement']: | |
st.write("#### اتجاه التفاعل") | |
engagement_df = pd.DataFrame(trends['trend_engagement']) | |
st.line_chart(engagement_df.set_index('date')['value']) | |
# عرض اتجاهات التحويل | |
if trends['trend_conversion']: | |
st.write("#### اتجاه التحويل") | |
conversion_df = pd.DataFrame(trends['trend_conversion']) | |
st.line_chart(conversion_df.set_index('date')['value']) | |
# عرض أفضل وأسوأ يوم | |
if trends['best_day']: | |
st.write("#### أفضل يوم أداءً") | |
st.write(f"التاريخ: {trends['best_day']['date']}") | |
st.write(f"المشاهدات: {trends['best_day']['views']:.0f}") | |
st.write(f"التفاعل: {trends['best_day']['engagement']:.2f}%") | |
st.write(f"التحويل: {trends['best_day']['conversion']:.2f}%") | |
if trends['worst_day']: | |
st.write("#### أسوأ يوم أداءً") | |
st.write(f"التاريخ: {trends['worst_day']['date']}") | |
st.write(f"المشاهدات: {trends['worst_day']['views']:.0f}") | |
st.write(f"التفاعل: {trends['worst_day']['engagement']:.2f}%") | |
st.write(f"التحويل: {trends['worst_day']['conversion']:.2f}%") | |
else: | |
st.info(f"لا توجد بيانات كافية لتحليل الاتجاهات خلال الـ {days} يوم الماضية") | |
elif choice == "إدارة البيانات": | |
st.subheader("إدارة مجموعات البيانات") | |
tab1, tab2, tab3 = st.tabs(["استكشاف البيانات", "تصفية البيانات", "تحليل البيانات"]) | |
# إضافة زر لتحميل البيانات الحقيقية | |
if st.sidebar.button("تحميل بيانات حقيقية"): | |
with st.spinner("جاري تحميل البيانات الحقيقية..."): | |
st.session_state.tourism_dataset = load_tourism_datasets() | |
st.sidebar.success("تم تحميل البيانات الحقيقية بنجاح!") | |
# تحميل مجموعة البيانات إذا لم تكن محملة بالفعل | |
if 'tourism_dataset' not in st.session_state: | |
with st.spinner("جاري تحميل البيانات..."): | |
st.session_state.tourism_dataset = load_tourism_datasets() | |
with tab1: | |
st.write("### استكشاف بيانات الشاليهات") | |
# عرض البيانات | |
if st.session_state.tourism_dataset is not None: | |
df = st.session_state.tourism_dataset.to_pandas() | |
st.dataframe(df) | |
# معلومات إحصائية | |
st.write("### معلومات إحصائية") | |
st.write(f"عدد الشاليهات: {len(df)}") | |
if 'price' in df.columns: | |
st.write(f"متوسط السعر: {df['price'].mean():.2f} جنيه") | |
if 'rating' in df.columns: | |
st.write(f"متوسط التقييم: {df['rating'].mean():.2f} من 5") | |
# استخراج الكلمات المفتاحية من الأوصاف | |
if 'description' in df.columns: | |
if st.button("استخراج الكلمات المفتاحية"): | |
with st.spinner("جاري استخراج الكلمات المفتاحية..."): | |
keywords = extract_keywords_from_dataset(st.session_state.tourism_dataset, 'description') | |
st.write("### الكلمات المفتاحية الشائعة:") | |
keywords_df = pd.DataFrame(keywords) | |
st.dataframe(keywords_df) | |
# عرض سحابة الكلمات | |
st.write("### سحابة الكلمات:") | |
fig, ax = plt.subplots(figsize=(10, 6)) | |
ax.bar(keywords_df['word'][:15], keywords_df['count'][:15]) | |
plt.xticks(rotation=45, ha='right') | |
st.pyplot(fig) | |
else: | |
st.info("لا توجد بيانات متاحة. يرجى تحميل البيانات أولاً.") | |
with tab2: | |
st.write("### تصفية البيانات حسب المعايير") | |
if st.session_state.tourism_dataset is not None: | |
df = st.session_state.tourism_dataset.to_pandas() | |
# معايير التصفية | |
col1, col2 = st.columns(2) | |
with col1: | |
if 'location' in df.columns: | |
location_filter = st.selectbox("الموقع:", ["", *df['location'].unique()]) | |
else: | |
location_filter = "" | |
if 'target_audience' in df.columns: | |
audience_filter = st.selectbox("الجمهور المستهدف:", ["", *df['target_audience'].unique()]) | |
else: | |
audience_filter = "" | |
with col2: | |
if 'season' in df.columns: | |
season_filter = st.selectbox("الموسم:", ["", *df['season'].unique()]) | |
else: | |
season_filter = "" | |
if 'rating' in df.columns: | |
min_rating = st.slider("الحد الأدنى للتقييم:", 0.0, 5.0, 0.0, 0.1) | |
else: | |
min_rating = 0.0 | |
# تطبيق التصفية | |
if st.button("تصفية البيانات"): | |
criteria = {} | |
if location_filter: | |
criteria['location'] = location_filter | |
if audience_filter: | |
criteria['target_audience'] = audience_filter | |
if season_filter: | |
criteria['season'] = season_filter | |
# تصفية البيانات | |
filtered_dataset = filter_dataset_by_criteria(st.session_state.tourism_dataset, criteria) | |
# تصفية حسب التقييم (لا يمكن استخدامها مباشرة في filter_dataset_by_criteria) | |
filtered_df = filtered_dataset.to_pandas() | |
if min_rating > 0 and 'rating' in filtered_df.columns: | |
filtered_df = filtered_df[filtered_df['rating'] >= min_rating] | |
# عرض النتائج | |
st.write(f"تم العثور على {len(filtered_df)} شاليه مطابق للمعايير:") | |
st.dataframe(filtered_df) | |
# حفظ البيانات المصفاة | |
if st.button("حفظ البيانات المصفاة"): | |
filename = f"filtered_chalets_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" | |
filtered_df.to_csv(filename, index=False) | |
st.success(f"تم حفظ البيانات المصفاة في {filename}") | |
else: | |
st.info("لا توجد بيانات متاحة. يرجى تحميل البيانات أولاً.") | |
with tab3: | |
st.write("### تحليل بيانات الشاليهات") | |
if st.session_state.tourism_dataset is not None: | |
if st.button("تحليل البيانات"): | |
with st.spinner("جاري تحليل البيانات..."): | |
analysis = analyze_dataset(st.session_state.tourism_dataset) | |
# عرض التحليل | |
st.write(f"عدد الشاليهات: {analysis['count']}") | |
# توزيع المواقع | |
if analysis['locations']: | |
st.write("### توزيع المواقع") | |
location_df = pd.DataFrame({ | |
'الموقع': list(analysis['locations'].keys()), | |
'العدد': list(analysis['locations'].values()) | |
}) | |
st.bar_chart(location_df.set_index('الموقع')) | |
# توزيع الجمهور المستهدف | |
if analysis['audience_distribution']: | |
st.write("### توزيع الجمهور المستهدف") | |
audience_df = pd.DataFrame({ | |
'الجمهور': list(analysis['audience_distribution'].keys()), | |
'العدد': list(analysis['audience_distribution'].values()) | |
}) | |
st.bar_chart(audience_df.set_index('الجمهور')) | |
# توزيع المواسم | |
if analysis['season_distribution']: | |
st.write("### توزيع المواسم") | |
season_df = pd.DataFrame({ | |
'الموسم': list(analysis['season_distribution'].keys()), | |
'العدد': list(analysis['season_distribution'].values()) | |
}) | |
st.bar_chart(season_df.set_index('الموسم')) | |
else: | |
st.info("لا توجد بيانات متاحة. يرجى تحميل البيانات أولاً.") | |
elif choice == "استهداف الجمهور": | |
st.subheader("استهداف الجمهور المناسب") | |
tab1, tab2, tab3 = st.tabs(["تحليل شرائح الجمهور", "إنشاء محتوى مستهدف", "توصيات التسويق"]) | |
# تحميل بيانات الجمهور | |
audience_data_source = st.sidebar.radio( | |
"مصدر بيانات الجمهور:", | |
["تحميل من ملف", "استخراج من بيانات الشاليهات"] | |
) | |
if audience_data_source == "تحميل من ملف": | |
uploaded_file = st.sidebar.file_uploader("قم برفع ملف بيانات الجمهور", type=["csv", "xlsx"]) | |
if uploaded_file is not None: | |
if uploaded_file.name.endswith('.csv'): | |
audience_df = pd.read_csv(uploaded_file) | |
else: | |
audience_df = pd.read_excel(uploaded_file) | |
st.session_state.audience_data = audience_df | |
st.sidebar.success("تم تحميل بيانات الجمهور بنجاح!") | |
elif audience_data_source == "استخراج من بيانات الشاليهات" and st.session_state.chalet_data is not None: | |
if st.sidebar.button("استخراج بيانات الجمهور"): | |
# هنا يمكن إضافة منطق لاستخراج بيانات الجمهور من بيانات الشاليهات | |
st.sidebar.info("هذه الميزة قيد التطوير") | |
with tab1: | |
st.write("### تحليل شرائح الجمهور") | |
if st.session_state.audience_data is not None: | |
st.dataframe(st.session_state.audience_data) | |
if st.button("تحليل شرائح الجمهور"): | |
with st.spinner("جاري تحليل بيانات الجمهور..."): | |
# إنشاء شرائح الجمهور | |
segmentation_result = create_audience_segments(st.session_state.audience_data) | |
if segmentation_result: | |
st.session_state.segmented_data = segmentation_result['segmented_data'] | |
st.session_state.segment_profiles = analyze_audience_segments(st.session_state.segmented_data) | |
# عرض ملخص التحليل | |
st.write("### ملخص شرائح الجمهور") | |
for segment, profile in st.session_state.segment_profiles.items(): | |
with st.expander(f"{segment} - حجم: {profile['size']} مستخدم"): | |
st.write(f"**متوسط تكرار الحجز:** {profile['avg_booking_frequency']:.2f} مرات سنوياً") | |
st.write(f"**متوسط مدة الإقامة:** {profile['avg_stay_duration']:.2f} أيام") | |
st.write(f"**حساسية السعر:** {profile['price_sensitivity']:.2f} (0 = غير حساس، 1 = حساس جداً)") | |
st.write(f"**معدل الاستجابة للإعلانات:** {profile['response_rate']:.2f}") | |
if 'age_distribution' in profile: | |
st.write("**توزيع الفئات العمرية:**") | |
for age, count in profile['age_distribution'].items(): | |
st.write(f"- {age}: {count} مستخدم") | |
if 'top_interests' in profile: | |
st.write("**أهم الاهتمامات:**") | |
for interest, count in profile['top_interests'].items(): | |
st.write(f"- {interest}: {count} مستخدم") | |
# عرض الرسوم البيانية | |
st.write("### توزيع شرائح الجمهور") | |
fig = create_segment_visualization(st.session_state.segmented_data, segmentation_result['features']) | |
st.pyplot(fig) | |
# حفظ شرائح الجمهور | |
if st.button("حفظ شرائح الجمهور"): | |
filename = f"audience_segments_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" | |
save_audience_segments(st.session_state.segmented_data, filename) | |
st.success(f"تم حفظ شرائح الجمهور في {filename}") | |
else: | |
st.error("حدث خطأ أثناء تحليل شرائح الجمهور") | |
else: | |
st.info("يرجى تحميل بيانات الجمهور أولاً") | |
with tab2: | |
st.write("### إنشاء محتوى مستهدف") | |
# اختيار الشاليه | |
chalet_name = st.text_input("اسم الشاليه:") | |
chalet_location = st.text_input("موقع الشاليه:") | |
# اختيار شريحة الجمهور | |
if 'segment_profiles' in st.session_state: | |
segment_options = list(st.session_state.segment_profiles.keys()) | |
selected_segment = st.selectbox("اختر شريحة الجمهور المستهدفة:", segment_options) | |
if st.button("إنشاء محتوى مستهدف"): | |
if chalet_name and chalet_location: | |
with st.spinner("جاري إنشاء المحتوى المستهدف..."): | |
chalet_data = { | |
"name": chalet_name, | |
"location": chalet_location | |
} | |
segment_profile = st.session_state.segment_profiles[selected_segment] | |
content_recommendations = generate_targeted_content(chalet_data, segment_profile) | |
# عرض التوصيات | |
st.write(f"### محتوى مستهدف لـ {selected_segment}") | |
st.write(f"**نوع المحتوى المناسب:** {content_recommendations['content_type']}") | |
st.write("**الرسائل الرئيسية:**") | |
for message in content_recommendations['key_messages']: | |
st.write(f"- {message}") | |
st.write("**التركيز في الصور:**") | |
for focus in content_recommendations['image_focus']: | |
st.write(f"- {focus}") | |
st.write("**قنوات التسويق الموصى بها:**") | |
for channel in content_recommendations['marketing_channels']: | |
st.write(f"- {channel}") | |
else: | |
st.error("يرجى إدخال اسم الشاليه وموقعه") | |
else: | |
st.info("يرجى تحليل شرائح الجمهور أولاً في التبويب السابق") | |
with tab3: | |
st.write("### توصيات التسويق") | |
if 'segment_profiles' in st.session_state: | |
# عرض توصيات التسويق لكل شريحة | |
for segment, profile in st.session_state.segment_profiles.items(): | |
with st.expander(f"توصيات لـ {segment}"): | |
st.write("**استراتيجية التسعير:**") | |
if profile['price_sensitivity'] > 0.7: | |
st.write("- التركيز على القيمة مقابل المال") | |
st.write("- تقديم عروض وخصومات متكررة") | |
st.write("- إبراز الميزات الأساسية بسعر تنافسي") | |
else: | |
st.write("- التركيز على الجودة والتميز") | |
st.write("- تقديم باقات شاملة بأسعار مميزة") | |
st.write("- إبراز الميزات الفريدة والخدمات الإضافية") | |
st.write("**قنوات التسويق:**") | |
if profile['response_rate'] > 0.15: | |
st.write("- التركيز على وسائل التواصل الاجتماعي") | |
st.write("- حملات البريد الإلكتروني المستهدفة") | |
st.write("- التسويق عبر المؤثرين") | |
else: | |
st.write("- التركيز على محركات البحث") | |
st.write("- منصات حجز السفر والفنادق") | |
st.write("- برامج الولاء والإحالة") | |
st.write("**نوع المحتوى:**") | |
if profile['avg_stay_duration'] > 5: | |
st.write("- محتوى تفصيلي عن المرافق والخدمات") | |
st.write("- دليل للأنشطة والمعالم القريبة") | |
st.write("- قصص وتجارب الإقامات الطويلة") | |
else: | |
st.write("- محتوى مختصر يركز على أهم الميزات") | |
st.write("- عروض عطلة نهاية الأسبوع") | |
st.write("- صور جذابة وفيديوهات قصيرة") | |
else: | |
st.info("يرجى تحليل شرائح الجمهور أولاً في التبويب الأول") | |
elif choice == "تدريب النماذج": | |
st.subheader("تدريب النماذج") | |
if not st.session_state.logged_in_hf: | |
if st.button("تسجيل الدخول إلى Hugging Face"): | |
st.session_state.logged_in_hf = login_to_huggingface() | |
if st.session_state.logged_in_hf: | |
models = get_available_models() | |
selected_model = st.selectbox("اختر النموذج للتدريب", [m['name'] for m in models]) | |
model_info = next(m for m in models if m['name'] == selected_model) | |
st.write(f"وصف النموذج: {model_info['description']}") | |
st.write(f"تنسيق البيانات المطلوب: {model_info['data_format']}") | |
# مصدر بيانات التدريب | |
data_source = st.radio( | |
"مصدر بيانات التدريب:", | |
["تحميل من ملف", "إنشاء من بيانات الشاليهات"] | |
) | |
if data_source == "تحميل من ملف": | |
uploaded_file = st.file_uploader("قم برفع ملف CSV يحتوي على بيانات التدريب", type="csv") | |
if uploaded_file is not None: | |
if st.button("بدء التدريب"): | |
with st.spinner("جاري تدريب النموذج..."): | |
if model_info['id'] == 'sentiment': | |
dataset = prepare_sentiment_data(uploaded_file) | |
if dataset: | |
results = train_sentiment_model(dataset) | |
if results: | |
st.success(f"تم تدريب النموذج بنجاح! مسار النموذج: {results['model_path']}") | |
st.write("نتائج التقييم:", results['eval_results']) | |
else: | |
st.error("حدث خطأ أثناء تدريب النموذج") | |
else: | |
st.error("فشل في تجهيز البيانات للتدريب") | |
else: | |
st.info("تدريب هذا النوع من النماذج قيد التطوير") | |
elif data_source == "إنشاء من بيانات الشاليهات" and st.session_state.chalet_data is not None: | |
if st.button("إنشاء بيانات التدريب"): | |
with st.spinner("جاري إنشاء بيانات التدريب..."): | |
training_data = create_training_data_from_chalets(st.session_state.chalet_data, model_info['id']) | |
if training_data is not None and not training_data.empty: | |
st.write("### بيانات التدريب المُنشأة:") | |
st.dataframe(training_data) | |
# حفظ بيانات التدريب | |
filename = f"{model_info['id']}_training_data_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" | |
save_training_data(training_data, filename) | |
st.success(f"تم حفظ بيانات التدريب في {filename}") | |
# تدريب النموذج | |
if st.button("بدء التدريب على البيانات المُنشأة"): | |
with st.spinner("جاري تدريب النموذج..."): | |
if model_info['id'] == 'sentiment': | |
dataset = prepare_sentiment_data(filename) | |
if dataset: | |
results = train_sentiment_model(dataset) | |
if results: | |
st.success(f"تم تدريب النموذج بنجاح! مسار النموذج: {results['model_path']}") | |
st.write("نتائج التقييم:", results['eval_results']) | |
else: | |
st.error("حدث خطأ أثناء تدريب النموذج") | |
else: | |
st.error("فشل في تجهيز البيانات للتدريب") | |
else: | |
st.info("تدريب هذا النوع من النماذج قيد التطوير") | |
else: | |
st.error("فشل في إنشاء بيانات التدريب") | |
else: | |
st.info("يرجى تحميل بيانات الشاليهات أولاً") | |
else: | |
st.warning("يرجى تسجيل الدخول إلى Hugging Face أولاً") | |
elif choice == "أتمتة المحتوى": | |
st.subheader("أتمتة إنشاء المحتوى") | |
tab1, tab2, tab3 = st.tabs(["إنشاء محتوى تلقائي", "إنشاء محتوى دفعي", "محتوى المواضيع الرائجة"]) | |
with tab1: | |
st.write("### إنشاء محتوى تلقائي لشاليه محدد") | |
# اختيار شاليه | |
if st.session_state.chalet_data is not None: | |
chalet_options = st.session_state.chalet_data['name'].tolist() | |
selected_chalet_name = st.selectbox("اختر شاليه:", [""] + chalet_options) | |
style = st.selectbox("اختر أسلوب المقال:", ["informative", "promotional", "narrative"]) | |
target_audience = st.selectbox("الجمهور المستهدف:", ["عام", "عائلات", "شباب", "كبار السن"]) | |
if st.button("إنشاء محتوى تلقائي"): | |
if selected_chalet_name: | |
with st.spinner("جاري إنشاء المحتوى التلقائي..."): | |
# استخراج بيانات الشاليه المحدد | |
selected_chalet = st.session_state.chalet_data[st.session_state.chalet_data['name'] == selected_chalet_name].iloc[0].to_dict() | |
# إنشاء المحتوى | |
result = automated_content_creation(selected_chalet, style, target_audience) | |
if result: | |
st.success(f"تم إنشاء المحتوى بنجاح وحفظه في {result['save_path']}") | |
st.write(f"### {result['title']}") | |
st.write(f"*{result['meta_description']}*") | |
st.write("### المقال:") | |
st.write(result['article']) | |
st.write("### الكلمات المفتاحية:") | |
st.write(", ".join(result['keywords'])) | |
st.write("### تحليل المحتوى:") | |
col1, col2 = st.columns(2) | |
with col1: | |
st.write("**قابلية القراءة:**") | |
st.write(f"مستوى القراءة: {result['analysis']['readability']['level']}") | |
st.write(f"متوسط طول الجملة: {result['analysis']['readability']['avg_sentence_length']:.1f} كلمة") | |
with col2: | |
st.write("**تحليل المشاعر:**") | |
sentiment_label = "إيجابي" if result['analysis']['sentiment']['label'] == "POSITIVE" else "سلبي" if result['analysis']['sentiment']['label'] == "NEGATIVE" else "محايد" | |
st.write(f"النبرة العامة: {sentiment_label} (الثقة: {result['analysis']['sentiment']['score']:.2f})") | |
st.write("**اكتمال المحتوى:**") | |
st.write(f"درجة الاكتمال: {result['analysis']['completeness']['completeness_score']:.1f}%") | |
if result['analysis']['improvements']['improvements']: | |
st.write("**اقتراحات التحسين:**") | |
for improvement in result['analysis']['improvements']['improvements']: | |
st.write(f"- {improvement}") | |
else: | |
st.error("حدث خطأ أثناء إنشاء المحتوى التلقائي") | |
else: | |
st.error("يرجى اختيار شاليه") | |
else: | |
st.info("يرجى تحميل بيانات الشاليهات أولاً من قسم جمع البيانات") | |
with tab2: | |
st.write("### إنشاء محتوى دفعي لمجموعة من الشاليهات") | |
if st.session_state.chalet_data is not None: | |
style = st.selectbox("اختر أسلوب المقالات:", ["informative", "promotional", "narrative"], key="batch_style") | |
target_audience = st.selectbox("الجمهور المستهدف:", ["عام", "عائلات", "شباب", "كبار السن"], key="batch_audience") | |
# اختيار عدد الشاليهات | |
num_chalets = st.slider("عدد الشاليهات:", 1, len(st.session_state.chalet_data), 5) | |
if st.button("إنشاء محتوى دفعي"): | |
with st.spinner(f"جاري إنشاء محتوى لـ {num_chalets} شاليه..."): | |
# اختيار عينة عشوائية من الشاليهات | |
sample_chalets = st.session_state.chalet_data.sample(num_chalets) | |
# إنشاء المحتوى | |
results = batch_content_creation(sample_chalets, style, target_audience) | |
if results: | |
st.success(f"تم إنشاء {len(results)} مقال بنجاح") | |
# عرض ملخص النتائج | |
for i, result in enumerate(results): | |
with st.expander(f"مقال {i+1}: {result['title']}"): | |
st.write(f"*{result['meta_description']}*") | |
st.write(f"الكلمات المفتاحية: {', '.join(result['keywords'])}") | |
st.write(f"مسار الحفظ: {result['save_path']}") | |
else: | |
st.error("حدث خطأ أثناء إنشاء المحتوى الدفعي") | |
else: | |
st.info("يرجى تحميل بيانات الشاليهات أولاً من قسم جمع البيانات") | |
with tab3: | |
st.write("### إنشاء محتوى للمواضيع الرائجة") | |
if st.button("إنشاء محتوى للمواضيع الرائجة"): | |
with st.spinner("جاري استخراج المواضيع الرائجة وإنشاء محتوى ذي صلة..."): | |
results = create_content_for_trending_topics() | |
if results: | |
st.success(f"تم إنشاء {len(results)} مقال للمواضيع الرائجة بنجاح") | |
# عرض ملخص النتائج | |
for i, result in enumerate(results): | |
with st.expander(f"مقال {i+1}: {result['title']}"): | |
st.write(f"*{result['meta_description']}*") | |
st.write(f"الكلمات المفتاحية: {', '.join(result['keywords'])}") | |
st.write(f"مسار الحفظ: {result['save_path']}") | |
else: | |
st.warning("لم يتم إنشاء أي محتوى للمواضيع الرائجة") | |
elif choice == "أتمتة المحتوى": | |
st.subheader("أتمتة إنشاء المحتوى") | |
tab1, tab2, tab3 = st.tabs(["إنشاء محتوى تلقائي", "إنشاء محتوى دفعي", "محتوى المواضيع الرائجة"]) | |
with tab1: | |
st.write("### إنشاء محتوى تلقائي لشاليه محدد") | |
# اختيار شاليه | |
if st.session_state.chalet_data is not None: | |
chalet_options = st.session_state.chalet_data['name'].tolist() | |
selected_chalet_name = st.selectbox("اختر شاليه:", [""] + chalet_options) | |
style = st.selectbox("اختر أسلوب المقال:", ["informative", "promotional", "narrative"]) | |
target_audience = st.selectbox("الجمهور المستهدف:", ["عام", "عائلات", "شباب", "كبار السن"]) | |
if st.button("إنشاء محتوى تلقائي"): | |
if selected_chalet_name: | |
with st.spinner("جاري إنشاء المحتوى التلقائي..."): | |
# استخراج بيانات الشاليه المحدد | |
selected_chalet = st.session_state.chalet_data[st.session_state.chalet_data['name'] == selected_chalet_name].iloc[0].to_dict() | |
# إنشاء المحتوى | |
result = automated_content_creation(selected_chalet, style, target_audience) | |
if result: | |
st.success(f"تم إنشاء المحتوى بنجاح وحفظه في {result['save_path']}") | |
st.write(f"### {result['title']}") | |
st.write(f"*{result['meta_description']}*") | |
st.write("### المقال:") | |
st.write(result['article']) | |
st.write("### الكلمات المفتاحية:") | |
st.write(", ".join(result['keywords'])) | |
st.write("### تحليل المحتوى:") | |
col1, col2 = st.columns(2) | |
with col1: | |
st.write("**قابلية القراءة:**") | |
st.write(f"مستوى القراءة: {result['analysis']['readability']['level']}") | |
st.write(f"متوسط طول الجملة: {result['analysis']['readability']['avg_sentence_length']:.1f} كلمة") | |
with col2: | |
st.write("**تحليل المشاعر:**") | |
sentiment_label = "إيجابي" if result['analysis']['sentiment']['label'] == "POSITIVE" else "سلبي" if result['analysis']['sentiment']['label'] == "NEGATIVE" else "محايد" | |
st.write(f"النبرة العامة: {sentiment_label} (الثقة: {result['analysis']['sentiment']['score']:.2f})") | |
st.write("**اكتمال المحتوى:**") | |
st.write(f"درجة الاكتمال: {result['analysis']['completeness']['completeness_score']:.1f}%") | |
if result['analysis']['improvements']['improvements']: | |
st.write("**اقتراحات التحسين:**") | |
for improvement in result['analysis']['improvements']['improvements']: | |
st.write(f"- {improvement}") | |
else: | |
st.error("حدث خطأ أثناء إنشاء المحتوى التلقائي") | |
else: | |
st.error("يرجى اختيار شاليه") | |
else: | |
st.info("يرجى تحميل بيانات الشاليهات أولاً من قسم جمع البيانات") | |
with tab2: | |
st.write("### إنشاء محتوى دفعي لمجموعة من الشاليهات") | |
if st.session_state.chalet_data is not None: | |
style = st.selectbox("اختر أسلوب المقالات:", ["informative", "promotional", "narrative"], key="batch_style") | |
target_audience = st.selectbox("الجمهور المستهدف:", ["عام", "عائلات", "شباب", "كبار السن"], key="batch_audience") | |
# اختيار عدد الشاليهات | |
num_chalets = st.slider("عدد الشاليهات:", 1, len(st.session_state.chalet_data), 5) | |
if st.button("إنشاء محتوى دفعي"): | |
with st.spinner(f"جاري إنشاء محتوى لـ {num_chalets} شاليه..."): | |
# اختيار عينة عشوائية من الشاليهات | |
sample_chalets = st.session_state.chalet_data.sample(num_chalets) | |
# إنشاء المحتوى | |
results = batch_content_creation(sample_chalets, style, target_audience) | |
if results: | |
st.success(f"تم إنشاء {len(results)} مقال بنجاح") | |
# عرض ملخص النتائج | |
for i, result in enumerate(results): | |
with st.expander(f"مقال {i+1}: {result['title']}"): | |
st.write(f"*{result['meta_description']}*") | |
st.write(f"الكلمات المفتاحية: {', '.join(result['keywords'])}") | |
st.write(f"مسار الحفظ: {result['save_path']}") | |
else: | |
st.error("حدث خطأ أثناء إنشاء المحتوى الدفعي") | |
else: | |
st.info("يرجى تحميل بيانات الشاليهات أولاً من قسم جمع البيانات") | |
with tab3: | |
st.write("### إنشاء محتوى للمواضيع الرائجة") | |
if st.button("إنشاء محتوى للمواضيع الرائجة"): | |
with st.spinner("جاري استخراج المواضيع الرائجة وإنشاء محتوى ذي صلة..."): | |
results = create_content_for_trending_topics() | |
if results: | |
st.success(f"تم إنشاء {len(results)} مقال للمواضيع الرائجة بنجاح") | |
# عرض ملخص النتائج | |
for i, result in enumerate(results): | |
with st.expander(f"مقال {i+1}: {result['title']}"): | |
st.write(f"*{result['meta_description']}*") | |
st.write(f"الكلمات المفتاحية: {', '.join(result['keywords'])}") | |
st.write(f"مسار الحفظ: {result['save_path']}") | |
else: | |
st.warning("لم يتم إنشاء أي محتوى للمواضيع الرائجة") | |
if __name__ == "__main__": | |
pass | |