2014-07-17 38 views
0

我試圖找到一個分類算法的逆文檔頻率,並且無法按照我的代碼的結構(使用嵌套哈希) ,並且通常將一個哈希與多個哈希進行比較。將一個哈希值與多個哈希值進行比較以獲得ruby中的逆文檔頻率

我的訓練代碼如下至今:

def train! 
    @data = {} 
    @all_books.each do |category, books| 
     @data[category] = { 
     words: 0, 
     books: 0, 
     freq: Hash.new(0) 
     } 
     books.each do |filename, tokens| 
     @data[category][:words] += tokens.count 
     @data[category][:books] += 1 

     tokens.each do |token| 
      @data[category][:freq][token] += 1 
     end 

     end 
     @data[category][:freq].map { |k, v| v = (v/@data[category][:freq].values.max) } 
    end 

    end 

基本上,我有4個類別(如有變更)的哈希,併爲每個有字數,書籍數量和頻率散列其中顯示該類別的詞頻。如何從一個類別中獲取單個詞語的頻率與所有類別中顯示的詞語的頻率進行比較?我知道如何對一組哈希鍵與另一組哈希鍵進行比較,但我不確定如何通過嵌套哈希循環來獲得對所有其他術語的頻率,如果這是合理的。

編輯以包括預測結果 - 我想返回一個散列,表示單詞作爲關鍵字的嵌套散列(每個類別一個散列),以及它作爲值出現的其他類別的數量。即{:category1 = {:word => 3,:other => 2,:third => 1},:category2 => {:another => 1,...}}或者將一個類別名稱數組作爲值,而不是類別的數量,也將起作用。

我試圖創建一個新的哈希如下,但它的轉向了空:

def train! 
    @data = {} 
    @all_words = Hash.new([]) #new hash for all words, default value is empty array 

    @all_books.each do |category, books| 
     @data[category] = { 
     words: 0, 
     books: 0, 
     freq: Hash.new(0) 
     } 
     books.each do |filename, tokens| 
     @data[category][:words] += tokens.count 
     @data[category][:books] += 1 

     tokens.each do |token| 
      @data[category][:freq][token] += 1 
      @all_words[token] << category #should insert category name if the word appears, right? 
     end 

     end 
     @data[category][:freq].map { |k, v| v = (v/@data[category][:freq].values.max) } 
    end 

    end 

如果有人可以幫助我弄清楚爲什麼@all_words哈希爲空運行代碼時,我可能能夠得到休息。

+0

'@data [類別] [:頻率] [ 'word_i_am_interested_in']'? – Max

+0

預期輸出的例子會使問題更容易理解。 –

+0

謝謝你,根據你的建議編輯上面。 – Car

回答

0

我還沒有經歷過這一切了,但你肯定有一個錯誤:

@all_words[token] << category #should insert category name if the word appears, right? 

都能跟得上。 @all_words[token]將返回空數組,但不會創建一個空數組的新插槽,就像您所假設的那樣。所以該聲明根本不修改@all_words哈希。

嘗試這些2種變化,看看是否有幫助:

@all_words = {}       # ditch the default value 
... 
(@all_words[token] ||= []) << category # lazy-init the array, and append 
+0

這工作!謝謝。爲了確保我理解 - 我無法將任何東西推入數組,因爲它尚未初始化?即添加鍵將返回一個空數組,但是該數組不能及時存在以便將值推入? – Car

+0

當你有一個默認值[]時,它只是返回它沒有的鍵。因此,你所做的只是將'category'添加到由散列返回的空數組中,然後該數組超出了範圍。 –

相關問題