如何使用Ruby计算CSV文件中单词和单词组合的单词频率?

时间:2015-05-26 18:54:43

标签: ruby csv

我想处理一个特定的列,我想生成文字云。例如,将列名称视为“名称”。我在该列下有5条记录。它们是“abc xyz”,“abc qpr xyz”,“qpr xyz”,“xyz”,“abc qpr”。所以我期待的就像一个标记器,我可以获得如下所述的信息:“abc”=> 3,“qpr”=> 3,“xyz”=> 4,“abc xyz”=> 1,“abc qpr xyz”=> 1,“qpr xyz”=> 2,“a​​bc qpr”=>所以我想保持不是特定单词的频率,而是单词组合。

2 个答案:

答案 0 :(得分:2)

假设您的CSV如下所示:

x,y,names,...
1,2,abc xyz,...
2,3,abc qpr xyz,...
3,4,qpr xyz,...
4,5,xyz,...
5,6,abc qpr,...

以下是一种方法:

require 'csv'

CSV.foreach('data.csv', headers: true).with_object(Hash.new(0)) do |row, f|
  names = row['names']        # obtain names from csv row
  f[names] += 1               # increase counter for combined names
  names.split.each do |name|  # split names at whitespace
    f[name] += 1              # increase counter for single name
  end
end
#=> {"abc xyz"=>1, "abc"=>3, "xyz"=>5, "abc qpr xyz"=>1, "qpr"=>3, "qpr xyz"=>1, "abc qpr"=>1}

对于自定义,您可能需要查看CSV库的文档,有大量有关CSV格式,标题转换等的选项。

http://ruby-doc.org/stdlib/libdoc/csv/rdoc/CSV.html

答案 1 :(得分:0)

假设

  • str是您加载整个文件的字符串。
  • num是您想要的列号。

拥有一个计算所有不同名称组合的哈希:

count = Hash.new(0)
str.split('\n').each do |line| 
    cols = line.split(',')
    count[cols[num]] += 1
end
return count

您实例化一个默认返回0的哈希对象(count),然后为找到的每个键添加1。