2017-02-13 31 views
3

我有一个包含数千行文本的数据集,我的目标是计算tfidf得分,然后计算文档之间的余弦相似度,这就是我使用gensim在Python跟着教程:Python tf-idf:快速更新tf-idf矩阵的方法

dictionary = corpora.Dictionary(dat) 
corpus = [dictionary.doc2bow(text) for text in dat] 

tfidf = models.TfidfModel(corpus) 
corpus_tfidf = tfidf[corpus] 
index = similarities.MatrixSimilarity(corpus_tfidf) 

比方说,我们有TFIDF矩阵和相似建,当我们有一个新的文档进来,我想查询在我们现有的数据集最类似的文件。

问题:有什么方法可以更新tf-idf矩阵,以便我不必将新文本文件追加到原始数据集并重新计算整个事物?

回答

2

我会发布我的解决方案,因为没有其他答案。比方说,我们在以下情形:

import gensim 
from gensim import models 
from gensim import corpora 
from gensim import similarities 
from nltk.tokenize import word_tokenize 
import pandas as pd 

# routines: 
text = "I work on natural language processing and I want to figure out how does gensim work" 
text2 = "I love computer science and I code in Python" 
dat = pd.Series([text,text2]) 
dat = dat.apply(lambda x: str(x).lower()) 
dat = dat.apply(lambda x: word_tokenize(x)) 


dictionary = corpora.Dictionary(dat) 
corpus = [dictionary.doc2bow(doc) for doc in dat] 
tfidf = models.TfidfModel(corpus) 
corpus_tfidf = tfidf[corpus] 


#Query: 
query_text = "I love icecream and gensim" 
query_text = query_text.lower() 
query_text = word_tokenize(query_text) 
vec_bow = dictionary.doc2bow(query_text) 
vec_tfidf = tfidf[vec_bow] 

如果我们看一下:

print(vec_bow) 
[(0, 1), (7, 1), (12, 1), (15, 1)] 

和:

print(tfidf[vec_bow]) 
[(12, 0.7071067811865475), (15, 0.7071067811865475)] 

FYI ID和DOC:

print(dictionary.items()) 

[(0, u'and'), 
(1, u'on'), 
(8, u'processing'), 
(3, u'natural'), 
(4, u'figure'), 
(5, u'language'), 
(9, u'how'), 
(7, u'i'), 
(14, u'code'), 
(19, u'in'), 
(2, u'work'), 
(16, u'python'), 
(6, u'to'), 
(10, u'does'), 
(11, u'want'), 
(17, u'science'), 
(15, u'love'), 
(18, u'computer'), 
(12, u'gensim'), 
(13, u'out')] 

外貌就像查询只是拿起现有的条款和使用预先计算的权重为您提供tfidf分数。所以我的解决方法是每周或每天重建模型,因为这样做很快。

+1

这实际上工作吗?我原以为由于tfidf的本质,从根本上说,你不能逐步更新模型(更新tfidf矩阵),因为每次有新文档进入时,都必须更新包含在文档中的所有相关单词特征的IDF值整个语料库的新文档。另外,当一个文档带有一个新词时会发生什么 - 不会有一个特征长度不匹配?请让我知道,因为我也在积极研究这个问题 – killerT2333

+0

它的工作,但我相信什么是只使用您现有的模型查询您的新文档。我将编辑我的答案以显示作品。 – snowneji

+0

哇!这真的很酷 - 非常感谢分享这个。因此,如果我理解正确,当新的查询文档进入时,gensim会根据预先计算的tfidf矩阵计算tfidf分数_and_新的查询文档?或者它只是从预先计算的tfidf矩阵中计算出来的呢?定期更新模型更有意义,如果不断有新的查询进来,尤其是如果更新模型昂贵 – killerT2333