TD/IDF 在 scikit-learn 中

TD/IDF in scikit-learn

是否有关于如何使用 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 and TfidfVectorizer. Both these classes essentially serves the same purpose but are supposed to be used differently. For textual feature extraction, scikit-learn has the notion of Transformers and Vectorizers. The Vectorizers directly work on the raw text to generate the features, whereas the Transformer works on existing features and transforms them into the new features. So going by that analogy, TfidfTransformer works on the existing 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权重。 'Transforming the data'表示使用拟合模型(学习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),那么这将构建 unigrams 和 bigrams。
  • stop_words - 允许我们单独给出 stopwords 以在过程中忽略。通常的做法是过滤掉几乎所有文档中都存在的 'the'、'of' 等词。
  • min_dfmax_df - 这允许我们根据文档频率动态过滤词汇表。例如,通过提供 0.7max_df,我可以让我的应用程序自动删除特定于域的停用词。例如,在医学期刊语料库中,单词 disease 可以被认为是停用词。

除此之外,你还可以参考我为一个项目写的一篇sample code。虽然没有很好的文档记录,但函数的命名非常好。

希望对您有所帮助!