gpt4 book ai didi

Ruby - 一大组句子中出现频率最高的单词或短语

转载 作者:行者123 更新时间:2023-11-29 13:57:42 25 4
gpt4 key购买 nike

我想在一大组句子中找出重复次数最多的单词和短语。我在想的是以下解决方案:

  1. 构建一个包含每个单词、成对单词和三个单词组的计数的散列。
  2. 给单例的权重为 1,给情侣的权重为 2,给三人组的权重为 3(权重的目的是优先考虑短语而不是单个单词)。
  3. 从散列中选出排名靠前的词/短语。

我担心的是,当我有大量句子时(比如说 10 万个句子,每个句子平均有 100 个单词),散列会很大,会耗尽我的服务器内存。

当然,我还需要清理介词词,例如:“is”、“a”、“to”......

有什么想法吗?如果有帮助,我的数据库是 postgres。

实现上述解决方案:

  def most_common_words_or_phrases
singles = Hash.new(0)
doubles = Hash.new(0)
triplets = Hash.new(0)

reviews.find_each do |review|
next if review.content.empty?
parts = review.content.split.map!(&:downcase)
size = parts.size

parts.each_with_index do |val, index|
next if @@prepositions.include?(val)
second_word = parts[index + 1] if index != size - 1
second_word = nil if second_word.present? && (val[val.size - 1] == "." || val[val.size - 1] == "," || val[val.size - 1] == "!" || @@prepositions.include?(second_word))
third_word = parts[index + 2] if index < size - 2
third_word = third_word.gsub(/\p{^Alnum}/, '') if third_word.present?
third_word = nil if second_word.blank? ||(third_word.present? &&
(second_word[second_word.size - 1] == "." || second_word[second_word.size - 1] == "," ||
second_word[second_word.size - 1] == "!") || @@prepositions.include?(third_word))

singles[val] += 1

double = val + " " + second_word.gsub(/\p{^Alnum}/, '') if second_word.present?
doubles[double] += 2 if double.present?

triplets[double + " " + third_word] += 3 if double.present? && third_word.present?
end
end

singles.merge(doubles).merge(triplets)
end

最佳答案

正如@bronislav 在评论中提到的,使用 Redis 存储 bug Hashes 很好。

但是,也许散列不会这么大?请记住,单词在文件中重复,因此当您迭代源代码时,您只需要将新单词添加到散列中。使用默认值为 0 的哈希:

irb(main):001:0> words=Hash.new(0)
irb(main):003:0> words['cucumber']
=> 0
irb(main):004:0> words['cucumber'] += 1 # found new word
=> 1
irb(main):005:0> words['cucumber'] += 1 # word was already there
=> 2

但是单词对和三元组会更多,所以你可能还是想用Redis。

在您的情况下,最好在将单词添加到字典之前词干词干提取 是获取单词的词根,因此您可以轻松配对缩写词。例如,将单词:run,runs,running 视为一个词会很好。我强烈推荐 treat gem为此(不仅如此,treat 是一个很棒的自然语言处理库):

irb(main):001:0> require 'treat'
=> true
irb(main):002:0> 'run'.stem
=> "run"
irb(main):003:0> 'runs'.stem
=> "run"
irb(main):004:0> 'running'.stem
=> "run"

要清除“at”、“to”等介词,请使用英语停用词列表。你可以找到它here .

关于Ruby - 一大组句子中出现频率最高的单词或短语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28211704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com