1

我将编写一个程序,它接受一个 URL 并计算网页中每个单个 1 字、2 字和 3 字短语(可能还有 x 字短语)的出现次数。

这是我能想到的最好的算法:

1)。去除html标签

2)使所有内容小写

3)在空间上拆分文本并将它们全部放入一个数组中

4) 遍历每个单词,对于每个单词,您必须:将 word[i]、word[i+1]、word[i+2] 放入哈希表中。

每次发生碰撞时,您都会增加该单词或 2-3 个字母单词短语的字数。

我的问题是:

1)任何人都可以在空间和运行时间方面提供更有效的解决方案吗?

2) 有没有简单的方法在 C# 中做#1?
我可能可以使用 dom 解析器并解析出所有内部文本。

4

2 回答 2

3

根据您的情况,您可能会过度简化问题和/或您最终可能会付出很多努力来实现某些库中已经存在的功能。所以这不是一个直接的答案,而是关于解决这个问题的路径的建议。

您要实现的过程称为信息检索。它非常广泛和复杂,但幸运的是在这个领域有很多研究。其中一部分是提取单词ngram(ngram 是一组连续的字母或单词)。

让我向您展示一些您应该提前考虑的其他问题:

  • word中字母的大小写重要吗?
  • 点是您想用来标记句子结尾的唯一标志吗?
  • 你想排除停用词吗?停用词是您不想包含在“a”、“the”、“I”、“my”等短语中的词。
  • 你要词干吗?将单词从原始形式转换为词根形式,例如将复数形式转换为单数形式:篮球 -> 篮球

对于从 HTML 中提取纯文本:

  • 只提取页面上显示的文本?
  • 还提取提示?(就像将鼠标悬停在图片上时显示的那样)
  • 任何其他不可见的文本(元标记等)

有一些库可以从原材料中搜索和提取信息。“原材料”意味着您必须处理文档(html、doc、pdf、图像……)并将其转换为文本,以便搜索引擎对其进行索引(例如,提取短语)。一旦文档被索引,它就可以被搜索。.NET 的此类库之一是Lucene.NET。它支持不同的词干分析器、分析器、过滤器。

我不确定,但我相信也有用于从 html 中提取文本的库。

基本上,您的方法可能适用于一些不那么小的错误级别是可以接受的更简单的场景。我最近对信息检索产生了兴趣,发现它非常复杂和有趣。根据您的目标,您可能会从研究该主题中获益。这里有很多关于 stackoverflow 以及 Internet 其他部分的信息。

如果您决定采用这种方式,那么 Lucene(原始 Lucene JAVA 版本,Lucene.NET 移植到 .NET)上的信息要比 Lucene.NET 上的多得多。因此,如果您没有找到 Lucene.NET 的答案,请立即搜索 Lucene 讨论。

于 2011-11-12T16:08:20.420 回答
1

回答你的问题#2。

HtmlDocument doc = WebBrowser1.Document;
string text = doc.GetInnerText();

如果你想让它更有效率 - 使用后缀特里(你可能必须自己写)

http://en.wikipedia.org/wiki/Suffix_trie

后缀特里树基本上使搜索字符串取决于字符串的长度而不是数组的长度。它是他们在搜索引擎中使用的那种东西。

于 2011-11-12T15:39:21.570 回答