使用 tfidf 作为特征

Posted

技术标签:

【中文标题】使用 tfidf 作为特征【英文标题】:Using tfidf as feature 【发布时间】:2021-05-12 03:28:36 【问题描述】:

我想使用 n-gram 对两组文档进行分类。一种方法是使用tfidf提取每个文档的重要单词,然后制作一个如下的csv文件:

document, ngram1, ngram2, ngram3, ..., label
1, 0.0, 0.0, 0.0, ..., 0
2, 0.0, 0.0, 0.0, ..., 1
...

但是由于文件数量的原因,文件会很大而且很稀疏。另一种方法是合并每个组中的所有文档并提取 ngram。之后,我可以计算每个文档中每个 ngram 的出现次数,但我不确定这是不是最好的方法。请提供您建议的解决方案。

【问题讨论】:

【参考方案1】:

在提取 ngram 之前连接组中的文档是没有意义的 - 以这种方式生成的任何新 ngram 都不会存在于任何单个文档中。

正如您正确指出的,您使用的任何标记化方法都会产生一个大而稀疏的矩阵。这不一定是个问题 - 无论您打算使用什么库进行分类,都可能带有用于存储稀疏矩阵的有效表示,并且通常用于为您计算 tf-idf 矩阵。

您可能还希望仅使用 ngram 的一个子集作为特征,使用 ngram-frequency 和 ngram-length(给定 ngram 中的“gram”数)的某种组合来选择相关的 ngram。

或者,您可以使用潜在语义分析的原始形式 - 计算 tf-idf 矩阵,然后使用主成分分析(如果 ngram 和文档的数量大到使得计算它们的协方差矩阵空间禁止)。

【讨论】:

【参考方案2】:

我建议你使用 sklearn 的 tfidf 矢量化器 (https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html)。它支持 ngrams 并且在内存使用方面非常高效。您可以轻松地将矢量化器传递给任何 sklearn 分类器来构建分类模型。

【讨论】:

以上是关于使用 tfidf 作为特征的主要内容,如果未能解决你的问题,请参考以下文章

我们如何使用带有多项朴素贝叶斯的 TFIDF 向量?

获取选定的特征名称 TFIDF Vectorizer

SKLearn 朴素贝叶斯:在 tfidf 向量化后添加特征

文本分类任务简介

词频的TFIDF的理论依据及不足

如何将 tfidf 特征与自制特征结合起来