【问题标题】:Find Text having highest density of words查找单词密度最高的文本
【发布时间】:2017-11-08 18:56:53
【问题描述】:

我有一个哈希如下:

{1=>[{content=>"Text of paragraph 1.........."},{content=>"Text of paragraph 2"}]}

上面的哈希是在解析一个文本文件后创建的。键“1”代表第 1 页。它指向一个哈希数组,每个哈希指向一个段落,内容键指向实际文本。

现在我有一个类似 [word1,word2,word3] 的单词列表。我必须遍历该页面的所有段落内容,并判断哪个段落出现这些单词的次数最多。

我可以编写自己的代码,对段落中的每个单词进行正则表达式匹配。但我想知道是否有任何强大的字符串匹配库可以解决这个用例(在 C、C++ 甚至 ruby​​ 中)

它只是不是字符串匹配。我需要一个库,可以提取包含单词列表中单词密度最高的数据。

【问题讨论】:

    标签: c ruby regex string pattern-matching


    【解决方案1】:

    这是一个简单的例子,在ruby,用于计算字符串中单词的频率:

    def count_words(string)
      string
        .scan(/[\w']+/) # Treat strings like "don't" as a single word
        .each_with_object(Hash.new(0)) do |w,h|
          h[w.downcase] += 1
        end
    end
    

    用法:

    word_occurrences = count_words("Hello world! Hello, vipul.")
      => {"hello"=>2, "world"=>1, "vipul"=>1}
    

    你不应该需要第三方库来实现这么简单的东西。

    要检查特定单词的出现,只需在哈希中查找它:

    word_occurrences[word1.downcase]
    

    要获得“密度最高”的单词列表,只需按哈希值排序:

    word_occurrences.sort_by {|_word, occurrences| -occurrences}
    # Note the negative to make this descending, not ascending
    

    【讨论】:

    • 我可能会考虑使用第三方库的唯一原因是,如果像 /[\w']+/ 这样的简单正则表达式不足以满足您的需求。编写一个 perfect 正则表达式来分隔单词几乎是不可能的 - 但您可以改用自然语言解析器。 (但是,我强烈怀疑这对于您想要实现的目标来说太过分了......)
    • 感谢您的回答。所以在我的情况下,单词列表将在 100-200 左右,文本可以大到 4-5 页内容。我一直在寻找一种不同的解决方案,它可以扩展并且性能问题最少。
    • 上述解决方案仅作为参考。如果性能成为问题,请随意集成数据库或其他东西......但老实说,跨 5 页 100-200 字几乎不会成为问题!如果您正在处理 数百万 个页面,那么您将有更多的理由担心。
    猜你喜欢
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多