Pregunta

No soy un estudiante de programación de lenguaje natural, pero sé que no es un strcmp trivial (n1, n2).

Esto es lo que he aprendido hasta ahora:

  • comparar nombres personales no se puede resolver al 100%
  • hay formas de lograr cierto grado de precisión.
  • la respuesta será específica de la localidad, está bien.

¡No estoy buscando alternativas de ortografía! Se supone que la ortografía de la entrada es correcta.

Por ejemplo, todos los nombres a continuación pueden referirse a la misma persona:

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

Estoy intentando:

  1. construir (o copiar) un algoritmo que califica los nombres de entrada de la relación 2
  2. encontrar un método de indexación (para nombres en mi base de datos, para tablas hash, etc.)

nota: Mi tarea no es encontrar nombres en el texto, sino comparar 2 nombres. p.ej.

name_compare( "James Brown", "Brown, James", "en-US" ) ---> 99.0%
¿Fue útil?

Solución

Utilicé el coeficiente de Tanimoto para una solución rápida (pero no súper), 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
>>> 

Editar: Un enlace a un libro bueno y útil .

Otros consejos

Soundex a veces se usa para comparar nombres similares. No trata con el orden de nombre / apellido, pero probablemente podría hacer que su código busque la coma para resolver ese problema.

Recientemente hemos estado haciendo este tipo de trabajo sin parar y el enfoque que hemos tomado es tener una tabla de búsqueda o una lista de alias. Si puede descartar los errores ortográficos / mal escuchados / nombres que no están en inglés, entonces la parte difícil se quita. En sus ejemplos, supondríamos que la primera palabra y la última palabra son el nombre y el apellido. Cualquier cosa en el medio sería descartada (segundo nombre, iniciales). Berry y Bernard estarían en la lista de alias, y cuando Tsakala no coincidiera con Berry, cambiaríamos el orden de las palabras y luego obtendríamos la coincidencia.

Una cosa que debe comprender es la base de datos / listas de personas con las que está tratando. En el mundo de habla inglesa, los segundos nombres se registran de manera inconsistente. Por lo tanto, no puede hacer o negar una coincidencia basada en el segundo nombre o la inicial del segundo nombre. Soundex no lo ayudará con alias de nombres comunes como "Dick" y "Richard", "Berry" y "Bernard" y posiblemente " Steve " y "Stephen". En algunas comunidades es bastante común que las personas vivan en la misma dirección y tengan 2 o 3 generaciones viviendo en esa dirección con el mismo nombre. La única forma de separarlos es por fecha de nacimiento. La fecha de nacimiento puede o no ser registrada. Si tiene la influencia, probablemente debería hacer obligatoria la grabación de la fecha de nacimiento. Una gran cantidad de "bases de datos de personas" o no registra la fecha de nacimiento o no los regalará por razones de privacidad.

Efectivamente, la coincidencia de nombres de personas no es tan complicada. Está completamente basado en la calidad de los datos suministrados. Lo que sucede en la práctica es que muchos registros permanecen inigualables, e incluso un humano que los mira no puede resolver la falta de coincidencia. Un humano puede notar alias de nombres que no están registrados en la lista de alias o puede buscar detalles de la persona en Internet, pero realmente no puede esperar que su programa lo haga.

Los bancos, las organizaciones de calificación crediticia y el gobierno tienen mucha información detallada sobre nosotros. Direcciones anteriores, fecha de nacimiento, etc. Y eso les ayuda a unir nombres. Pero para nosotros, los programadores normales, no hay una bala mágica.

Analizar el orden de los nombres y la existencia de segundos nombres / iniciales es trivial, por supuesto, por lo que parece que el verdadero desafío es conocer alternativas de nombres comunes. Dudo que esto se pueda hacer sin usar algún tipo de tabla de búsqueda de apodos. Esta lista es un buen punto de partida. No asigna a Bernard a Berry, pero probablemente detectaría los casos más comunes. Tal vez se pueda encontrar una lista aún más exhaustiva en otros lugares, pero definitivamente creo que una tabla de búsqueda específica de la localidad es el camino a seguir.

Tuve problemas reales con el Tanimoto usando utf-8.

Lo que funciona para los idiomas que usan signos diacríticos es difflib.SequenceMatcher()

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top