テキストの塊で一般的なフレーズを発見するためのテクニック/ツールは何ですか?

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

  •  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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top