暑期学习的过程中有幸接触了gensim中的lsi模型计算文档间的相似度,接下来将把我的所学整理一下。
详细的可见gensim的英文官方文档:http://radimrehurek.com/gensim/tutorial.html
关于gensim
gensim是一个相当专业的主题模型Python工具包,常应用于文本处理中挖掘文本间的相似度,它能够将文档根据TF-IDF, LDA, LSI 等模型转化成向量模式,以便进行进一步的处理。此外,gensim还实现了word2vec功能,能够将单词转化为词向量。
Ubuntu上gensim的安装
gensim依赖NumPy和SciPy这两大python科学计算工具包,因此也需安装这两个依赖库~
(1)安装numpy和scipy
sudo apt-get install python-numpy
sudo apt-get install python-scipy
(2)安装gensim
sudo pip install --upgrade gensim
如果会报错的话可以尝试
sudo easy_install --upgrade gensim
gensim的使用
首先介绍几个概念:
(1)语料corpora就是一系列文档的集合,其中的词已经使用了字典进行相应的转换,成为一个个数字,我们可以通过字典的对应关系从数字找到对应的词。
(2)我们的输入是一个document list,每个文档是列表的一份子
from gensim import corpora, models, similarities
# 先获取文档进行切词存于list中便于后续工作
def get_class():
documents = []
data_path = '../task/'
for i in range(len(interest)):
each_path = os.path.join(data_path, interest[i]+'/')
filename = os.listdir(each_path)
for name in filename:
title_class = ''
f_path = os.path.join(each_path, name)
lines = linecache.getlines(f_path)
line = jieba.cut(lines[2])
for word in line:
if word not in stopwords:
title_class = title_class + word + ' '
else:
continue
documents.append(title_class)
return documents
if __name__ == '__main__':
documents = get_class()
# 对文档进行处理
texts = [[word for word in document.lower().split()] for document in documents]
# 构建词典
dictionary = corpora.Dictionary(texts)
# 将用字符串表示的文档转换为用id表示的文档向量
corpus = [dictionary.doc2bow(text) for text in texts]
# 基于“训练文档”计算一个TF-IDF“模型”
tfidf = models.TfidfModel(corpus)
corpus_tfidf = tfidf[corpus]
# 建立lsi模型
lsi = models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=3) # 这里的topic数需要自行调整达到最好的效果
# 或者建立lda模型
# lda = models.LdaModel(copurs_tfidf, id2word=dictionary, num_topics=2)
# 构建索引便于后面的查询
index = similarities.MatrixSimilarity(lsi[corpus])
# 进行查询
query = "某一篇文档"
# 将其向量化
query_bow = dictionary.doc2bow(query.lower().split())
# 使用之前建立的lsi模型将向量映射topic空间
query_lsi = lsi[query_bow]
# 计算查询与训练文档的余弦相似度
sims = index[query_lsi]
# 进行排序即可看到效果
sort_sims = sorted(enumerate(sims), key=lambda item: -item[1])
参考资料:
1.gensim的官方文档
2.我爱自然语言处理(强烈推荐此系列文档)