مقارنة اسم الإنسان:طرق التعامل مع هذه المهمة

StackOverflow https://stackoverflow.com/questions/1023361

  •  06-07-2019
  •  | 
  •  

سؤال

أنا لست طالبًا في برمجة اللغات الطبيعية، ولكنني أعلم أنها ليست بالأمر التافه strcmp(n1,n2).

وإليك ما تعلمته حتى الآن:

  • مقارنة الأسماء الشخصية لا يمكن حلها بنسبة 100%
  • هناك طرق لتحقيق درجة معينة من الدقة.
  • ستكون الإجابة خاصة بالإعدادات المحلية، فلا بأس بذلك.

أنا لا أبحث عن بدائل إملائية!الافتراض هو أن تهجئة الإدخال صحيحة.

على سبيل المثال، جميع الأسماء أدناه يمكن أن تشير إلى نفس الشخص:

  • بيري تساكالا
  • برنارد تساكالا
  • بيري ج.تساكالا
  • تساكالا، بيري

أحاول أن:

  1. إنشاء (أو نسخ) خوارزمية تقوم بتصنيف العلاقة بين أسماء الإدخال
  2. العثور على طريقة للفهرسة (للأسماء الموجودة في قاعدة البيانات الخاصة بي، لجداول التجزئة، وما إلى ذلك)

ملحوظة:مهمتي لا تتعلق بالعثور على الأسماء في النص، بل بمقارنة اسمين.على سبيل المثال

name_compare( "James Brown", "Brown, James", "en-US" ) ---> 99.0%
هل كانت مفيدة؟

المحلول

لقد استخدمت معامل تانيموتو لحل سريع (ولكن ليس فائقًا) في بايثون:

"""
Formula:
  Na = number of set A elements
  Nb = number of set B elements
  Nc = number of common items

  T = Nc / (Na + Nb - Nc)
"""
def tanimoto(a, b):
    c = [v for v in a if v in b]
    return float(len(c)) / (len(a)+len(b)-len(c))

def name_compare(name1, name2):
    return tanimoto(name1, name2)


>>> name_compare("James Brown", "Brown, James")
0.91666666666666663
>>> name_compare("Berry Tsakala", "Bernard Tsakala")
0.75
>>> 

يحرر: رابط لكتاب جيد ومفيد.

نصائح أخرى

Soundex يستخدم أحيانًا لمقارنة الأسماء المتشابهة.إنه لا يتعامل مع ترتيب الاسم الأول/اسم العائلة، ولكن ربما يمكنك فقط جعل الكود الخاص بك يبحث عن الفاصلة لحل هذه المشكلة.

لقد قمنا بهذا النوع من العمل بدون توقف مؤخرًا والأسلوب الذي اتبعناه هو الحصول على جدول بحث أو قائمة أسماء مستعارة.إذا كان بإمكانك استبعاد الأخطاء الإملائية/الأسماء غير المكتوبة/الأسماء غير الإنجليزية، فسيتم حذف الجزء الصعب.في الأمثلة الخاصة بك، نفترض أن الكلمة الأولى والكلمة الأخيرة هما الاسم الأول واللقب.سيتم تجاهل أي شيء بينهما (الأسماء الوسطى والأحرف الأولى).سيكون بيري وبيرنارد موجودين في قائمة الأسماء المستعارة - وعندما لا يتطابق Tsakala مع Berry، فإننا نقلب ترتيب الكلمات ثم نحصل على المطابقة.

شيء واحد تحتاج إلى فهمه هو قاعدة البيانات/قوائم الأشخاص التي تتعامل معها.في العالم الناطق باللغة الإنجليزية، يتم تسجيل الأسماء الوسطى بشكل غير متسق.لذلك لا يمكنك إجراء تطابق أو رفضه بناءً على الاسم الأوسط أو الحرف الأول من الاسم الأوسط.لن يساعدك Soundex في الأسماء المستعارة الشائعة مثل "Dick" و"Richard" و"Berry" و"Bernard" وربما "Steve" و"Stephen".من الشائع جدًا في بعض المجتمعات أن يعيش الأشخاص في نفس العنوان ويعيش جيلان أو ثلاثة أجيال في ذلك العنوان بنفس الاسم.الطريقة الوحيدة التي يمكنك من خلالها فصلهم هي حسب تاريخ الميلاد.قد يتم أو لا يتم تسجيل تاريخ الميلاد.إذا كان لديك النفوذ، فمن المحتمل أن تجعل تسجيل تاريخ الميلاد إلزاميًا.الكثير من "قواعد بيانات الأشخاص" إما لا تسجل تاريخ الميلاد أو لا تتخلى عنها لأسباب تتعلق بالخصوصية.

إن مطابقة أسماء الأشخاص بشكل فعال ليست بهذا التعقيد.يعتمد الأمر بالكامل على جودة البيانات المقدمة.ما يحدث عمليًا هو أن الكثير من السجلات تظل غير متطابقة - وحتى الإنسان الذي ينظر إليها لا يمكنه حل عدم التطابق.قد يلاحظ الإنسان أسماء مستعارة غير مسجلة في قائمة الأسماء المستعارة أو قد يتمكن من البحث عن تفاصيل الشخص على الإنترنت - ولكن لا يمكنك أن تتوقع حقًا أن يقوم برنامجك بذلك.

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

يعد تحليل ترتيب الأسماء ووجود الأسماء الوسطى/الأحرف الأولى أمرًا تافهًا بالطبع، لذا يبدو أن التحدي الحقيقي هو معرفة بدائل الأسماء الشائعة.أشك في إمكانية القيام بذلك دون استخدام نوع من جدول البحث عن الألقاب. هذه القائمة هي نقطة انطلاق جيدة.لا يقوم بتعيين برنارد إلى بيري، ولكن من المحتمل أن يلتقط الحالات الأكثر شيوعًا.ربما يمكن العثور على قائمة أكثر شمولاً في مكان آخر، لكنني أعتقد بالتأكيد أن جدول البحث الخاص بالإعدادات المحلية هو الحل الأمثل.

واجهت مشاكل حقيقية مع Tanimoto باستخدام utf-8.

ما يصلح للغات التي تستخدم علامات التشكيل هو difflib.SequenceMatcher()

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top