我正在尝试找到分类算法的逆文档频率,并且无法按照我的代码的结构方式(使用嵌套散列)来获取它,并且通常将一个散列与多个散列进行比较。
到目前为止,我的训练代码如下所示:
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 哈希是空的,我也许可以得到其余的。