我正在使用 scikit-learn 查找文档的 Tf-idf 权重,然后使用朴素
贝叶斯分类器对文本进行分类。但是文档中所有单词的 Tf-idf 权重都是负的,除了少数。但据我所知,负值意味着不重要的术语。那么是否有必要将整个 Tf-idf 值传递给贝叶斯分类器?如果我们只需要通过其中的几个,我们该怎么做呢?此外,与线性 SVC 相比,贝叶斯分类器的优劣程度如何?除了使用 Tf-idf 之外,还有更好的方法在文本中查找标签吗?
谢谢
我正在使用 scikit-learn 查找文档的 Tf-idf 权重,然后使用朴素
贝叶斯分类器对文本进行分类。但是文档中所有单词的 Tf-idf 权重都是负的,除了少数。但据我所知,负值意味着不重要的术语。那么是否有必要将整个 Tf-idf 值传递给贝叶斯分类器?如果我们只需要通过其中的几个,我们该怎么做呢?此外,与线性 SVC 相比,贝叶斯分类器的优劣程度如何?除了使用 Tf-idf 之外,还有更好的方法在文本中查找标签吗?
谢谢
你有很多问题,但我会尽力提供帮助。
据我记得,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 库之前,我会先试一试。
我可能遗漏了一些东西,但我不太确定我确切地知道你在寻找什么——很高兴修改我的答案。
此错误已在 master 分支中修复。请注意,文本矢量化 API也发生了一些变化,以便更轻松地自定义标记化。
我对这个主题也很感兴趣。当我使用 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。