Saddam Alwaheab نشر أمس الساعة 07:47 أرسل تقرير نشر أمس الساعة 07:47 اعمل في مجمع طبي ولدي حوالي 1500 خدمة وهناك خدمات مكررة ولكن صعب اكتشافها واحتاج افضل حل لا استخراج الخدمات المتشابهه سوا بالنص تماما او المعنى او يكون في نسبة تشابة بالمعنى طبعا الخدمات مكتوبه بالعربي والانجليزي بنفس الحقل كما موضح في الصورة اسفل 1 اقتباس
0 Mustafa Suleiman نشر أمس الساعة 08:09 أرسل تقرير نشر أمس الساعة 08:09 هل ما تريده سيتم من خلال كتابة سكريبت بايثون أم بدون برمجة؟ أي تريد أن يتم الأمر بشكل تلقائي، أم هو ملف واحد فقط تريد العمل عليه واستخلاص معلومات منه؟ اقتباس
0 Saddam Alwaheab نشر أمس الساعة 13:24 الكاتب أرسل تقرير نشر أمس الساعة 13:24 بتاريخ 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") سويت هذا الكود بس الامور ما ظبطت 1 اقتباس
0 عبد الوهاب بومعراف نشر أمس الساعة 13:48 أرسل تقرير نشر أمس الساعة 13:48 السلام عليكم ورحمة الله، المشكلة على الأغلب أنها في 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 Mustafa Suleiman نشر أمس الساعة 15:03 أرسل تقرير نشر أمس الساعة 15:03 بتاريخ منذ ساعة مضت قال 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]) اقتباس
السؤال
Saddam Alwaheab
اعمل في مجمع طبي
ولدي حوالي 1500 خدمة وهناك خدمات مكررة ولكن صعب اكتشافها
واحتاج افضل حل لا استخراج الخدمات المتشابهه سوا بالنص تماما او المعنى او يكون في نسبة تشابة بالمعنى
طبعا الخدمات مكتوبه بالعربي والانجليزي بنفس الحقل
كما موضح في الصورة اسفل
4 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.