0

我正在尝试找到分类算法的逆文档频率,并且无法按照我的代码的结构方式(使用嵌套散列)来获取它,并且通常将一个散列与多个散列进行比较。

到目前为止,我的训练代码如下所示:

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 哈希是空的,我也许可以得到其余的。

4

1 回答 1

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
于 2014-07-17T18:21:24.557 回答