2009-09-15 9 views
6

私は100000のメール本文を持っていて、そのうちの2000個には "怠け者の犬の上の急な茶色のキツネのジャンプ"や "lorem ipsum dolor sitetet"のような普通の普通の文字列が含まれているとします。これらのフレーズを「マイニング」するためにどのようなテクニックを使うことができますか?私は単一の単語や短いフレーズを掘ることには興味がありません。また、私はすでに知っているフレーズをすべてのメールでフィルタリングする必要があります。テキストの塊で共通のフレーズを発見するためのテクニック/ツールはありますか?

例:この例では

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

私はDiscoverPhrasesは「AMET座るLoremのイプサム悲しみ」と「良い一日を」返すように機能します。関数が短い "ノイズ"フレーズを返すのであれば、それほど重要ではありませんが、可能であれば、これらのノイズを処理中に排除するのが良いでしょう。

編集:この例ではmailbody3を含めるのを忘れました。

答えて

6

N-gramsを見てください。最も一般的な表現は必然的に最も一般的なものです。N -grams。私は単語trigramsから始まり、それがどこにつながるのか見てみましょう。 (必要なスペースはです。Nとテキストの長さが等しいので、Nが大きくなりすぎることはありません)。カウントだけでなく位置を保存すると、トライグラムを共通のフレーズを形成する。

+0

ありがとうございました。それは素晴らしいヒントです! – JohannesH

1

をチェックアウトし、このような何かを使用すると、単語の境界を気にするかどうかに応じて、動作する可能性があります。擬似コードで(LCSLongest 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); 
関連する問題