首页 > 其他分享 >NLP句子相似性方法总结及实现

NLP句子相似性方法总结及实现

时间:2023-07-26 21:14:00浏览次数:32  
标签:NLP Jaro distance sents 相似性 句子 向量

目录

1、基于Word2Vec的余弦相似度

2、TextRank算法中的句子相似性

3、莱文斯坦距离(编辑距离)

4、莱文斯坦比

5、汉明距离

6、Jaro距离(Jaro Distance)

7、Jaro-Winkler距离(Jaro-Winkler Distance)

8、基于Doc2Vec的句子相似度计算

1、基于Word2Vec的余弦相似度
首先对句子分词,使用Gensim的Word2Vec训练词向量,获取每个词对应的词向量,然后将所有的词向量相加求平均,得到句子向量,最后计算两个句子向量的余弦值(余弦相似度)。

余弦相似度:用向量空间中的两个向量夹角的余弦值作为衡量两个个体间差异大小的度量,值越接近1,就说明夹角角度越接近0°,也就是两个向量越相似。

公式:

 

代码实现:

#对每个句子的所有词向量取均值,来生成一个句子的vector
#sentence是输入的句子,size是词向量维度,w2v_model是训练好的词向量模型
def build_sentence_vector(sentence,size,w2v_model):
vec=np.zeros(size).reshape((1,size))
count=0
for word in sentence:
try:
vec+=w2v_model[word].reshape((1,size))
count+=1
except KeyError:
continue
if count!=0:
vec/=count
return vec

#计算两个句向量的余弦相似性值
def cosine_similarity(vec1, vec2):
a= np.array(vec1)
b= np.array(vec2)
cos1 = np.sum(a * b)
cos21 = np.sqrt(sum(a ** 2))
cos22 = np.sqrt(sum(b ** 2))
cosine_value = cos1 / float(cos21 * cos22)
return cosine_value

#输入两个句子,计算两个句子的余弦相似性
def compute_cosine_similarity(sents_1, sents_2):
size=300
w2v_model=Word2Vec.load('w2v_model.pkl')
vec1=build_sentence_vector(sents_1,size,w2v_model)
vec2=build_sentence_vector(sents_2,size,w2v_model)
similarity = cosine_similarity(vec1, vec2)
return similarity
2、TextRank算法中的句子相似性
句子相似性公式:

 

公式中,Si,Sj分别表示两个句子,Wk表示句子中的词,那么分子部分的意思是同时出现在两个句子中的相同词的个数,分母是对句子中词的个数求对数之和。分母这样设计可以遏制较长的句子在相似度计算上的优势。

代码实现:

def two_sentences_similarity(sents_1, sents_2):
counter = 0
for sent in sents_1:
if sent in sents_2:
counter += 1
sents_similarity=counter/(math.log(len(sents_1))+math.log(len(sents_2)))
return sents_similarity
3、莱文斯坦距离(编辑距离)
莱文斯坦距离,又称Levenshtein距离,是编辑距离(edit distance)的一种。是描述由一个字串转化成另一个字串最少的编辑操作次数,其中的操作包括插入、删除和替换。

举例:

例如将kitten一字转成sitting:
sitten(k替换为→s)
sittin (e替换为→i)
sitting (添加→g)
那么二者的编辑距离为3。
使用python_Levenshtein包进行计算,包下载版本为:python_Levenshtein-0.12.0-cp36-cp36m-win_amd64.whl

然后安装:pip install python_Levenshtein-0.12.0-cp36-cp36m-win_amd64.whl

代码实现:

import Levenshtein
s1='kitten'
s2='sitting'
lev_distance=Levenshtein.distance(s1,s2)
print(lev_distance)
4、莱文斯坦比
莱文斯坦比计算公式 r = (sum - ldist) / sum, 其中sum是指str1 和 str2 字串的长度总和,ldist是类编辑距离。

注意:这里的类编辑距离不是3中所说的编辑距离,3中三种操作中每个操作+1,而在此处,删除、插入依然+1,但是替换+2 。这样设计的目的:ratio('a', 'c'),sum=2,按3中计算为(2-1)/2 = 0.5,’a','c'没有重合,显然不合算,但是替换操作+2,就可以解决这个问题。

代码实现:

 

5、汉明距离
要求str1和str2必须长度一致。是描述两个等长字串之间对应位置上不同字符的个数。

代码实现:

import Levenshtein
s1='abc'
s2='cba'
lev_distance=Levenshtein.hamming(s1,s2)
print(lev_distance)
#结果输出为2
6、Jaro距离(Jaro Distance)
Jaro Distance 算法是一种计算两个字符串之间相似度的方法。

计算公式:

 

其中,m为S1和S2的匹配长度(即匹配的字符数),t是换位的数目;如果m=0,则dj=0。

两个分别来自S1和S2的字符如果相距不超过

 

时,我们就认为这两个字符串是匹配的;而这些相互匹配的字符则决定了换位的数目t,简单来说就是不同顺序的匹配字符的数目的一半即为换位的数目t。

举例:MARTHA与MARHTA的字符都是匹配的,但是这些匹配的字符中,T和H要换位才能把MARTHA变为MARHTA,那么T和H就是不同的顺序的匹配字符,t=2/2=1。那么这两个字符串的Jaro Distance即为:

 

代码实现:

import Levenshtein
s1='MARTHA'
s2='MARHTA'
lev_distance=Levenshtein.jaro(s1,s2)
print(lev_distance)
#结果输出为0.9444
7、Jaro-Winkler距离(Jaro-Winkler Distance)
Jaro-Winkler Distance给予了起始部分就相同的字符串更高的分数,他定义了一个前缀p。

计算公式:

 

其中,dj是两个字符串的Jaro Distance,是前缀的相同的长度,但是规定最大为4,p则是调整分数的常数,规定不能超过0.25,不然可能出现dw大于1的情况,Winkler将这个常数定义为0.1。

举例:6中提及的MARTHA和MARHTA的Jaro-Winkler Distance为:dw = 0.944 + (3 * 0.1(1 − 0.944)) = 0.961

代码实现:

import Levenshtein
s1='MARTHA'
s2='MARHTA'
lev_distance=Levenshtein.jaro_winkler(s1,s2)
print(lev_distance)
#结果输出为0.9611
8、基于Doc2Vec的句子相似度计算
代码实现:

from gensim.models.doc2vec import Doc2Vec
d2v_model=Doc2Vec.load('data/w2v/doc2vec_model.pkl')

#推断一个句子的向量
sen_vec1=d2v_model.infer_vector('挺 菜品 单一 扇贝 好吃 水果 太少 服务 服务员 服务 挺 开心'.split())
print(sen_vec1)

#返回文档中和sen_vec句子最相似的前top个句子
sen_similar=d2v_model.docvecs.most_similar([sen_vec1],topn=3)
print(sen_similar) #返回的是句子的编号和相似度
结果:

 

参考:

1、Levenshtein全部函数链接

2、Jaro–Winkler distance链接

3、计算文本相似度工具fuzzywuzzy

本人博文NLP学习内容目录:

一、NLP基础学习

1、NLP学习路线总结

2、TF-IDF算法介绍及实现

3、NLTK使用方法总结

4、英文自然语言预处理方法总结及实现

5、中文自然语言预处理方法总结及实现

6、NLP常见语言模型总结

7、NLP数据增强方法总结及实现

8、TextRank算法介绍及实现

9、NLP关键词提取方法总结及实现

10、NLP词向量和句向量方法总结及实现

11、NLP句子相似性方法总结及实现

12、NLP中文句法分析

二、NLP项目实战

1、项目实战-英文文本分类-电影评论情感判别

2、项目实战-中文文本分类-商品评论情感判别

3、项目实战-XGBoost与LightGBM文本分类

4、项目实战-TextCNN文本分类实战

5、项目实战-Bert文本分类实战

6、项目实战-NLP中文句子类型判别和分类实战
————————————————
版权声明:本文为CSDN博主「Asia-Lee」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/asialee_bird/article/details/97786216

标签:NLP,Jaro,distance,sents,相似性,句子,向量
From: https://www.cnblogs.com/ExMan/p/17583531.html

相关文章

  • 关于深度学习、NLP和CV,我们写了一本1400页的全栈手册
    不知不觉写文章已经四年了。最开始是一个人,后来恰了恰饭,就招揽了很多比小夕厉害的小伙伴一起写。不知不觉已经积累了300多篇了。。三年以来,我跟小伙伴们原创的300+篇深度学习、NLP、CV、知识图谱、跨模态等领域的入门资料、子方向综述、2018~2022学术前沿解读、工业界炼丹经验与算......
  • 安装nlpcda2.5.8 Simbert不能正常使用,除非你安装:bert4keras、tensorflow ,为了
    安装nlpcda2.5.8Simbert不能正常使用问题解决方案在自然语言处理(NLP)领域,模型的选择和安装是非常重要的。为了使用nlpcda2.5.8Simbert,我们需要在安装该库之前先安装bert4keras和tensorflow。本文将介绍如何解决Simbert不能正常使用的问题,并给出相应的代码示例。1.安装bert4kera......
  • 模型部署 — PaddleNLP 基于 Paddle Serving 快速使用(服务化部署 - Docker)— 图像识别
    目录流程版本安装Docker安装PaddleNLP安装环境准备模型准备压缩模型下载模型模型部署环境配置启动服务测试--暂时还没通过重启图像识别+信息抽取(UIE-X),部署接口供别的应用调用最终在自己部署的环境中识别时报错,不知道是不是和GPU有关,还在尝试中流程在百度BMLCodeLab......
  • Prompt Learning: ChatGPT 也在用的 NLP 新范式
    编者按:自GPT-3以来,大语言模型进入了新的训练范式,即“预训练模型+Promplearning”。在这一新的范式下,大语言模型呈现出惊人的zero-shot和few-shot能力,使用较少的训练数据来适应新的任务形式。最近火爆出圈的ChatGPT是利用这一方式。简单理解Promptlearning,其核心就是以特定的模板,......
  • AI识别检验报告 -PaddleNLP UIE-X 在医疗领域的实战
    目录UIE-X在医疗领域的实战1.项目背景2.案例简介3.环境准备数据转换5.模型微调6.模型评估7.Taskflow一键部署UIE-X在医疗领域的实战PaddleNLP全新发布UIE-X......
  • SQL对决MySQL全面对比:差异、相似性、用途和优点!
    SQL和MySQL被用于编程和管理关系型数据库。了解SQL和MySQL之间的主要区别,以及在使用这些数据库管理工具的工作中所需的技能。SQL和MySQL是与数据库相关的语言。SQL是一种用于与关系型数据库中的数据交互的编程语言,而MySQL是一种实现SQL标准的开源数据库产品。相比其他关系型数据......
  • Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks
    目录概符号说明RAGRetriever:DPRGenerator:BARTLewisP.andPerezE.,etal.Retrieval-augmentedgenerationforknowledge-intensivenlptasks.NIPS,2020.概RAG:赋予模型检索的能力.符号说明\(\bm{x}\),输入序列;\(\bm{y}\),输出序列,长度为\(N\);RAG......
  • NLP(四十七):损失函数
    三元组损失tripletloss设计初衷:让x与这个跟他同类的点距离更近,跟非同类的点距离更远。d是距离,m的含义是,当x与x+的距离减去x与x-,如果小于-m时,对损失函数的贡献为0,如果大于-m时,对损失的贡献大于0.含义就是:当负例太简单时,不产生损失,这个损失的目标是,挑选困难样本进行分类。......
  • NLP(四十六):GLOVE
    转载自https://zhuanlan.zhihu.com/p/58916233在上节,我们学习了词向量的两种训练方式:Skip-Gram和CBOW,都是通过句子中的某个单词去预测另一个单词。而本节,我们将学习第三种词向量的训练模型:GLOVE[1]。GLOVE模型是由斯坦福教授Manning、Socher等人于2014年提出的一种词向量训练模......
  • 机器翻译|EMNLP 2019大规模利用单语数据提升神经机器翻译
    目前,目标语言端的无标注单语数据已被广泛应用于在机器翻译任务中。然而,目标语言端的无标注数据一旦使用不当,反而会给模型结果带来负面影响。为了有效利用大规模源语言端和目标语言端的单语数据,微软亚洲研究院在EMNLP2019上发表的论文中,提出一种简单的语料数据使用流程,只需要四......