【发布时间】:2017-11-18 14:54:29
【问题描述】:
我正在使用 Ruby 来实现朴素贝叶斯。 我需要将文本分类(我有 4 个不同的类别)。
我尝试以多种方式对其进行优化,但似乎都没有奏效。 我删除了“停用词”,在词中做了词干、参数化等。
我使用 170 个文本数据进行了训练。但是当我尝试预测一个新文本时,结果往往是错误的。 最后所有 4 个类别的概率都非常相似。
我还能做些什么来提高准确性?
代码如下:
require 'nbayes'
require 'csv'
require 'active_support/all'
require 'lingua/stemmer'
def remove_stopwords(list)
stopwords_array = []
CSV.foreach("stopwords.csv") do |row|
stopwords_array << row[0]
end
list - stopwords_array
end
def stemmer_array(list)
stemmer = Lingua::Stemmer.new(:language => "pt")
list.map {|x| stemmer.stem(x)}
end
def prepare_string(text)
list = text.parameterize.split('-')
list = remove_stopwords(list)
stemmer_array(list)
end
nbayes = NBayes::Base.new
CSV.foreach("contacts.csv") do |row|
if row[7] != "{:value=>nil, :label=>nil}"
nbayes.train(prepare_string("#{row[4]} #{row[5]}"), row[7])
end
end
new_text = "TEXT TO PREDICT"
result = nbayes.classify(prepare_string(new_text))
puts "Text: #{new_text}\n\n"
puts "´´´´´´´´´´´´´´´´´´´´´´´"
puts "Prediction: #{result.max_class}\n\n"
puts "´´´´´´´´´´´´´´´´´´´´´´´"
【问题讨论】:
-
170 项数据还不够...
-
就像 Coldspeed 说的那样,170 可能还不够……而且您还没有告诉我们类别是什么……取决于将它们分开的难易程度,任务可能非常困难即使是大型数据集。此外,最后的“相似概率”是没有意义的。通常,朴素贝叶斯将返回所有类别的非常低的分数。 (顺便说一句,它们不是班级概率 - 它们是观察给定班级的文本的概率,这就是分数如此低的原因)。重要的是具有最高值的类别,即:最有可能生成文本的类别。
标签: ruby machine-learning artificial-intelligence naivebayes