是否有完整的Python 2.7示例,说明如何使用TfidfTransformer(http://scikit-learn.org/stable/modules/feature_extraction.html)为语料库的n-gram生成TF / IDF?环顾scikit学习页面,它只有代码片段(不完整的示例)。

问候,

最佳答案

对于TF-IDF特征提取,scikit-learn具有2个类TfidfTransformerTfidfVectorizer。这两个类本质上具有相同的目的,但应以不同的方式使用。对于文本特征提取,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'
       ]


只要在字符串上进行迭代,就可以使用任何iterableTfidfVectorizer还支持从文件中读取文本,文档中已详细讨论了这些文本。现在,在最简单的情况下,我们可以初始化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_dfmax_df-这使我们能够根据文档频率来动态过滤词汇表。例如,通过提供max_df0.7,我可以让我的应用程序自动删除特定于域的停用词。例如,在医学期刊中,疾病一词可以被视为停用词。


除此之外,您还可以参考我为项目编写的sample code。尽管没有很好的文档说明,但是函数的命名非常好。

希望这可以帮助!

关于python - scikit学习中的TF/IDF,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37892105/

10-12 16:37