que tienen un razonablemente grande conjunto de cadenas (por ejemplo 100) que tiene una serie de subgrupos caracterizados por su similitud. Estoy tratando de encontrar/diseñar un algoritmo que encuentre esos grupos razonablemente eficiente.encontrar grupos de cadenas similares en un amplio conjunto de cadenas
A modo de ejemplo digamos que la lista de entrada está a la izquierda abajo, y los grupos de salida están a la derecha.
Input Output
----------------- -----------------
Jane Doe Mr Philip Roberts
Mr Philip Roberts Phil Roberts
Foo McBar Philip Roberts
David Jones
Phil Roberts Foo McBar
Davey Jones =>
John Smith David Jones
Philip Roberts Dave Jones
Dave Jones Davey Jones
Jonny Smith
Jane Doe
John Smith
Jonny Smith
¿Alguien sabe de alguna manera de resolver esto razonablemente eficiente?
El método estándar para encontrar cadenas similares parece ser la distancia de Levenshtein, pero no veo cómo puedo hacer un buen uso de eso aquí sin tener que comparar cada cadena con cada cadena de la lista, y de alguna manera decidir sobre un umbral de diferencia para decidir si las dos cadenas están en el mismo grupo o no.
Una alternativa sería un algoritmo que hashes cuerdas hacia abajo para un número entero, donde cadenas similares hash para números enteros que están muy juntos en la línea de número. No tengo ni idea de qué algoritmo que sería, sin embargo, incluso si uno existe
¿Alguien tiene alguna idea/punteros?
ACTUALIZACIÓN: @Will R: Tal vez los nombres no eran un ejemplo tan bueno como pensé por primera vez. Como punto de partida, creo que puedo suponer que en los datos con los que trabajaré, un pequeño cambio en una cadena no hará que salte de un grupo a otro.
¿Cómo desea que su algoritmo para hacer frente a una secuencia de cadenas, donde cada uno es muy sutilmente diferente a la anterior, pero la primera es muy diferente a la anterior? – Eric
Buena pregunta. Como punto de partida, no estoy demasiado preocupado porque espero que los grupos de cadenas sean razonablemente distintos en los datos que estoy esperando. También debo agregar que tendré al menos otra dimensión (que ya es numérica) para cada entidad en la lista para ayudar con la agrupación, por lo que la parte de comparación de cadenas no tiene que ser 100% perfecta. – latentflip