句子相似度实现算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/qq_32113189/article/details/82499103