¿Qué técnicas / herramientas existen para descubrir frases comunes en fragmentos de texto?

StackOverflow https://stackoverflow.com/questions/1426383

  •  07-07-2019
  •  | 
  •  

Pregunta

Digamos que tengo 100000 cuerpos de correo electrónico y 2000 de ellos contienen una cadena común abitinaria como "el rápido zorro marrón salta sobre el perro perezoso". o "lorem ipsum dolor sit amet". ¿Qué técnicas podría / debería usar para "minar"? estas frases? No estoy interesado en extraer palabras sueltas o frases cortas. También necesito filtrar frases que ya sé que aparecen en todos los correos.

Ejemplo:

string mailbody1 = "Welcome to the world of tomorrow! This is the first mail body. Lorem ipsum dolor sit AMET. Have a nice day dude. Cya!";
string mailbody2 = "Welcome to the world of yesterday! Lorem ipsum dolor sit amet Please note this is the body of the second mail. Have a nice day.";
string mailbody3 = "A completely different body.";
string[] mailbodies = new[] {mailbody1, mailbody2, mailbody3};
string[] ignoredPhrases = new[] {"Welcome to the world of"};

string[] results = DiscoverPhrases(mailbodies, ignoredPhrases);

En este ejemplo, quiero que la función DiscoverPhrases devuelva " lorem ipsum dolor sit amet " y "que tengas un buen día". No es tan importante si la función también devuelve más corto "ruido" frases, pero si es posible, sería bueno eliminarlas en el proceso.

Editar: olvidé incluir mailbody3 en el ejemplo.

¿Fue útil?

Solución

Eche un vistazo a N -grams . Las frases más comunes necesariamente contribuirán con los N -gramas más comunes. Comenzaría con trigramas de palabras y vería a dónde lleva eso. (El espacio requerido es N veces la longitud del texto, por lo que no puede permitir que N crezca demasiado). Si guarda las posiciones y no solo un recuento, usted puede ver si los trigramas se pueden extender para formar frases comunes.

Otros consejos

No estoy seguro de si esto es lo que quiere, pero consulte el problema de subcadena más largo y algoritmos de utilidad diff.

Algo como esto podría funcionar, dependiendo de si le interesan los límites de palabras. En pseudocódigo (donde LCS es una función para calcular la Subsecuencia común más larga ):

someMinimumLengthParameter = 20;
foundPhrases = [];

do {
    lcs = LCS(mailbodies);
    if (lcs in ignoredPhrases) continue;

    foundPhrases += lcs;

    for body in mailbodies {
        body.remove(lcs);
    }    
} while(lcs.length > someMinimumLengthParameter);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top