2009-09-15 15 views
6

Powiedzmy, że mam 100000 wiadomości e-mail, a 2000 z nich zawiera skrótowy ciąg znaków, taki jak "szybki brązowy lis przeskakuje nad leniwym psem" lub "lorem ipsum dolor sit amet". Jakie techniki może/powinienem użyć do "wydobycia" tych zwrotów? Nie jestem zainteresowany wydobywaniem pojedynczych słów lub krótkich fraz. Muszę również odfiltrować wyrazy, które już wiem, występują we wszystkich wiadomościach.Jakie techniki/narzędzia są dostępne do odkrywania popularnych zwrotów w kawałkach tekstu?

Przykład:

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

W tym przykładzie chcę się DiscoverPhrases funkcjonować powrotu "Lorem ipsum dolor sit amet" i "have a nice day". Nie jest to ważne, jeśli funkcja zwraca również krótsze frazy "szumowe", ale jeśli jest to możliwe, byłoby miło wyeliminować je w procesie.

Edycja: Zapomniałem dołączyć mailbody3 do przykładu.

Odpowiedz

6

Zobacz na N-grams. Najczęściej używane wyrażenia będą koniecznie składać się z najczęstszych fraz. Zacznę od słów trygramów i zobaczę, dokąd to prowadzi. (Wymagane miejsce to N razy długość tekstu, więc nie możesz pozwolić, aby N było zbyt duże.) Jeśli zapiszesz pozycje, a nie tylko liczbę, możesz sprawdzić, czy trygramy można rozszerzyć na tworzyć wspólne frazy.

+0

Dzięki. To świetna wskazówka! – JohannesH

1

Coś jak to może działać, w zależności od tego, czy zależy Ci na granicy słów. Pseudo-kod (gdzie LCS to funkcja obliczania Longest Common Subsequence):

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); 
Powiązane problemy