2017-05-25 31 views
4

我从头开始实现多项朴素贝叶斯分类器以用于python中的文本分类。如何在文本分类中使用朴素贝叶斯预测想要的类

我计算每个类的特征计数和特征的概率分布。

据我实现我得到如下结果:

假设我有以下的文集:

corpus = [ 
      {'text': 'what is chat service?', 'category': 'what_is_chat_service'}, 
      {'text': 'Why should I use your chat service?', 'category': 'why_use_chat_service'} 
     ] 

根据朴素贝叶斯这个语料库两个类的先验概率为0.5

如果我做一些预处理,包括转换为小写,停用词删除和标点删除我得到以下的令牌列表:

  • 文本1:聊天,服务]
  • 文本2:使用,聊天,服务]

现在,如果我想预测类文“什么是聊天服务”后 预处理根据朴素贝叶斯规则,我们得到以下概率:

class      chat  service P(class|features) 

what_is_chat_service  1  1   0.5 
why_use_chat_service  1  1   0.5 

我得到了2类的相等概率。我一直在研究改善这种情况。

一种可能的方式是包含停用词。如果我们有停止的话,我们得到以下特点概率:

class     what  is chat  service P(class|features) 

what_is_chat_service 1   1  1  1   0.5(higher) 
why_use_chat_service 1e-9  1e-9 1  1   5e-19 

假设与特征的违约概率= 1E-9

即其功能不属于一类

在这种如果我们对类别1有更高的概率:what_is_chat_service

在包含停用词之后仍有相同概率 如果我们语料库如下:

corpus = [ 
      {'text': 'what is chat service?', 'category': 'what_is_chat_service'}, 
      {'text': 'what is the benefit of using chat service?', 'category': 'why_use_chat_service'} 
     ] 

在这种情况下,对于这两个类,所有特征概率都是1。

而预测文字“什么是聊天服务?”的概率也是平等的。

但我必须得到'what_is_chat_service'类的预测。

我怎样才能得到预期的班级?我已经从sklearn尝试过朴素贝叶斯分类器。没有得到理想的结果。

如果我的问题很详细或不清楚,或者需要更多信息,请告诉我。

在此先感谢。

回答

1

朴素贝叶斯不考虑词序。因此,将文档的主题(通常不只是一个句子,而是一个完整的文档:很多段落,例如新闻文章)进行分类是很好的。

在你的例子中,话题实际上是“聊天服务”(或者也许是“网络服务”或“客户服务”)。

但“为什么聊天服务”与“什么是聊天服务”是不是真的东西,可以通过文本分类很容易地分离,因为为什么什么主要是语法的区别。例如,下面的句子:

  1. 什么是聊天服务(你想要的什么类)
  2. 什么是聊天服务(你想要的为什么类)

只有准确的句子分析才会有帮助(而且这个任务很难)。任何使用几乎所有文本分类器使用的词袋(或向量空间模型)的方法在此任务中都可能失败。

现在我知道我的答案没有多大帮助,但它是什么。如果你想在仍然使用朴素贝叶斯分类器的情况下获得稍微更好的分类,也许你可以尝试为你的特征(单词序列)添加n-gram。这会捕捉(有时并非总是)一些语法信息。

+0

谢谢@Pascal。我需要一个针对从特征计数生成的朴素贝叶斯偏见问题的解决方案。当一个特征在类别1中频率较高时,包含此特征的样本将被分类到该类别中,而不管其是否进行了预先分类。 –

+0

什么意思是“预分类” –

+0

每个训练数据文本都被分配了一个类。在我的例子中,'what_is_chat_service'被分配给第一个文本,'why_use_chat_service'被分配给第二个文本。 –