اذهب إلى المحتوى

السؤال

نشر

اعمل في مجمع طبي 
ولدي حوالي 1500  خدمة وهناك خدمات مكررة ولكن صعب اكتشافها
واحتاج افضل حل لا استخراج الخدمات المتشابهه سوا بالنص تماما او المعنى او يكون في نسبة تشابة بالمعنى
طبعا الخدمات مكتوبه بالعربي والانجليزي بنفس الحقل
كما موضح في الصورة اسفل

Screenshot (109).png

Recommended Posts

  • 0
نشر
بتاريخ 6 ساعة قال Mustafa Suleiman:

هل ما تريده سيتم من خلال كتابة سكريبت بايثون أم بدون برمجة؟

أي تريد أن يتم الأمر بشكل تلقائي، أم هو ملف واحد فقط تريد العمل عليه واستخلاص معلومات منه؟

ملف واحد
واحتاج الى كتابة اسكربت بايثون لهذا العمل

 

import pandas as pd

from sentence_transformers import SentenceTransformer, util



# Load data

df = pd.read_excel("files/similar_services.xlsx")

texts = df["name"].astype(str).tolist()



# Load multilingual model

model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")



# Encode into embeddings

embeddings = model.encode(texts, convert_to_tensor=True, show_progress_bar=True)



# Compute cosine similarity matrix

cosine_scores = util.cos_sim(embeddings, embeddings)



# Collect similar pairs

matches = []

threshold = 0.80  # Adjust threshold as needed



for i in range(len(texts)):

    for j in range(i + 1, len(texts)):

        score = cosine_scores[i][j].item()

        if score >= threshold:

            matches.append({

                "service_1": texts[i],

                "service_2": texts[j],

                "similarity": round(score, 3)

            })



similar_df = pd.DataFrame(matches)

similar_df.to_excel("similar_services_output.xlsx", index=False)



print("Done. Saved to similar_services_output.xlsx")



سويت هذا الكود بس الامور ما ظبطت

  • 0
نشر

السلام عليكم ورحمة الله،

المشكلة على الأغلب أنها في sentence-transformers فهو نموذج ثقيل وقد لا يعطي نتائج دقيقة للنصوص المختلطة كالعربي مع الإنجليزي في نفس الحقل والحل الأمثل هو استخدام TF-IDF مع Cosine Similarity بدلا من نماذج التضمين لأنه أسرع وأكثر دقة للكشف عن التكرارات النصية والمعنوية في البيانات الطبية المختلطة.

أما في الكود استخدامك ل TfidfVectorizer بمعاملات char_wb و ngram_range=(2,4) لتحليل النصوص على مستوى الحروف جيد مما يجعله فعالا جدا مع اللغة العربية والإنجليزية معا ويكتشف التطابقات التامة بعد التطبيع والمتشابهات المعنوية بعتبة قابلة للتعديل 0.70 افتراضيا. يمكنك تعديل SIMILARITY_THRESHOLD بين 0.6 (أكثر نتائج) و 0.9 (نتائج أدق) حسب احتياجك والكود لا يحتاج مكتبات خارجية ثقيلة ويعمل مباشرة مع scikit-learn المتوفرة في بيئة Python القياسية.

  • 0
نشر
بتاريخ منذ ساعة مضت قال Saddam Alwaheab:

ملف واحد
واحتاج الى كتابة اسكربت بايثون لهذا العمل

 

import pandas as pd

from sentence_transformers import SentenceTransformer, util



# Load data

df = pd.read_excel("files/similar_services.xlsx")

texts = df["name"].astype(str).tolist()



# Load multilingual model

model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")



# Encode into embeddings

embeddings = model.encode(texts, convert_to_tensor=True, show_progress_bar=True)



# Compute cosine similarity matrix

cosine_scores = util.cos_sim(embeddings, embeddings)



# Collect similar pairs

matches = []

threshold = 0.80  # Adjust threshold as needed



for i in range(len(texts)):

    for j in range(i + 1, len(texts)):

        score = cosine_scores[i][j].item()

        if score >= threshold:

            matches.append({

                "service_1": texts[i],

                "service_2": texts[j],

                "similarity": round(score, 3)

            })



similar_df = pd.DataFrame(matches)

similar_df.to_excel("similar_services_output.xlsx", index=False)



print("Done. Saved to similar_services_output.xlsx")



سويت هذا الكود بس الامور ما ظبطت

جيد، لكن لم تقم بمعالجة البيانات أي تنظيفها، فالنصوص تحتوي على شرطات سفلية _ ومسافات زائدة ورموز مثل - أو . أو أقواس) وهي تشوش على النموذج وتجعله يظن أن النصوص مختلفة.

أيضًا استخدام حلقتين متداخلتين أمر غير عملي وبطيء، كما أن المخرجات تكون مجرد أزواج يصعب تتبعها.

تتوفر دالة جاهزة في مكتبة sentence-transformers تسمى paraphrase_mining لاستخراج الجمل المتشابهة بسرعة فائقة وترتيبها حسب نسبة التطابق.

import pandas as pd
import re
from sentence_transformers import SentenceTransformer, util

def clean_text(text):
    if not isinstance(text, str):
        return ""
    text = re.sub(r'[^\w\s]', ' ', text)
    text = text.replace('_', ' ')
    text = " ".join(text.lower().split())
    return text

file_path = "files/similar_services.xlsx"
try:
    df = pd.read_excel(file_path)
except Exception as e:
    print(f"Error loading file: {e}")
    exit()

if 'name' not in df.columns:
    target_column = df.columns[2]
else:
    target_column = 'name'

print(f"Processing column: {target_column}")

services_original = df[target_column].astype(str).tolist()
services_cleaned = [clean_text(txt) for txt in services_original]

print("Loading Model...")
model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")

print("Calculating Similarity...")
matches = util.paraphrase_mining(model, services_cleaned, show_progress_bar=True, top_k=10)

threshold = 0.75
output_data = []

for score, i, j in matches:
    if score >= threshold:
        if i != j:
            output_data.append({
                "Service_ID_1": i + 2,
                "Service_Text_1": services_original[i],
                "Service_ID_2": j + 2,
                "Service_Text_2": services_original[j],
                "Similarity_Score": round(score * 100, 2)
            })

result_df = pd.read_json(pd.io.json.json_normalize(output_data).to_json())
if not result_df.empty:
    result_df.to_excel("similar_services_final.xlsx", index=False)
    print(f"Done! Found {len(result_df)} similar pairs. Saved to 'similar_services_final.xlsx'")
else:
    print("No similar services found with the current threshold.")

نسبة التشابه Threshold جعلتها 0.75، لأنّ أحيانًا الترجمة أو اختلاف ترتيب الكلمات مثل خلع ضرس و ضرس خلع يعطي نسبة أقل من 0.80، لذا 0.75 ستظهر لك نتائج شاملة أكثر، وتستطيع حذف غير المناسب من ملف الإكسل الناتج.

لو وجدت أن النتائج لا تزال غير دقيقة بنسبة 100%، فالسبب غالبًا هو تكرار المعنى بكلمات مختلفة، لذا استخدم ميزة Community Detection أي اكتشاف المجموعات والتي تقوم بتجميع الخدمات المتشابهة في مجموعات Cluster بدلاً من أزواج.

مثلاً تجميع لك كل خدمات الحشوات مع بعض في مجموعة واحدة، قم بتجربة الكود التالي بعد تحميل الموديل:

embeddings = model.encode(services_cleaned)
clusters = util.community_detection(embeddings, min_community_size=2, threshold=0.75)

for i, cluster in enumerate(clusters):
    print(f"\nGroup {i+1}:")
    for sentence_id in cluster:
        print("\t", services_original[sentence_id])

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...