import requests
from bs4 import BeautifulSoup
import re
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sentence_transformers import SentenceTransformer, util
import torch
# 1. إعدادات الموقع والنموذج
SITEMAP_URL = "https://www.filsameem.online/sitemap.xml"
print("⏳ جاري تحميل محرك الذكاء الاصطناعي (فهم المعنى + تحليل الكلمات)...")
semantic_model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
def get_all_urls(sitemap_url):
headers = {'User-Agent': 'Mozilla/5.0'}
try:
r = requests.get(sitemap_url, headers=headers)
links = re.findall(r'<loc>(https?://[^\s<>]+)</loc>', r.text)
return [l for l in list(set(links)) if not any(x in l for x in ['/p/', 'search', 'label'])]
except: return []
def get_pure_content(url):
try:
r = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}, timeout=10)
soup = BeautifulSoup(r.text, 'html.parser')
article = soup.find('div', {'class': 'post-body'}) or soup.find('article')
if article:
for tag in article(['script', 'style', 'nav', 'header', 'footer']): tag.decompose()
return article.get_text(separator=' ', strip=True)
return ""
except: return ""
# --- البدء بالعملية الكبرى ---
urls = get_all_urls(SITEMAP_URL)
print(f"✅ تم رصد {len(urls)} مقال. جاري سحب المحتوى وتحليله...")
corpus = []
valid_urls = []
for i, url in enumerate(urls):
text = get_pure_content(url)
if len(text) > 300:
corpus.append(text)
valid_urls.append(url)
if i % 20 == 0: print(f"⏳ معالجة {i}/{len(urls)} مقال...")
# أ- تحليل الكلمات الحرفي (Lexical)
tfidf = TfidfVectorizer(ngram_range=(1, 2)).fit_transform(corpus)
lexical_sim = cosine_similarity(tfidf)
# ب- تحليل المعنى (Semantic)
embeddings = semantic_model.encode(corpus, convert_to_tensor=True)
semantic_sim = util.pytorch_cos_sim(embeddings, embeddings)
print("\n" + "🚀" + "—"*70)
print("التقرير الشامل والنهائي لتكرار المحتوى (كلمات + معنى)")
print("—"*70)
seen = set()
results_list = []
for i in range(len(valid_urls)):
for j in range(len(valid_urls)):
if i != j:
pair = tuple(sorted((valid_urls[i], valid_urls[j])))
if pair not in seen:
lex_score = lexical_sim[i][j] * 100
sem_score = semantic_sim[i][j].item() * 100
# تصفية النتائج المهمة فقط (فوق 50% في أي منهما)
if lex_score > 50 or sem_score > 65:
seen.add(pair)
results_list.append({
'p1': pair[0], 'p2': pair[1],
'lex': lex_score, 'sem': sem_score
})
# ترتيب النتائج حسب خطورة تكرار المعنى
results_list.sort(key=lambda x: x['sem'], reverse=True)
for res in results_list:
status = "🛑 خطر دمج" if res['sem'] > 75 else "⚠️ يحتاج تعديل هيكلي"
print(f"{status} | تشابه معنى: {res['sem']:.1f}% | تشابه كلمات: {res['lex']:.1f}%")
print(f"🔗 {res['p1']}")
print(f"🔗 {res['p2']}")
print("-" * 50)
if not results_list:
print("🎉 موقعك مثالي! لا يوجد تكرار حرفي أو معنوي.")

ليست هناك تعليقات:
إرسال تعليق