テキストの塊で一般的なフレーズを発見するためのテクニック/ツールは何ですか?
-
07-07-2019 - |
質問
電子メールの本文は100,000個あり、そのうち2000個には「茶色のキツネが怠け者の犬を飛び越える」などの一般的な文字列が含まれているとします。または「lorem ipsum dolor sit amet」。 「マイニング」するために使用できる技術/使用すべき技術これらのフレーズ?単一の単語や短いフレーズをマイニングすることに興味はありません。また、すべてのメールで発生することがわかっているフレーズを除外する必要があります。
例:
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関数が「lorem ipsum dolor sit amet」を返すようにします。そして「良い一日を」。関数がより短い" noise"を返す場合も重要ではありません。フレーズですが、可能であれば、プロセスでこれらを削除するとよいでしょう。
編集:例にmailbody3を含めるのを忘れました。
解決
N -grams をご覧ください。最も一般的なフレーズは、最も一般的な N -gramに必ず貢献します。単語のトライグラムから始めて、それがどこにつながるかを見ていきます。 (必要なスペースはテキストの長さの N 倍なので、 N が大きくなりすぎないようにしてください。)カウントだけでなく位置を保存する場合は、その後、トライグラムを拡張して一般的なフレーズを形成できるかどうかを確認できます。
他のヒント
これがあなたの望むものかどうかはわかりませんが、最も一般的な部分文字列の問題を確認してくださいおよび diffユーティリティアルゴリズム
単語の境界を気にするかどうかに応じて、このような何かが機能する可能性があります。擬似コード( LCS
は最長共通サブシーケンス):
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);