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