Python tf-idf:更新tf-idf矩阵的快速方法

sno*_*eji 5 python nlp tf-idf cosine-similarity gensim

我有一个数千行文本的数据集,我的目标是计算tfidf得分,然后计算文档之间的余弦相似度,这就是我在Python中使用gensim所遵循的教程:

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)
Run Code Online (Sandbox Code Playgroud)

假设我们已经建立了tfidf矩阵和相似度,当我们有一个新文档进入时,我想在现有数据集中查询其最相似的文档.

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

sno*_*eji 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]
Run Code Online (Sandbox Code Playgroud)

如果我们看看:

print(vec_bow)
[(0, 1), (7, 1), (12, 1), (15, 1)]
Run Code Online (Sandbox Code Playgroud)

和:

print(tfidf[vec_bow])
[(12, 0.7071067811865475), (15, 0.7071067811865475)]
Run Code Online (Sandbox Code Playgroud)

仅供参考 ID 和文档:

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')]
Run Code Online (Sandbox Code Playgroud)

看起来查询仅选取现有术语并使用预先计算的权重来为您提供 tfidf 分数。因此,我的解决方法是每周或每天重建模型,因为这样做速度很快。

  • 这真的有效吗?我本以为,由于 tfidf 的性质,从根本上来说你不能增量更新模型(更新 tfidf 矩阵),因为每次新文档进入时,你都必须更新包含在文档中的所有相关单词特征的 IDF 值。整个语料库的新文档。另外,当文档中包含新单词时会发生什么 - 不会出现特征长度不匹配的情况吗?请告诉我,因为我也在积极研究这个问题 (2认同)