【问题标题】:Using ScikitLearn TfidfVectorizer in a search engine在搜索引擎中使用 ScikitLearn TfidfVectorizer
【发布时间】:2020-03-23 22:24:52
【问题描述】:

我正在考虑创建一个搜索引擎,以便我可以使用关键字从预处理的 pdf 文件中获取句子(代表文档)。

我想知道 scikit-learn 中是否有一个内置函数来显示类似于一袋单词输出的数据,这意味着我会将所有单词作为列(在 pandas 中),所有文档作为行,并将 tf-idf 值作为值

【问题讨论】:

    标签: python scikit-learn search-engine tf-idf tfidfvectorizer


    【解决方案1】:

    您当然可以在玩具问题中这样做并且仅用于教育目的,但对于真正的问题,这是完全不切实际并且非常不建议

    原因是这样的术语文档矩阵是稀疏(即它们的大多数条目实际上是 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
    

    【讨论】:

    • 确实,我没有考虑到内存问题。我将尝试其他一些方法来提取我想要的信息而不使用整个矩阵。但是,非常感谢这个例子!我不知道这个功能。
    【解决方案2】:

    您在 scikit 中学习 TfIdfVectorizerTfIdfTransformer

    结果就是你需要的,它们之间有以下区别:

    TfIdfVectorizer 将原始文档作为输入。

    TfIdfTransformer 在输入中采用一个矩阵,其中包含每个文档的工作计数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多