1、功能说明
1、对各个文档数据先生成总量的词袋,
2、根据总量的词袋,各个文档数据构造各自的词向量
3、根据总量的词袋,生成待查找数据的向量,
3、通过TF-IDF模型,生成各个文档数据与待查找数据的相似度
4、通过LSI模型,生成各个文档数据与待查找数据的相似度
2、安装所需要的python库
2.1、分词库
pip3 install jieba
2.2、生成总词袋,词袋向量,TF-IDF模型,LSI模型库
pip3 install gensim
3、代码
# -*- coding: utf-8 -*-
import jieba
import gensim
if __name__ == "__main__":
source_texts = [
'苹果,葡萄,柚子',
'这周,我想出去玩了',
'苹果,葡萄,柚子,爱吃,香蕉还行',
]
query_s = '苹果,柚子,葡萄'
#源数据
source_words = [jieba.lcut(text) for text in source_texts]
#建立词袋模型,提取所有的去重的字,赋予其序号
dictionary = gensim.corpora.Dictionary(source_words)
#for k,v in dictionary.items():
# print(k,v)
#根据前面的词袋,构造各个语句的词向量
source_vectors = [dictionary.doc2bow(text) for text in source_words]
#for i,v in enumerate(source_vectors):
# print(i,v)
#查询数据
query_words = jieba.lcut(query_s)
#根据之前生成的总量词袋数据,生成查找的词袋向量
query_vector = dictionary.doc2bow(query_words)
def get_match_result(my_model,source_vectors,query_vector):
sim_source = my_model[source_vectors]
sim_query = my_model[query_vector]
index = gensim.similarities.MatrixSimilarity(sim_source) #得到源数据所有的索引数据
sims = index[sim_query] #查询的数据与源数据相似度匹配
result = []
for i,elem in enumerate(sims):
result.append([elem, source_texts[i]])
result.sort(key=(lambda l: l[0]), reverse = True)
return result
#TF-IDF模型
tf_model = gensim.models.TfidfModel(source_vectors)
result = get_match_result(tf_model,source_vectors = source_vectors,query_vector = query_vector)
print("tf-查找数据:%s\n"%query_s,"\n".join([u"相识度:'%s',源数据:'%s'"%(k,v) for k,v in result]))
#LSI主题模型
lsi_model = gensim.models.LsiModel(source_vectors, id2word=dictionary, num_topics=2)
result = get_match_result(lsi_model,source_vectors = source_vectors,query_vector = query_vector)
print("\nlsi-查找数据:%s\n"%query_s,"\n".join([u"相识度:'%s',源数据:'%s'"%(k,v) for k,v in result]))
4、执行结果
[xx@xxxxxxxxxx words]$ python3 similar.py
Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
Loading model cost 0.962 seconds.
Prefix dict has been built successfully.
tf-源数据:苹果,柚子,葡萄
相识度:'0.99999994',数据:'苹果,葡萄,柚子'
相识度:'0.25251475',数据:'苹果,葡萄,柚子,爱吃,香蕉还行'
相识度:'0.0',数据:'这周,我想出去玩了'
lsi-源数据:苹果,柚子,葡萄
相识度:'1.0',数据:'苹果,葡萄,柚子'
相识度:'0.9970355',数据:'苹果,葡萄,柚子,爱吃,香蕉还行'
相识度:'0.3389639',数据:'这周,我想出去玩了'