【发布时间】:2017-11-11 17:10:56
【问题描述】:
所以我知道有几种方法可以在文档语料库中找到最相似或说三个最相似的文档。我知道可能存在扩展问题,目前我有大约一万个文档,并且已经在大约 30 个子集上运行测试。这是我现在所拥有的,但如果这被证明是不可能或效率低下,我正在考虑研究 elasticsearch 或 doc2vec。
到目前为止,这些脚本运行得非常好,它们使用 spaCy 对文本进行标记,并使用 Sklearn TfidfVectorizer 来适应所有文档,并且发现了非常相似的文档。我注意到从管道中出来的 NumPy 对象的形状是 (33, 104354),这可能意味着 104354 词汇不包括所有 33 个文档中的停用词。这一步需要 20 分钟才能运行,但下一步是计算所有余弦相似度的矩阵乘法非常快,但我知道它可能会减慢,因为该矩阵得到数千行而不是 30 行。
如果您可以有效地将新文档添加到矩阵中,那么如果您保存了该计算的结果,那么初始计算是否需要十个小时甚至几天都没有关系。
- 当我在 .向量化器上似乎有一个名为
vectorizer.fixed_vocabulary_的方法。我在谷歌或 SKlearn 中找不到这种方法。无论如何,当我运行该方法时,它会返回False。有谁知道这是什么?我认为如果可能的话修复词汇表可能很有用,否则将新文档添加到术语文档矩阵可能会很麻烦,尽管我不确定如何做到这一点。
有人在这里问了similar question,得到了投票,但没有人回答。
他写道:
对于新文件 当我得到一个新的文档 doc(k) 时我该怎么办?好吧,我必须计算这个文档与之前所有文档的相似度,这不需要构建整个矩阵。我可以对所有之前的 j 取 doc(k) dot doc(j) 的内积,得到 S(k, j),这很棒。
- 有没有人明白他在这里的意思,或者有任何好的链接来解释这个相当晦涩的话题?他是对的吗?我不知何故认为,如果他是对的,那么用这个内积添加新文档的能力将取决于修复上面提到的词汇表。
【问题讨论】:
-
fixed_vocabulary_ 对应于构造函数中的
vocabulary参数。它只告诉它是否发送了自定义词汇表,或者它是从提供的数据中学习的。 -
谢谢,我明白了:词汇表:映射或可迭代,可选。一个映射(例如,一个字典),其中键是术语,值是特征矩阵中的索引,或者是可迭代的术语。如果没有给出,则从输入文档中确定一个词汇表。 必须找到一个词汇表然后给它一个。
标签: scikit-learn nlp cosine-similarity spacy term-document-matrix