是否有关于如何使用 TfidfTransformer ( http://scikit-learn.org/stable/modules/feature_extraction.html ) 为语料库的 n-gram 生成 TF/IDF 的完整 Python 2.7 示例?环顾 scikit-learn 页面,它只有代码片段(不是完整的示例)。
问候,
林
最佳答案
对于 TF-IDF 特征提取,scikit-learn 有 2 个类 TfidfTransformer
和 TfidfVectorizer
.这两个类本质上服务于相同的目的,但应该以不同的方式使用。对于文本特征提取,scikit-learn 具有 Transformers 和 Vectorizers 的概念。 Vectorizers 直接处理原始文本以生成特征,而 Transformer 处理现有特征并将它们转换为新特征。所以按照这个类比,TfidfTransformer
在现有的 Term-Frequency 上工作特征并将它们转换为 TF-IDF 特征,而 TfidfVectorizer
将原始文本和 作为输入直接生成 TF-IDF 特征。你应该 总是 使用 TfidfVectorizer
如果在构建功能时您没有现有的文档术语矩阵。在黑盒级别,您应该考虑 TfidfVectorizer
如CountVectorizer
后跟 TfidfTransformer
.
现在来看 Tfidfectorizer
的工作示例.请注意,如果这个例子很清楚,那么您将毫无困难地理解为 TfidfTransformer
给出的例子。 .
现在考虑您的语料库中有以下 4 个文档:
text = [
'jack and jill went up the hill',
'to fetch a pail of water',
'jack fell down and broke his crown',
'and jill came tumbling after'
]
您可以使用任何
iterable
只要它遍历字符串。 TfidfVectorizer
还支持从文件中读取文本,他们在文档中已经详细讨论过。现在在最简单的情况下,我们可以初始化一个 TfidfVectorizer
对象并将我们的训练数据拟合到它。这是按如下方式完成的:tfidf = TfidfVectorizer()
train_features = tfidf.fit_transform(text)
train_features.shape
这段代码只是
fits
对我们的输入数据进行矢量化处理,并生成一个维度为 4 x 20
的稀疏矩阵.因此,它将给定文本中的每个文档转换为 20
的向量。特征,其中词汇的大小是20
.在
TfidfVectorizer
的情况下, 当我们说 fit the model
,这意味着 TfidfVectorizer
从语料库中学习 IDF 权重。 “转换数据”是指使用拟合模型(学习 IDF 权重)将文档转换为 TF-IDF 向量。这个术语是整个 scikit-learn 的标准。它在分类问题的情况下非常有用。考虑是否要根据一些使用 TF-IDF 向量作为特征的标记训练数据将文档分类为正面或负面。在这种情况下,您将使用您的训练数据构建您的 TF-IDF 矢量化器,当您看到新的测试文档时,您只需使用已经的 转换它们。安装 TfidfVectorizer
.因此,如果我们有以下
test_txt
:test_text = [
'jack fetch water',
'jill fell down the hill'
]
我们将通过简单地构建测试功能
test_data = tfidf.transform(test_text)
这将再次给我们一个稀疏矩阵
2 x 20
. 在这种情况下使用的 IDF 权重是从训练数据中学到的。 这就是一个简单的
TfidfVectorizer
作品。您可以通过在构造函数中传递更多参数来使其更加复杂。这些在 Scikit-Learn docs 中有很好的记录。 .我经常使用的一些参数是:ngram_range
- 这允许我们使用 n 克标记构建 TF-IDF 向量。例如,如果我通过 (1,2)
,那么这将构建一元和二元。 stop_words
- 允许我们给 stopwords过程中单独忽略。过滤掉几乎所有文档中都存在的单词,例如“the”、“of”等是一种常见的做法。 min_df
和 max_df
- 这允许我们根据文档频率动态过滤词汇表。例如,通过给出 max_df
的 0.7
,我可以让我的应用程序自动删除特定于域的停用词。例如,在医学期刊的语料库中,疾病一词可以被视为停用词。 除此之外,您还可以引用 sample code我为一个项目写的。虽然它没有很好的文档记录,但功能的名称非常好。
希望这可以帮助!
关于python - scikit-learn 中的 TF/IDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37892105/