我想分析数据库中的数据,以了解某些单词出现的次数。 理想情况下,我想要一个特定列中使用的前20个单词的列表。 最简单的方法是什么。
答案 0 :(得分:1)
创建一个自动生成的哈希,然后遍历填充哈希的行,并在每次获得相同的密钥(单词)时递增值。然后按值对哈希进行排序。
答案 1 :(得分:1)
我不确定你是否要问如何让这个或者如何计算单词,但我还是继续做了一个以列为导向的ruby wordcounter。
(顺便说一下,起初我确实尝试过autovivified hash,这真是一个很酷的技巧。)
# col: a column name or number
# strings: a String, Array of Strings, Array of Array of Strings, etc.
def count(col, *strings)
(@h ||= {})[col = col.to_s] ||= {}
[*strings].flatten.each { |s|
s.split.each { |s|
@h[col][s] ||= 0
@h[col][s] += 1
}
}
end
def formatOneCol a
limit = 2
a.sort { |e1,e2| e2[1]<=>e1[1] }.each { |results|
printf("%9d %s\n", results[1], results[0])
return unless (limit -= 1) > 0
}
end
def formatAllCols
@h.sort.each { |a|
printf("\n%9s\n", "Col " + a[0])
formatOneCol a[1]
}
end
count(1,"how now")
count(1,["how", "now", "brown"])
count(1,[["how", "now"], ["brown", "cow"]])
count(2,["you see", "see you",["how", "now"], ["brown", "cow"]])
count(2,["see", ["see", ["see"]]])
count("A_Name Instead","how now alpha alpha alpha")
formatAllCols
$ ruby count.rb
Col 1
3 how
3 now
Col 2
5 see
2 you
Col A_Name Instead
3 alpha
1 how
$
答案 2 :(得分:0)
digitalross的回答看起来对我来说太冗长了,因为你标记ruby-on-rails并说你使用DB ..我假设你需要一个activerecord模型所以我给你一个完整的解决方案
在您的模型中:
def self.top_strs(column_symbol, top_num)
h = Hash.new(0)
find(:all, :select => column_symbol).each do |obj|
obj.send(column_symbol).split.each do |word|
h[word] += 1
end
end
h.map.sort_by(&:second).reverse[0..top_num]
end
例如,模型Comment,列体:
Comment.top_strs(:body, 20)