Extraer una cadena canónica de una lista de cadenas ruidosas


10

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.


2
PD: Creo que el término que estás buscando es "canónico"
Sean Owen

¿Es la cadena "más probable" / "más consensuada" que está buscando para identificar una expresión regular? ¿O una de las cadenas de la lista?
MrMeritology

@MrMeritology No estoy buscando una expresión regular. He mostrado una expresión regular en mi pregunta solo para ilustrar cuán flexible soy en el tipo de cadenas que consideraría correctas.
lacton

OKAY. Entonces la respuesta que di a continuación debería funcionar para usted.
MrMeritology

¿Estaría esto bajo NER (reconocimiento de entidad nombrada)?
hippietrail

Respuestas:


4

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:

  • 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

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 :-)


3

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).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.