我需要提高朴素贝叶斯文本分类的准确性

时间:2017-06-16 00:18:12

标签: ruby machine-learning artificial-intelligence naivebayes

我正在使用Ruby来实现朴素贝叶斯。 我需要将文本分类为一个类别(我有4个不同的类别)。

我试图以几种方式对其进行优化,但似乎都没有效果。 我删除了“停用词”,用词干,参数化等方式做了Stemmer。

我用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 "´´´´´´´´´´´´´´´´´´´´´´´"

1 个答案:

答案 0 :(得分:0)

数据集很少训练文本分类模型。另外,请务必检查目标变量的分布。正如您提到的,有4类,请确保没有类不平衡。例如,如果单个类有100个数据点,而3个不同类的剩余数据点在这种情况下,您的模型将给出此类输出(其中所有预测类都属于1类)。还绘制一个混淆矩阵,以查看模型的实际效果。