是否有完整的Python 2.7示例,说明如何使用TfidfTransformer(http://scikit-learn.org/stable/modules/feature_extraction.html)为语料库的n-gram生成TF / IDF?环顾scikit学习页面,它只有代码片段(不完整的示例)。
问候,
林
最佳答案
对于TF-IDF特征提取,scikit-learn具有2个类TfidfTransformer
和TfidfVectorizer
。这两个类本质上具有相同的目的,但应以不同的方式使用。对于文本特征提取,scikit-learn具有“变形金刚”和“矢量化器”的概念。 Vectorizer直接在原始文本上工作以生成特征,而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
Vectorizer,并生成尺寸为4 x 20
的稀疏矩阵。因此,它将给定文本中的每个文档转换为20
特征的向量,其中词汇量为20
。对于
TfidfVectorizer
,当我们说fit the model
时,这意味着TfidfVectorizer
从语料库中学习IDF权重。 “转换数据”是指使用拟合的模型(学习IDF权重)将文档转换为TF-IDF向量。该术语是整个scikit学习的标准。在分类问题的情况下,它非常有用。考虑是否要基于某些标记的训练数据(使用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)
,那么这将同时建立unigram和bigrams。stop_words
-允许我们单独给stopwords以便在此过程中忽略。过滤掉几乎所有文档中的“ the”,“ of”等单词是一种常见的做法。min_df
和max_df
-这使我们能够根据文档频率来动态过滤词汇表。例如,通过提供max_df
为0.7
,我可以让我的应用程序自动删除特定于域的停用词。例如,在医学期刊中,疾病一词可以被视为停用词。除此之外,您还可以参考我为项目编写的sample code。尽管没有很好的文档说明,但是函数的命名非常好。
希望这可以帮助!
关于python - scikit学习中的TF/IDF,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37892105/