0

所以我知道有几种方法可以找到文档语料库中最相似或最相似的三个文档。我知道可能会出现扩展问题,现在我有大约一万个文档,并且已经在大约三十个子集上运行测试。这是我现在得到的,但正在考虑研究elasticsearch或doc2vec,如果这证明是不可能的或低效的。为术语文档矩阵添加一个新文档以进行相似度计算

到目前为止,脚本工作得非常好,他们使用spaCy标记文本和Sklearn TfidfVectorizer以适应所有文档,并找到非常相似的文档。我注意到流水线中出现的NumPy对象的形状是(33,104354),这可能意味着104354词汇表不包括所有33个文档中的停用词。这一步需要20分钟的时间才能运行,但下一步是计算所有余弦相似度的矩阵乘法非常快,但我知道它可能会减慢,因为该矩阵会得到数千而不是30行。

如果您可以高效地将新文档添加到矩阵,那么如果您保存了该计算的结果,则初始计算是否花费了十个小时甚至几天也无所谓。

  1. 当我按下标签后。似乎在矢量器上有一种方法叫做vectorizer.fixed_vocabulary_。我无法在Google或SKlearn中找到此方法。无论如何,当我运行该方法时,它将返回False。有人知道这是什么吗?我认为在可能的情况下修正词汇可能会有帮助,否则在术语文档矩阵中添加一个新文档可能会很麻烦,尽管我不知道该怎么做。

有人问了一个similar question这里被投票了,但没有人回答。

他写道:

新文档 当我得到一个新的文档DOC(K),我该怎么办?那么,我必须计算这个文档与以前所有文档的相似性,而不需要构建一个完整的矩阵。我可以将doc(k)dot doc(j)的内积代入前面所有的j,并且得到S(k,j),这很好。

  • 没有人确切地理解他的意思在这里是什么或者有这个地方默默无闻的话题进行了说明任何良好的联系?他对吗?我以某种方式认为,如果他是对的,用这个内在产品添加新文档的能力将取决于如上所述的固定词汇。
  • +0

    [fixed_vocabulary_](https://github.com/scikit-learn/scikit-learn/blob/14031f6/sklearn/feature_extraction/text.py#L270)对应于构造函数中的'vocabulary'参数。它只会告知是否发送了一个自定义词汇表,或者从提供的数据中学习了它。 –

    +0

    谢谢,我看到:_vocabulary:映射或可迭代,可选。无论是键是词和值的映射(例如,词典)都是特征矩阵中的索引,或者是可迭代的术语。如果没有给出,则从输入文件中确定一个词汇表。必须找到一个_vocabulary_然后给它一个。 – cardamom

    回答

    0

    好吧,我解决了这个问题,花了很多时间,围绕这一主题的其他职位混淆我与它描述的线性代数的方法,并没有提到它的一个方面,这或许是显而易见的是谁写的家伙它。

    所以感谢有关词汇的信息..

    所以矢量化是的sklearn.feature_extraction.text.vectorizer一个实例。我用vocabulary_方法来拉动现有33个文本的词汇了:

    v = vectorizer.vocabulary_ 
    print (type(v)) 
    >> dict 
    print (len(v)) 
    >> 104354 
    

    腌本词典供将来使用,只是为了测试它的工作,包含TfidfVectorizer与参数vocabulary=v管道对象上重新运行fit_transform它做了。

    最初的成对相似性矩阵通过 pairwise_similarity = (p * p.T).A找到,其中p是拟合管道对象,也是术语文档矩阵。

    增加了一个小的新文件:

    new_document= """ 
    
    Remove the lamb from the fridge 1 hour before you want to cook it, to let it come up to room temperature. Preheat the oven to 200ºC/400ºC/gas 6 and place a roasting dish for the potatoes on the bottom. Break the garlic bulb up into cloves, then peel 3, leaving the rest whole. 
    """ 
    

    安装在管道只是一个文件,其现在的固定词汇:

    p_new = pipe.fit_transform([new_document]) 
    print (p_new.shape) 
    > (1, 104354) 
    

    然后把它们放在一起这样的:

    from scipy.sparse import vstack as vstack_sparse_matrices 
    p_combined = vstack_sparse_matrices([p, p_new]) 
    print (p_combined.shape) 
    >> (34, 104354) 
    

    and reran成对相似方程:

    pairwise_similarity = (p_combined * p_combined.T).A 
    

    对代码或理论并不完全自信,但我相信这是正确的,并已奏效 - 布丁的证明是在吃东西,后来的代码发现最相似的文件也是烹饪相关的。将原始文档更改为其他几个主题并重新编辑,相似之处与您期望的完全相同。