朴素贝叶斯分类器使用python

时间:2012-03-13 02:28:45

标签: python machine-learning bayesian scikits scikit-learn

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

谢谢

3 个答案:

答案 0 :(得分:6)

你有很多问题,但我会尽力帮助。

据我记忆,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库之前首先尝试一下。

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

答案 1 :(得分:6)

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

答案 2 :(得分:2)

我对这个主题也感兴趣。 当我使用baes分类时(可能这篇关于baes算法的俄文文章可以帮助你http://habrahabr.ru/blogs/python/120194/)我只使用了20个顶级单词。我尝试了很多价值观。在我的实验前20名获得最佳成绩。 我也改变了通常的tf-idf:

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

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