Tengo miles de listas de cadenas, y cada lista tiene alrededor de 10 cadenas. La mayoría de las cadenas en una lista dada son muy similares, aunque algunas cadenas (rara vez) no están completamente relacionadas con las demás y algunas cadenas contienen palabras irrelevantes. Pueden considerarse variaciones ruidosas de una cadena canónica. Estoy buscando un algoritmo o una biblioteca que convierta cada lista en esta cadena canónica.
Aquí hay una de esas listas.
- Star Wars: Episodio IV Una nueva esperanza | StarWars.com
- Star Wars Episodio IV - Una Nueva Esperanza (1977)
- Star Wars: Episodio IV - Una nueva esperanza - Rotten Tomatoes
- Mira Star Wars: Episodio IV - Una nueva esperanza en línea gratis
- Star Wars (1977) - Las mejores películas
- [REC] 4 póster promete muerte por motor fueraborda - SciFiNow
Para esta lista, cualquier cadena que coincida con la expresión regular ^Star Wars:? Episode IV (- )?A New Hope$
sería aceptable.
Miré el curso de Andrew Ng sobre Machine Learning en Coursera, pero no pude encontrar un problema similar.
nlp
similarity
information-retrieval
lacton
fuente
fuente
Respuestas:
Como solución ingenua, sugeriría seleccionar primero las cadenas que contienen los tokens más frecuentes dentro de la lista. De esta forma, puede deshacerse de la cadena irrelevante.
En la segunda frase, votaría por mayoría. Asumiendo las 3 oraciones:
Revisaría las fichas una por una. Comenzamos por "Star". Gana cuando toda la cadena comienza con ella. Las "guerras" también ganarán. El siguiente es ":". También ganará.
Todos los tokens ganarán en mayoría hasta "Hope". El siguiente token después de "Hope" será "|" o "(" o "-". ¡Ninguno de los dos ganará en la votación mayoritaria, así que me detendré aquí!
Otra solución sería probablemente usar la subsecuencia común más larga .
Como dije, no lo he pensado mucho. Por lo tanto, puede haber soluciones mucho mejores para su problema :-)
fuente
Primero calcule la distancia de edición entre todos los pares de cadenas. Ver http://en.wikipedia.org/wiki/Edit_distance y http://web.stanford.edu/class/cs124/lec/med.pdf . Luego excluya las cadenas de valores atípicos en función de un umbral de distancia.
Con las cadenas restantes, puede usar la matriz de distancia para identificar la cadena más central. Dependiendo del método que utilice, puede obtener resultados ambiguos para algunos datos. Ningún método es perfecto para todas las posibilidades. Para sus propósitos, todo lo que necesita son algunas reglas heurísticas para resolver ambigüedades, es decir, elegir dos o más candidatos.
Tal vez no desee elegir "más central" de su lista de cadenas, sino generar una expresión regular que capture el patrón común a todas las cadenas no atípicas. Una forma de hacerlo es sintetizar una cadena que sea equidistante de todas las cadenas no atípicas. Puede calcular la distancia de edición requerida desde la matriz, y luego generaría aleatoriamente regular utilizando esas distancias como restricciones. Luego probaría las expresiones regulares candidatas y aceptaría la primera que se ajuste a las restricciones y también acepte todas las cadenas en su lista no atípica. (Comience a construir expresiones regulares a partir de las listas de subcadenas comunes más largas, porque esos son caracteres que no son comodines).
fuente