2017-09-10 99 views
0
from gensim import corpora, models, similarities 

documents = ["This is a book about cars, dinosaurs, and fences"] 

# remove common words and tokenize 
stoplist = set('for a of the and to in - , is'.split()) 
texts = [[word for word in document.lower().split() if word not in stoplist] 
     for document in documents] 

# Remove commas 
texts[0] = [text.replace(',','') for text in texts[0]] 

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

lsi = models.LsiModel(corpus, id2word=dictionary, num_topics=2) 

doc = "I like cars and birds" 
vec_bow = dictionary.doc2bow(doc.lower().split()) 

vec_lsi = lsi[vec_bow] 
index = similarities.MatrixSimilarity(lsi[corpus]) 

sims = index[vec_lsi] # perform a similarity query against the corpus 
print(sims) 

在上面的代码中,我比较多少“这是一本关于汽车,恐龙,和围栏”文本相似性是类似“我喜欢车和鸟类”使用余弦相似技术。与gensim和余弦相似

这两句话有共同的有效1个字,这是“汽车”,但是当我运行的代码,我得到他们是100%相似。这对我没有意义。

有人可以建议如何提高我的代码,让我得到一个合理的数字?

回答

0

这些主题建模技术需要各种实际的数据来实现合理的结果。只有一个或几个文本示例的玩具大小的例子不能很好地工作 - 即使他们这样做,它通常只是运气好或者适合人为设计。

特别是:

  • 只有一个实例的模型不能理智地建立多个主题,因为没有对比之间的文档模型

  • 带有它不是招字模型“T见过忽略的话,那么你的测试文档似乎是一样的一个字‘汽车’ - 它见过的唯一字之前

在此CA se,你的单一培训文件和测试文件,被LSI建模为具有来自第0个主题的0贡献,以及来自第1个主题的积极贡献(不同大小)。由于余弦相似性仅仅比较角度而不是幅度,因此两个文档都是从原点开始的同一行,因此没有差异,因此相似性为1.0。

但是,如果您拥有更好的培训数据,并且不仅仅是一个已知单词的测试文档,您可能会开始获得更明智的结果。即使是几十个培训文档和一个包含多个已知词汇的测试文档也可能有所帮助......但是数百或数千或几万个培训文档会更好。