2015-05-26 77 views
0

我想处理一个特定的列,我想生成文字云。例如,将列名称视为“名称”。我在该栏下有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,”abc qpr“=> 2.所以我想保留不是特定单词的频率,而是单词组合。如何使用Ruby来计算单词中单词频率和CSV文件中单词的组合?

+0

你能不能显示标题以及一些示例行?每个单元格或多个单词是否有一个单词? –

+0

是的,这可以做到。你能展示你尝试过的代码吗?你有什么特别的问题吗? –

+0

谢谢Patrick和Justin。我想处理一个特定的列,我想生成文字云。例如,将列名称视为“名称”。我在该栏下有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,”abc qpr“=> 2.所以我想保留不是一个特定单词的频率,而是单词的组合。所以,反正有红宝石提取这个信息? –

回答

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

+0

谢谢帕特里克。我想处理一个特定的列,我想生成文字云。例如,将列名称视为“名称”。我在该栏下有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,”abc qpr“=> 2.所以我想保留不是特定单词的频率,而是单词组合。有什么办法可以在ruby中提取这个? –

+0

看我的编辑,试图符合你的要求。 –

0

假设

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

为了有一个统计名称的所有不同的组合哈希:在默认情况下返回0

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

你实例化一个Hash对象(count),再加入1找到的每个关键。

相关问题