首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >过滤包含1-10k关键字的HTML文档

过滤包含1-10k关键字的HTML文档
EN

Stack Overflow用户
提问于 2013-01-28 23:12:08
回答 4查看 197关注 0票数 0

我有一个html文档,并希望根据多个(1 - 10k) 1k的occurrency过滤它,以后最多10k个关键字。

我有一个预编译的regex,它存储我的搜索词,如下所示:

代码语言:javascript
复制
static Regex r = new Regex(@"keyword1|keyword2|keyword999",RegexOptions.Compiled | RegexOptions.IgnoreCase);

这是我的代码:

代码语言:javascript
复制
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文档?或者也许有更有效的算法来过滤它..

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-28 23:46:43

正如lboshuizen指出的那样

创建一个具有10k关键字的正则表达式似乎不是一种可行的方法...

如果您有能力生成多个线程,则可以并行扫描文档以查找关键字的出现:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-01-28 23:19:43

您应该使用StringBuilder而不是string

除非你告诉我们更多的关键字是什么,否则几乎没有任何优化。

票数 2
EN

Stack Overflow用户

发布于 2013-01-28 23:53:18

有些答案已经很不错了,但我想我还是把这个放进去吧……

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

http://htmlagilitypack.codeplex.com/

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

此外,它还有助于消除误报(出现在javascript注释中的关键字、alt标记等)。

这只是一个尝试缩小搜索空间的想法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14564980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档