python - scikit-learn 中的 TF/IDF

标签 python python-2.7 scikit-learn tf-idf

是否有关于如何使用 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如果在构建功能时您没有现有的文档术语矩阵。在黑盒级别,您应该考虑 TfidfVectorizerCountVectorizer后跟 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_dfmax_df - 这允许我们根据文档频率动态过滤词汇表。例如,通过给出 max_df0.7 ,我可以让我的应用程序自动删除特定于域的停用词。例如,在医学期刊的语料库中,疾病一词可以被视为停用词。

  • 除此之外,您还可以引用 sample code我为一个项目写的。虽然它没有很好的文档记录,但功能的名称非常好。

    希望这可以帮助!

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

    相关文章:

    python - matplotlib分组数据框散点图中的颜色错误

    Python程序从文本文件中提取文本?

    python - 使用 try- except-finally 和上下文管理器增加覆盖范围

    python - 以 f1 为评分函数的网格搜索,几页错误信息

    python - AppEngineLauncher 不再显示状态图标?

    python - 更新 scikit 模型使其与最新版本兼容

    python - 有人可以说明 sklearn.mean_absolute_error 对于 2 个矩阵的基本方法吗?

    python - PyPDF2 复制后返回空白 PDF

    javascript - 将 Javascript 生成的表上的 <td> 值抓取到 Python

    python - 自定义 sklearn 管道变压器提供 "pickle.PicklingError"