2015-05-26 78 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找到的每個關鍵。

相關問題