Question

Je ne suis pas un étudiant en programmation en langage naturel, mais je sais que ce n'est pas trivial strcmp (n1, n2).

Voici ce que j'ai appris jusqu'à présent:

  • comparer les noms personnels ne peut pas être résolu à 100%
  • il existe des moyens d’atteindre un certain degré de précision.
  • la réponse sera spécifique à la localisation, ce n'est pas grave.

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

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

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

J'essaie de:

  1. construire (ou copier) un algorithme qui note 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 ne consiste pas à trouver des noms dans le texte, mais à comparer deux noms. par exemple.

name_compare( "James Brown", "Brown, James", "en-US" ) ---> 99.0%
Était-ce utile?

La solution

J'ai utilisé Tanimoto Coefficient pour une solution rapide (mais pas super) en Python:

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

Modifier: Un lien vers un livre de qualité et utile .

Autres conseils

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

Nous venons de faire ce genre de travail sans escale récemment et notre approche consiste à créer une table de consultation ou une liste de pseudonymes. Si vous pouvez écarter les fautes d'orthographe / noms mal écrits / non anglais, alors la partie difficile est supprimée. Dans vos exemples, nous supposerions que le premier mot et le dernier mot sont le prénom et le nom de famille. Tout ce qui est entre les deux serait jeté (prénoms, initiales). Berry et Bernard seraient dans la liste des pseudonymes - et si Tsakala ne correspondait pas à Berry, nous inversions l'ordre des mots et obtenions la correspondance.

Une chose que vous devez comprendre est la base de données / les listes de personnes avec lesquelles vous traitez. Dans le monde anglophone, les prénoms sont enregistrés de manière inconsistante. Donc, vous ne pouvez pas faire ou refuser une correspondance basée sur le deuxième prénom ou son initiale. Soundex ne vous aidera pas avec des alias de noms communs tels que "Dick". et "Richard", "Berry". et " Bernard " et éventuellement " Steve " et "Stephen". Dans certaines communautés, il est assez courant que des personnes vivent à la même adresse et que deux ou trois générations vivent à cette adresse et portent le même nom. La seule façon de les séparer est par date de naissance. La date de naissance peut ou non être enregistrée. Si vous en avez l’influence, vous devriez probablement rendre obligatoire l’enregistrement de la date de naissance. Un grand nombre de " bases de données de personnes " soit ne pas enregistrer la date de naissance ou ne pas les divulguer pour des raisons de confidentialité.

Effectivement, l'appariement des noms de personnes n'est pas si compliqué. C'est entièrement basé sur la qualité des données fournies. Dans la pratique, de nombreux enregistrements restent incomparables - et même un humain qui les regarde ne peut résoudre le problème. Un humain peut remarquer des pseudonymes non répertoriés dans la liste des pseudonymes ou être en mesure de rechercher des informations personnelles sur Internet, mais vous ne pouvez pas vous attendre à ce que votre programme le fasse.

Les banques, les agences de notation et le gouvernement disposent de nombreuses informations détaillées sur nous. Les adresses précédentes, la date de naissance, etc. Et cela les aide à joindre des noms. Mais pour nous, programmeurs normaux, il n’ya pas de solution miracle.

L’analyse de l’ordre des noms et de l’existence de prénoms / initiales est triviale, bien sûr, il semble donc que le véritable défi consiste à connaître les variantes de noms usuels. Je doute que cela puisse être fait sans utiliser une sorte de table de recherche de pseudo. Cette liste est un bon point de départ. Il ne cartographie pas Bernard à Berry, mais il capturerait probablement les cas les plus courants. On pourrait peut-être trouver une liste encore plus exhaustive ailleurs, mais je pense vraiment qu'une table de consultation spécifique à la localisation est la solution.

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

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

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top