【发布时间】:2020-03-23 22:24:52
【问题描述】:
我正在考虑创建一个搜索引擎,以便我可以使用关键字从预处理的 pdf 文件中获取句子(代表文档)。
我想知道 scikit-learn 中是否有一个内置函数来显示类似于一袋单词输出的数据,这意味着我会将所有单词作为列(在 pandas 中),所有文档作为行,并将 tf-idf 值作为值
【问题讨论】:
标签: python scikit-learn search-engine tf-idf tfidfvectorizer
我正在考虑创建一个搜索引擎,以便我可以使用关键字从预处理的 pdf 文件中获取句子(代表文档)。
我想知道 scikit-learn 中是否有一个内置函数来显示类似于一袋单词输出的数据,这意味着我会将所有单词作为列(在 pandas 中),所有文档作为行,并将 tf-idf 值作为值
【问题讨论】:
标签: python scikit-learn search-engine tf-idf tfidfvectorizer
您当然可以在玩具问题中这样做并且仅用于教育目的,但对于真正的问题,这是完全不切实际并且非常不建议。
原因是这样的术语文档矩阵是稀疏(即它们的大多数条目实际上是 0),并且这种稀疏性用于将它们有效地存储在适当的数据结构中。将它们转换为非稀疏结构(即 pandas 数据帧)很可能会压倒您机器的内存;引用相关的 scikit-learn docs:
因为大多数文档通常会使用非常小的单词子集 在语料库中使用,得到的矩阵会有很多特征值 是零(通常超过 99%)。
例如 10,000 个短文本文档的集合(例如 emails) 将使用大小为 100,000 的词汇表 总唯一词,而每个文档将使用 100 到 1000 个唯一词 单独的单词。
为了能够在内存中存储这样的矩阵,也为了速度 向上代数运算矩阵/向量,实现将 通常使用稀疏表示,例如实现 在
scipy.sparse包中可用。
也就是说,您可以出于教育目的这样做;这是如何调整TfidfVectorizer docs 中的示例:
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
corpus = [
... 'This is the first document.',
... 'This document is the second document.',
... 'And this is the third one.',
... 'Is this the first document?',
... ]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)
df = pd.DataFrame.sparse.from_spmatrix(X, columns = vectorizer.get_feature_names())
df
# result:
and document first is one second the third this
0 0.000000 0.469791 0.580286 0.384085 0.000000 0.000000 0.384085 0.000000 0.384085
1 0.000000 0.687624 0.000000 0.281089 0.000000 0.538648 0.281089 0.000000 0.281089
2 0.511849 0.000000 0.000000 0.267104 0.511849 0.000000 0.267104 0.511849 0.267104
3 0.000000 0.469791 0.580286 0.384085 0.000000 0.000000 0.384085 0.000000 0.384085
【讨论】:
您在 scikit 中学习 TfIdfVectorizer 和 TfIdfTransformer。
结果就是你需要的,它们之间有以下区别:
TfIdfVectorizer 将原始文档作为输入。
TfIdfTransformer 在输入中采用一个矩阵,其中包含每个文档的工作计数。
【讨论】: