版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32113189/article/details/82499103
句子相似度–顾名思义就是两个句子之间相似的程度。
句子相似度在NLP中有很大的用处,譬如文本分类、信息检索、语义分析等,它可以为我们提供检索信息更快的方式,并且得到的信息更加准确。
基于传统的相似度算法,可以分为以下几个步骤:
1、分词
2、去除停用词
3、词向量的生成
4、相似度分析
5、生成相似度分数
相似度算法有很多,TF-IDF算法、余弦相似度算法、gensim算法、逻辑算法等等,有很多可以进行尝试。而且每种算法的准确性都不一致,下面给出的是gensim算法,通过jieba进行分词,已经应用到实际的项目中,希望能够给大家帮助。
# -*- coding: utf-8 -*-
import jieba
from gensim import corpora, models, similarities
from QASolution.DataList import get_question
def tfidf_similar(question):
data = get_question()#得到需要进行匹配的数据列表或者字典
#对多个结果分词
all_cut = []
for i in data.keys():
all = []
all.append(i)
for j in all:
j_cut = [word for word in jieba.cut(j)]
all_cut.append(j_cut)
#print(all_cut)
#对输入分词
test_cut = [word for word in jieba.cut(question)]
#用dictionary方法获取词袋(bag-of-words)
dictionary = corpora.Dictionary(all_cut)
#词袋中用数字对所有词进行编号
dictionary.keys()
#编号与词间的对应关系
dictionary.token2id
#doc2bow制作语料库,语料库是一组向量,向量中的元素是一个二元组(编号、频次数)
corpus = [dictionary.doc2bow(doc) for doc in all_cut]
#输入转换成二元组向量
test_vec = dictionary.doc2bow(test_cut)
#tfidf相似度分析
tfidf = models.TfidfModel(corpus)
index = similarities.SparseMatrixSimilarity(tfidf[corpus],num_features=len(dictionary.keys()))
sim = index[tfidf[test_vec]]
question_list = sorted(enumerate(sim),key=lambda item: -item[1])
old = question_list[:5]
new = all_cut
data = {}
for each in old:
p = each[1]#得到概率
name = "".join(new[each[0]])#得到每个概率对应的疾病名称
data[name] = p
return data