使用1-10k关键字过滤HTML文档

时间:2013-01-28 15:12:08

标签: c# regex full-text-search string-matching

我有一个html文档,想要针对多个(1 - 10k)[目前1k,后来高达10k]关键字的余额进行过滤。

我有一个预编译的正则表达式,它存储我的搜索结果,如:

static Regex r = new Regex(@"keyword1|keyword2|keyword999",RegexOptions.Compiled | RegexOptions.IgnoreCase);

这是我的代码:

Stopwatch sw = new Stopwatch();
sw.Start();
MatchCollection matches = Cache.r.Matches(doc.DocumentNode.InnerHtml);
string s = "";
if (matches.Count > 0)
{
    foreach (Match m in matches)
    {
        s += m.Value + ",";
    }
}
long time = sw.ElapsedMilliseconds;
Console.Write(time + " = "+matches.Count+" -> "+s );

平均时间大约需要5-8秒。这太过分了。 有没有有效的方法来过滤大量关键字的HTML文档? 或者也许有更有效的算法来过滤这个......

4 个答案:

答案 0 :(得分:2)

您应该使用StringBuilder代替string ..

除非您告诉我们关于关键字的更多信息,否则几乎没有任何优化。

答案 1 :(得分:2)

lboshuizen 指出

  

使用10k关键字创建正则表达式似乎不是[...]

的方法

如果您能负担产生多个线程,您可以并行扫描文档以发现关键字:

IEnumerable<string> keywords = LoadKeywords();
List<string> list = new List<string>();
keywords.AsParallel()
    .Aggregate(list, (seed, keyword) =>
    {
        if(doc.DocumentNode.InnerHtml.Contains(keyword))
            seed.Add(keyword);
        return seed;
    });

答案 2 :(得分:2)

有些答案已经很好了,但我想我也会把它扔进去......

我做了同样的事情,我使用HTML Agility Pack来帮助减少我为关键字分析的内容。

http://htmlagilitypack.codeplex.com/

获取HTML片段非常容易,只搜索文本节点,然后在该空间而不是整个文档上运行关键字分析。

它还有助于摆脱误报(javascript评论中出现的关键字,alt标签,等等)。

尝试减少搜索空间。

答案 3 :(得分:1)

建议:

使用10k关键字创建正则表达式似乎不是我的POV的方法。正则表达式是贪婪的,将尝试所有类型的冗余匹配。 (=浪费时间)

使用较小的关键字集构建正则表达式,并在html文档中逐步运行它们。

优化可以是从文档中删除匹配的关键字(和相关内容),将缩小,剩下的正则表达式要少得多=运行得更快。

或者

转过来,不要使用正则表达式再次扫描文档。 将文档分解为单词并再次检查字典。我怀疑该文件将包含所有10k字。 (从最小集合循环比从最大集合循环更有效)