朴素贝叶斯分类器是不是需要了解整个词汇表?

Posted

技术标签:

【中文标题】朴素贝叶斯分类器是不是需要了解整个词汇表?【英文标题】:Does Naive Bayes Classifier need to know the entire vocabulary?朴素贝叶斯分类器是否需要了解整个词汇表? 【发布时间】:2014-06-11 09:30:11 【问题描述】:

我正在尝试将推文分为两类(例如,basketballnon-basketball)。显然,数据集是动态的,即文档集合不固定为一组N 文档(即推文):数据集在爬取 Twitter 时一遍又一遍地膨胀。

应该尝试应用的一件事是朴素贝叶斯分类器,它广泛用于文本分类。提供了解释here。但是,仍然存在一个疑问。

我可以从训练集开始计算模型(并说明词汇表V 由训练集中包含的术语组成)。现在,人们可以收集一条新的、未分类的推文,其中包含V 中不存在的术语(即未出现在训练集中的术语)。朴素贝叶斯分类器是否仍然适用?

概括问题:朴素贝叶斯分类器能否应用于词汇不完全已知的情况?

提前谢谢你。

【问题讨论】:

【参考方案1】:

对于测试集中不在训练集中的单词,最简单的做法就是忽略它们。

您可以做一些更有趣的事情,例如衡量哪个班级往往有看不见/稀有的单词。或者您可以尝试使用单词整形将看不见的单词变成更一般/观察到的单词类别(例如,将所有数字视为相同)。

【讨论】:

不幸的是我不知道这些“花哨”的技术。您是否有一些参考资料以便了解更多信息?非常感谢! 此外:忽略新词(正如您最初建议的那样)是否会影响结果质量?【参考方案2】:

朴素贝叶斯分类器能否应用于词汇不完全已知的情况?

如果测试集中的单词不在训练集中,则在训练期间这些单词的类条件概率将为 0。由于朴素贝叶斯分类器涉及测试文档中所有单词的乘积,因此测试文档中不在训练集中的单个单词将导致文档属于所考虑类别的概率为零。

应用的技巧(我认为您正在要求)称为(拉普拉斯)平滑:将测试集中所有项的计数加 1。这是许多库中的默认设置,例如在 Python 的 Scikit-Learn 中:

http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.MultinomialNB.html#sklearn.naive_bayes.MultinomialNB

【讨论】:

以上是关于朴素贝叶斯分类器是不是需要了解整个词汇表?的主要内容,如果未能解决你的问题,请参考以下文章

朴素贝叶斯分类器原理

朴素贝叶斯是不是应该将词汇表中的所有单词复数

朴素贝叶斯分类器

如何将 tf-idf 应用于整个数据集(训练和测试数据集),而不是仅在朴素贝叶斯分类器类中训练数据集?

使用 python 的朴素贝叶斯分类器

NLTK 的朴素贝叶斯分类器是不是适合商业应用?