Quelles techniques / outils existe-t-il pour découvrir des expressions courantes dans des morceaux de texte?

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

  •  07-07-2019
  •  | 
  •  

Question

Disons que j'ai 100 000 corps d'e-mails et que 2 000 d'entre eux contiennent une ficelle banale comme "le renard brun rapide saute par-dessus le chien paresseux". ou "lorem ipsum dolor sit amet". Quelles techniques pourrais-je / devrais-je utiliser pour "utiliser le mien"? ces phrases? Je ne suis pas intéressé à extraire des mots simples ou des phrases courtes. De plus, j'ai besoin de filtrer les phrases que je connais déjà dans tous les mails.

Exemple:

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

Dans cet exemple, je souhaite que la fonction DiscoverPhrases renvoie "lorem ipsum dolor sit amet". et "passez une bonne journée". Ce n’est pas très important si la fonction renvoie également un "bruit" plus court. phrases, mais si possible, il serait bien de les éliminer en cours de route.

Modifier: j'ai oublié d'inclure mailbody3 dans l'exemple.

Était-ce utile?

La solution

Consultez les N -grams . Les phrases les plus courantes contribueront nécessairement les N -grammes les plus courants. Je commencerais par les trigrammes de mots et verrais où cela mène. (L'espace requis est N multiplié par la longueur du texte. Vous ne pouvez donc pas laisser N s'agrandir.) Si vous enregistrez les positions et pas seulement le nombre, peut ensuite voir si les trigrammes peuvent être étendus pour former des expressions communes.

Autres conseils

Je ne sais pas si c'est ce que vous voulez, mais consultez le plus long problème de sous-chaîne commun et algorithmes utilitaires diff.

Quelque chose comme cela pourrait fonctionner, selon que vous vous souciez des limites de mots. En pseudo-code (où LCS est une fonction permettant de calculer le La plus longue sous-séquence commune ):

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top