¿Qué algoritmo sería bueno para asignar una probabilidad a la coincidencia de dos nombres (John Doe = Mr. Jonathan M Doe II)?

Como dijo Alexei Yavlinsky, la distancia de edición es un buen punto de partida, pero creo que se puede mejorar. Considere el siguiente ejemplo:

John Doe vs Johana Doe vs Jonathan Doe

John y Jonathan son típicamente nombres masculinos, mientras que Johana es femenino, pero tiene una distancia de edición menor (John – Johana tiene una distancia de 2, John – Jonathan tiene una distancia de 4). Pero aún así, John y Jonathan son más similares. Le recomendaría que utilice la base de datos de nombres de hombres / mujeres, desde la cual puede razonar más sobre el género de las personas. También eche un vistazo a Determinar el género de una API de nombre, que le da probabilidad de género, para el nombre dado. Si el género de 2 nombres coincide o tiene mayor probabilidad, debería haber una mejor puntuación para esos pares. Entonces, John debería ser más similar a Jonathan que a Johana, independientemente de la distancia de edición.

Intente también tomar títulos / prefijos de nombre como: ms., Mrs., Mr., Miss. en cuenta. No sé cuál es su fuente de nombres, pero si obtiene títulos de personas con él, aproveche esa información (Mr significa nombre masculino, Mrs significa nombre femenino). Puede formar una expresión regular para unir títulos masculinos / femeninos.

Los algoritmos típicos de distancia de edición para medir la similitud entre 2 cadenas son Levenshtein o Jaro-Winkler. Te sugiero que eches un vistazo a la medida de similitud de Simon-White, que personalmente considero más precisa y significativa. Ejecute su propia prueba para ver qué funciona mejor para usted. Hay una biblioteca Java de Simmetrics que tiene muchas medidas de similitud de cadenas ya implementadas.

Mi proceso propuesto es algo así:

Línea de base : la probabilidad es 1 si “nombre x” es igual a “nombre y” – (John Doe vs John Doe = 1)

– Etiquete cada parte (palabra) de entrada con las siguientes etiquetas: # primer nombre, # último nombre, # nombre intermedio, # prefijo (mr., Mrs., Etc.), #suffix (II, Jr., etc.). Use regex (comienza con, termina con) para # prefijo / # sufijo, base de datos masculina / femenina para # nombre de pila, base de datos de apellido (como esta) para # nombre de pila, use algunas reglas simples para # nombre medio como “segundo nombre es palabra entre nombre y apellido “.

– Asigne el parámetro de importancia / peso a cada etiqueta, por lo que #firstname y #lastname deberían ser más importantes que #middlename, etc.

– Intente determinar el género de la persona de acuerdo con su primer nombre, segundo nombre.

– ¿Podemos obtener el género del prefijo? En caso afirmativo, ¿el prefijo coincide con #firstname (y #middlename) género?

– Calcular similitud de cadena entre 2 tokens de la misma etiqueta …

Su ejemplo: John Doe = Sr. Jonathan M Doe II

– Ambas entradas indican que esa persona es un hombre. Ninguna penalización.

– Si su etiquetado es correcto, indicamos que los apellidos coinciden: Doe = Doe. Ninguna penalización.

– Falta el prefijo “Sr.” no debería disminuir la puntuación por mucho, porque sabemos que John y
Jonathan son nombres masculinos, un Sr. es prefijo para hombres. Pequeña multa por extrañar al Sr., por ejemplo, 0.05.

– Falta el segundo nombre de M, debería, desde mi punto de vista, disminuir la puntuación por un poco más que el prefijo. Penalización por falta del segundo nombre M, p. Ej. 0.08.

– Penalización por Jonathan que no coincide con John. por ejemplo (distancia Simon-White entre 2 cuerdas) * peso.

Haz algo de normalización y tienes tu probabilidad.

La distancia de edición sería un buen punto de partida:

[La] distancia de edición es una forma de cuantificar cuán diferentes son dos cadenas (p. Ej., Palabras) entre sí contando el número mínimo de operaciones requeridas para transformar una cadena en la otra.

El Kit de herramientas de lenguaje natural en Python tiene una implementación de este algoritmo.

More Interesting

¿Qué es un perceptrón?

¿Cuál es el tamaño del conjunto de datos de Cifar?

¿Cómo podemos usar Tensorflow para problemas de clasificación?

¿Cuáles son buenos recursos para aprender sobre la ejecución distribuida en redes neuronales profundas (MPI, allreduce, etc.)?

¿Cuáles son los temas sobre big data para hacer una tesis de maestría que excluye el aprendizaje automático?

Estoy acostumbrado a codificar con C ++ y C #. ¿Cuál recomendaría implementar proyectos de ML a pequeña escala (NN y CNN clásicos) sin reinventar la rueda?

Cómo identificar la ubicación de cualquier mensaje de texto usando ML o NLP

¿Qué requisitos previos debe tener para aprender la teoría de las redes neuronales artificiales?

Construcción del modelo de correlación / regresión: ¿Cuándo debo usar variables dependientes / independientes reales, y cuándo debo usar sus tasas de crecimiento?

No tengo dinero para comprar una computadora poderosa, ¿cómo puedo aprender en la GPU?

¿Cuál es la razón para mapear datos de dos idiomas diferentes en un espacio de incrustación de palabras común y no usar dictonarios y asignarle el idioma b a los vectores del idioma a para entrenar un modelo de manera multilingüe?

¿Cuáles son los beneficios de usar el Descenso de gradiente de mini lotes?

¿Cuáles son algunas historias de éxito para Dirichlet Process Clustering?

¿Existen aplicaciones para bandidos multi armados en el campo de aprendizaje profundo?

¿Puedo usar el aprendizaje por refuerzo para ayudar a las personas a elegir la ruta más barata cuando viajan en avión?