使用ruby分析数据的最佳方法

时间:2009-09-13 17:58:37

标签: ruby-on-rails ruby

我想分析数据库中的数据,以了解某些单词出现的次数。 理想情况下,我想要一个特定列中使用的前20个单词的列表。 最简单的方法是什么。

3 个答案:

答案 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)