有哪些技术/工具可以发现文本块中的常用短语?

时间:2009-09-15 10:42:17

标签: .net data-mining

让我们说我有100000个电子邮件正文,其中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”和“祝你有愉快的一天”。如果函数还返回较短的“噪声”短语并不重要,但如果可能的话,在此过程中消除这些短语会很好。

编辑:我忘了在示例中包含mailbody3。

3 个答案:

答案 0 :(得分:6)

看看N-grams。最常见的短语必然会贡献最常见的 N -grams。我从单词三元组开始,看看它在哪里引导。 (所需空间 N 乘以文本的长度,因此您不能让 N 变得太大。)如果您保存位置而不仅仅是计数,那么然后可以看看是否可以扩展三卦以形成常用短语。

答案 1 :(得分:1)

我不确定这是否是您想要的,但请查看longest common substring problemdiff utility algorithms.

答案 2 :(得分:1)

这样的事情可能有用,这取决于你是否关心单词边界。在伪代码中(其中LCS是用于计算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);