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

Posted

技术标签:

【中文标题】使用 python 的朴素贝叶斯分类器【英文标题】:Naive Bayes classifier using python 【发布时间】:2012-03-29 11:23:03 【问题描述】:

我正在使用 scikit-learn 来查找文档的 Tf-idf 权重,然后使用 Naive 贝叶斯分类器对文本进行分类。但是文档中所有单词的 Tf-idf 权重都是负的,除了少数。但据我所知,负值意味着不重要的术语。那么是否有必要将整个 Tf-idf 值传递给贝叶斯分类器?如果我们只需要通过其中的几个,我们该怎么做呢?此外,与线性 SVC 相比,贝叶斯分类器的优劣程度如何?除了使用 Tf-idf 之外,还有更好的方法在文本中查找标签吗?

谢谢

【问题讨论】:

【参考方案1】:

您有很多问题,但我会尽力提供帮助。

据我记忆,TF-IDF 不应该是负值。 TF 是词频(词在特定文档中出现的频率)和逆文档频率(语料库中的文档数 / 包含该词的文档数)。然后通常是对数加权。我们经常在分母上加一以避免被零除。因此,唯一一次您会得到否定的 tf*idf 是该术语是否出现在语料库的每个文档中(正如您所提到的,这对搜索不是很有帮助,因为它不添加信息)。我会仔细检查你的算法。

给定术语 t,文档 d,语料库 c:

tfidf = term freq * log(document count / (document frequency + 1))
tfidf = [# of t in d] * log([#d in c] / ([#d with t in c] + 1))

在机器学习中,朴素贝叶斯和 SVM 都是很好的工具——它们的质量会因应用程序而异,而且我做过的项目证明它们的准确性相当。朴素贝叶斯通常很容易手动破解——在尝试使用 SVM 库之前,我会先尝试一下。

我可能遗漏了一些东西,但我不太确定我确切地知道你在寻找什么——很高兴修改我的答案。

【讨论】:

首先感谢您的快速响应。那么如果取 Tf-idf 值大于零的单词,是否可以用作标签? . 您对训练贝叶斯分类器有何看法。是否有必要使用整个文档 Tf-idf 或仅使用具有较高 Tf-idf 值的单词的 Tf-idf 值来完成。 嗯,首先,文档中的大多数单词不应该是否定的。你的语料库有多大?显然,在运行之前删除“the”、“an”等停用词。不知道你所说的标签是什么意思,但如果你的意思是特征标签或类似标签,那么我认为这是一个好方法。 考虑我们找到了 1000 个文档的 tf-idf 值。有什么方法可以让我们使用这些权重来查找要分类的新文档的 tf-idf 值?。 tf*idf 基于术语文档元组,因此除非您的语料库发生更改,否则您当然可以将它们存储在 (term,docid)=>value 的字典中。【参考方案2】:

我也对这个主题很感兴趣。 当我使用 baes 分类时(可能是这篇关于 baes 算法的俄罗斯文章可以帮助你http://habrahabr.ru/blogs/python/120194/)我只使用了文档的 20 个 top word。我尝试了很多价值观。在我的实验前 20 名中获得最佳结果。 我也将通常的 tf-idf 更改为:

def f(word):
    idf = log10(0.5 / word.df)
    if idf < 0:
        idf = 0
    return word.tf * idf

在这种情况下,“坏词”等于 0。

【讨论】:

这可能只是粉饰问题。 @ogrisel 指出有一个错误,这是有道理的。大多数单词不应该有负值。 不是粉饰。因为我的 wieght 词不是经典的 tf-idf。而且 it(idf) 可以是负数。 哦,好吧,如果它的类型不同的话。【参考方案3】:

此错误已在 master 分支中修复。请注意,text vectorizer API 也发生了一些变化,以便更轻松地自定义标记化。

【讨论】:

有没有办法将贝叶斯分类器的值和它的词汇表保存在scikit中,这样文档分类就容易了?. 保存贝叶斯分类器是指训练后的单词概率权重。 @jvc: 你可以pickle scikit-learn 中的整个分类器对象。

以上是关于使用 python 的朴素贝叶斯分类器的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 Python 示例对多项朴素贝叶斯分类器进行分类

机器学习之用 Python 从零实现贝叶斯分类器

动态朴素贝叶斯分类器和朴素贝叶斯分类器有啥区别

机器学习系列-朴素贝叶斯分类器

将朴素贝叶斯分类器保存在内存中