自然语言处理之文本相似度的计算
自然语言处理中,文本相似度的计算至关重要,在计算文本相似度的时候,通常将特征表示为向量的形式,目前常用的简单文本相似度计算有以下几种,文末上代码。
-
余弦相似度
对于两个向量A和B,余弦相似度关注的是向量之间的角度关系,并不关心他们的绝对大小,其取值范围是[-1,1]。当一对儿文本长度差距很大,但内容相近时,如果使用词频或者词向量作为特征,他们在特征空间中的欧式距离会很大,如果使用余弦相似度的话,夹角可能很小,相似度较高。
余弦相似度公式:cos(A,B) =
余弦距离公式:1-cos(A,B) -
jaccard相似度
jaccard相似度的简单解释就是两个句子词汇的交集size除以两个句子词汇的并集size,这个与上述cos相似度的区别在于若某一词汇在某个向量中重复许多次并不会影响相似度的计算,假设某个业务场景的文本包含了很多重复性的词汇,而这些词汇与我们想要做的任务关系不大,那么可选择jaccard相似度来计算。
jaccard相似度公式: -
w2v相似度
在计算文本相似度时,如果需要考虑周围词对当前文本向量的影响可能需要更复杂一点的计算或者模型,经典的模型有word2vec或者bert等等,一个最简单的表示文本向量的方式就是将文本中所有的词向量相应维度进行相加,从而得到当前文本的向量,在得到文本向量之后可以选择cos相似度去计算文本相似度。 -
编辑距离
编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。在nlp中编辑距离一般用于拼写纠错,相似度计算,在搜索领域,通过计算输入词与候选词的编辑距离,可以一定量的帮助用户进行拼写纠错。这部分不细说了,看代码。
点击查看代码
from scipy import spatial
#余弦相似度
def cos_sim(a, b):
return 1 - spatial.distance.cosine(a, b)
#jaccard相似度
def jaccard_dist(s1, s2):
l1 = set(s1)
l2 = set(s2)
cap = l1 & l2
cup = l1|l2
return len(cap)/len(cup)
#编辑距离
def minDistance(word1, word2):
dp = [[0 for j in range(len(word2)+1)]for i in range(len(word1)+1)]
for i in range(len(word1)+1):
for j in range(len(word2)+1):
if i == 0:
dp[i][j] = j
elif j == 0:
dp[i][j] = i
elif word1[i-1] == word2[j-1]:
dp[i][j] = dp[i-1][j-1]
else:
dp[i][j] = 1+min(dp[i][j-1],
dp[i-1][j],
dp[i-1][j-1])
return dp[len(word1)][len(word2)]
#w2v计算相似度
from gensim.models import word2vec
import jieba
import numpy as np
model_path = "~~~"
model = word2vec.Word2Vec.load(model_path)
def w2v(sentence):
words = jieba.cut(sentence, cut_all=False)
dim = model.syn0.shape[1]
vector = np.zeros(dim)
for word in words:
if word in model.vocab:
vec = model[word]
vector += vec
return vector
sim = cos_sim(sentence1,sentence2)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)