我有一个html文档,并希望根据多个(1 - 10k) 1k的occurrency过滤它,以后最多10k个关键字。
我有一个预编译的regex,它存储我的搜索词,如下所示:
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文档?或者也许有更有效的算法来过滤它..
发布于 2013-01-28 23:46:43
正如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;
});发布于 2013-01-28 23:19:43
您应该使用StringBuilder而不是string。
除非你告诉我们更多的关键字是什么,否则几乎没有任何优化。
发布于 2013-01-28 23:53:18
有些答案已经很不错了,但我想我还是把这个放进去吧……
我做了同样的事情,我使用了HTML Agility Pack来帮助减少我分析关键字的内容。
http://htmlagilitypack.codeplex.com/
获取HTML片段,只搜索文本节点,然后对该空间而不是整个文档运行关键字分析是非常容易的。
此外,它还有助于消除误报(出现在javascript注释中的关键字、alt标记等)。
这只是一个尝试缩小搜索空间的想法。
https://stackoverflow.com/questions/14564980
复制相似问题