【问题标题】:counting 1 word, 2 word and 3 word phrases occurrences in a webpage in C#/.NET在 C#/.NET 的网页中计算 1 个单词、2 个单词和 3 个单词短语的出现次数
【发布时间】:2011-11-12 15:34:44
【问题描述】:

我将编写一个程序,它接受一个 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 解析器并解析出所有内部文本。

【问题讨论】:

    标签: c# word counting


    【解决方案1】:

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

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

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

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

    对于从 HTML 中提取纯文本:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      回答你的问题 #2。

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

      如果你想让它更高效 - 使用后缀 trie(你可能必须自己编写)

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-19
        • 1970-01-01
        • 1970-01-01
        • 2013-12-10
        • 2018-12-12
        • 1970-01-01
        • 2023-04-04
        • 2015-11-28
        相关资源
        最近更新 更多