2012-03-13 119 views
3

我使用scikit-learn来查找文档的Tf-idf权重,然后使用朴素贝叶斯分类器对文本进行分类。但文件中所有单词的Tf-idf权重除少数外均为负数。但据我所知,负值意味着不重要的条款。那么是否有必要将整个Tf-idf值传递给贝叶斯分类器?如果我们只需要通过其中几个,我们该怎么做?与linearSVC相比,贝叶斯分类器有多好还是坏?有没有更好的方式来找到除了使用Tf-idf以外的文本中的标签?使用Python的朴素贝叶斯分类器

谢谢

回答

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库之前,我会首先给出一个。

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

+0

首先感谢您的快速响应。因此,如果Tf-idf值大于零的单词被采用,那么可以将它用作标签吗? 。 – jvc 2012-03-13 02:58:02

+0

另外你对训练贝叶斯分类器有什么看法。是否需要使用整个文档Tf-idf来完成它,还是只能使用Tf-idf值较高的单词的Tf-idf值来完成。 – jvc 2012-03-13 02:59:30

+0

那么,首先,文档中的大部分单词不应该是负面的。你的语料库有多大?在运行之前显然要删除“the”,“an”等停用词。不知道你的标签是什么意思,但如果你的意思是像特征或类似的标签,那么我认为这是一个好方法。 – Chet 2012-03-13 03:10:03

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 

在这种情况下“坏词语” wieght等于0

+0

这可能只是粉饰这个问题。 @ogrisel指出有一个错误,这是有道理的。大多数单词不应该有负值。 – Chet 2012-03-13 12:03:27

+0

它不是粉饰。因为我的单词不是经典的tf-idf。它(idf)可能是负面的。 – lavrton 2012-03-13 12:55:40

+0

噢好吧,如果它是一个不同的类型那么。 – Chet 2012-03-13 13:08:30

6

此错误已被固定在主分支。当心text vectorizer API已经改变了一点,以便更容易定制标记。

+0

在scikit中有没有一种可能的方法来保存贝叶斯分类器及其词汇的值,以便文档的分类很容易? – jvc 2012-03-13 18:02:58

+0

保存贝叶斯分类器我的意思是训练后的单词概率权重。 – jvc 2012-03-13 18:12:49

+0

@jvc:你可以在scikit-learn中[pickle](http://docs.python.org/library/pickle.html)整个分类器对象。 – 2012-03-13 20:44:58