2009-06-21 8 views
3

Je ne suis pas un étudiant en programmation en langage naturel, mais je sais que ce n'est pas trivial strcmp (n1, n2).Comparaison des noms humains: façons d'aborder cette tâche

Voici ce que je l'ai appris à ce jour:

  • comparant les noms de personnes ne peuvent pas être résolus 100%
  • il existe des moyens pour atteindre certain degré de précision.
  • la réponse sera spécifique à la locale, c'est OK.

Je ne cherche pas d'alternatives orthographiques! L'hypothèse est que l'orthographe de l'entrée est correcte.

Par exemple, tous les noms ci-dessous peuvent se référer à la même personne:

  • Berry Tsakala
  • Bernard Tsakala
  • Berry J. Tsakala
  • Tsakala, Berry

J'essaie de:

  1. build (ou copier) un algorithme qui notes la relation 2 noms d'entrée
  2. trouver une méthode d'indexation (pour les noms dans ma base de données, pour les tables de hachage, etc.)

note: Ma tâche n » t sur la recherche de noms dans le texte, mais pour comparer 2 noms. par exemple.

name_compare("James Brown", "Brown, James", "en-US") ---> 99.0% 

Répondre

7

I utilisé Tanimoto Coefficient pour une solution, en Python rapide (mais pas super):

""" 
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 
>>> 

Edit:A link to a good and useful book.

+0

tanimoto est parfaitement heureux de prendre des chaînes, pas besoin de les lister-ify – Jimmy

+0

Oups! Jimmy vous avez raison, merci! –

+0

Très intéressant! Merci. Cela me donne réellement un résultat numérique significatif. (J'essaie de compiler this one pour toutes nos plates-formes ... n'a pas pu trouver une implémentation binaire) –

2

Soundex est parfois utilisé pour comparer des noms similaires. Il ne traite pas de l'ordre de prénom/nom, mais vous pourriez probablement avoir votre code chercher la virgule pour résoudre ce problème.

+0

Oui @Jacob soundex est bonne chose, mais @berry devra trouver une bonne mise en œuvre dans la langue qu'il utilise. – TheVillageIdiot

+0

C'est bien, et google trouve de nombreuses bibliothèques soundex et des convertisseurs en ligne. Cependant, Bernard! = Barry dans Soundex. –

+0

Mauvaise réponse. Soundex surmonte la mauvaise orthographe, pas l'ordre différent. J'ai écrit explicitement - l'orthographe est toujours correcte. –

0

L'analyse de l'ordre des noms et de l'existence des prénoms/initiales est bien sûr triviale, il semble donc que le véritable défi consiste à connaître les alternatives aux noms communs. Je doute que cela puisse être fait sans utiliser une sorte de table de recherche de pseudo. This list est un bon point de départ. Il ne cartographie pas Bernard à Berry, mais il serait probablement attraper les cas les plus courants. Peut-être une liste encore plus exhaustive peut-être trouvée ailleurs, mais je pense vraiment qu'une table de recherche spécifique à la locale est la voie à suivre.

1

Nous venons de faire ce genre de travail non-stop récemment et l'approche que nous avons prise est d'avoir une table de recherche ou une liste d'alias. Si vous pouvez éliminer les fautes d'orthographe/Misheard/non-anglais, alors la partie difficile est enlevée. Dans vos exemples, nous supposerons que le premier mot et le dernier mot sont le prénom et le nom de famille. Tout ce qui se trouve entre les deux serait ignoré (prénoms, initiales). Berry et Bernard seraient dans la liste des alias - et quand Tsakala ne correspondrait pas à Berry, nous inverserions l'ordre des mots et obtiendrions le match.

Une chose que vous devez comprendre est la base de données/personnes que vous traitez. Dans le monde anglophone, les prénoms sont enregistrés de manière incohérente. Vous ne pouvez donc pas faire ou refuser une correspondance basée sur le deuxième prénom ou l'initiale du second prénom. Soundex ne vous aidera pas avec les alias de noms communs tels que "Dick" et "Richard", "Berry" et "Bernard" et peut-être "Steve" et "Stephen". Dans certaines communautés, il est assez fréquent que les gens vivent à la même adresse et ont 2 ou 3 générations à cette adresse portant le même nom. La seule façon de les séparer est la date de naissance. La date de naissance peut être enregistrée ou non. Si vous avez l'influence, vous devriez probablement rendre l'enregistrement de la date de naissance obligatoire. Beaucoup de «bases de données de personnes» n'indiquent pas la date de naissance ou ne les donnent pas pour des raisons de confidentialité.

Effectivement, le nom des personnes n'est pas si compliqué. Son entièrement basé sur la qualité des données fournies. Ce qui se passe dans la pratique, c'est que beaucoup d'enregistrements restent inégalés - et même un humain qui les regarde ne peut pas résoudre l'inadéquation. Un utilisateur peut remarquer des alias de nom qui ne sont pas enregistrés dans la liste des alias ou peut être en mesure de rechercher les détails de la personne sur Internet - mais vous ne pouvez pas vous attendre à ce que votre programme le fasse.

Les banques, les agences de notation de crédit et le gouvernement ont beaucoup d'informations détaillées à notre sujet. Les adresses précédentes, date de naissance, etc Et cela les aide à rejoindre les noms. Mais pour nous programmeurs normaux, il n'y a pas de solution miracle.

+0

Nice, bien que les deuxièmes noms jouent un rôle très important dans la distinction des noms communs de chacun d'eux. Prenez, par exemple, les noms espagnols: l'ajout d'une seule lettre ou d'un deuxième prénom réduit de manière significative une correspondance possible avec une liste de noms alternatifs. –

+0

J'ai dit que si vous ne comptez pas les noms en anglais. Si vous travaillez dans une situation culturelle où les prénoms étaient importants, vous changeriez évidemment la logique. Le deuxième nom deviendrait effectivement une partie du prénom. Dans cette situation, j'essaierais d'obtenir une correspondance sur le prénom, le deuxième prénom et le nom de famille, puis réessayer sans second nom et peut-être classer les résultats en conséquence –

+0

En anglais, il est conseillé d'ignorer les initiales du second prénom. Les prénoms sont enregistrés de manière incohérente et les initiales moyennes sont susceptibles d'être mal entendues lorsqu'elles sont enregistrées. J'ai suivi cette approche en faisant correspondre les noms de différentes bases de données. Nous avons fini avec environ 20k de dossiers de personnes. –

0

J'ai eu de vrais problèmes avec le Tanimoto en utilisant utf-8.

Ce qui fonctionne pour les langues qui utilisent des signes diacritiques est difflib.SequenceMatcher()

+0

intéressant. Merci! –

Questions connexes