الاثنين، 5 يناير 2026

 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("🎉 موقعك مثالي! لا يوجد تكرار حرفي أو معنوي.")

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

إرسال تعليق