我想处理一个特定的列,我想生成文字云。例如,将列名称视为“名称”。我在该列下有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”=>所以我想保持不是特定单词的频率,而是单词组合。
答案 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格式,标题转换等的选项。
答案 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。