python字符串比较差异,python字符串相似度匹配算法
本文主要介绍Python中的levenshtein,有很好的参考价值。希望对你有帮助。如有错误或不足之处,请不吝赐教。
目录
Python levenshtein Python相似性评估1。在计算图片相似度的时候,我用的是余弦距离2。欧几里德距离3。曼哈顿距离4。切比雪夫距离5。闵可夫斯基距离6。标准化欧几里德距离7。马哈拉诺比斯距离8。编辑距离。
Python字符串相似度
使用difflib模块-比较两个字符串或文本的相似性。
首先导入difflib模块。
导入差异库
示例:
上海中心大厦
S1=建筑
S2=上海中心
S3=上海中心大厦
打印(difflib。SequenceMatcher(None,Str,s1)。quick_ratio())
打印(difflib。SequenceMatcher(None,Str,s2)。quick_ratio())
打印(difflib。SequenceMatcher(None,Str,s3)。quick_ratio())
0.5
0.8
0.8333333333333334
Python相似度评估
评估相似性时,通常使用“距离”:
1. 在计算图片的相似度时,我自己用到过余弦距离
你在开玩笑吗?你不是在学几何。你是怎么得出夹角的余弦的?放松点,先生们。几何夹角的余弦可以用来度量两个矢量方向的差异。机器学习中借用了这个概念来衡量样本向量之间的差异。
(1)二维空间中向量A(x1,y1)与向量B(x2,y2)夹角的余弦公式:
(2)两个N维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)之间夹角的余弦
同样,对于两个N维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n),我们可以用类似于夹角余弦的概念来衡量它们的相似性。
即:
余弦的取值范围是[-1,1]。角度余弦越大,两个向量之间的角度越小,角度余弦越小,两个向量之间的角度越大。当两个向量方向一致时,夹角余弦取最大值1,当两个向量方向完全相反时,夹角余弦取最小值-1。
将numpy作为np导入
#余弦相似度(方法1):
def余弦_距离2(矢量1,矢量2):
user _ item _ matrix=NP . v stack((vector 1,vector2))
sim=user _ item _ matric . dot(user _ item _ matric。t)
norms=NP . array([NP . sqrt(NP . diagonal(sim))])
user _ similarity=(sim/norms/norms。T)[0][1]
返回用户相似度
data=NP . load( data/all _ features . npy )
#sim=cosin_distance(data[22],data[828])
sim=余弦距离2(数据[22],数据[828])
打印(sim卡)
#余弦相似度(方法2)
从sklearn.metrics.pairwise导入余弦_相似度
a=np.array([1,2,8,4,6])
a1=np.argsort(a)
user_tag_matric=np.vstack((a,a1))
用户相似性=余弦相似性(用户标记矩阵)
打印(user_similarity[0][1])
#余弦相似度(方法3)
从sklearn.metrics.pairwise导入成对距离
a=np.array([1,2,
8, 4, 6])
a1 = np.argsort(a)
user_tag_matric = np.vstack((a, a1))
user_similarity = pairwise_distances(user_tag_matric, metric=cosine)
print(1-user_similarity[0][1])
需要注意的一点是,用pairwise_distances计算的Cosine distance是1-(cosine similarity)结果
2.欧式距离
欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式
# 1) given two data points, calculate the euclidean distance between themdef get_distance(data1, data2):
points = zip(data1, data2)
diffs_squared_distance = [pow(a - b, 2) for (a, b) in points]
return math.sqrt(sum(diffs_squared_distance))
3. 曼哈顿距离
从名字就可以猜出这种距离的计算方法了。想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个曼哈顿距离。而这也是曼哈顿距离名称的来源, 曼哈顿距离也称为城市街区距离(CityBlock distance)。
def Manhattan(vec1, vec2):npvec1, npvec2 = np.array(vec1), np.array(vec2)
return np.abs(npvec1-npvec2).sum()
# Manhattan_Distance,
4.切比雪夫距离
国际象棋玩过么?国王走一步能够移动到相邻的8个方格中的任意一个。那么国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?自己走走试试。你会发现最少步数总是max( x2-x1 , y2-y1 ) 步。有一种类似的一种距离度量方法叫切比雪夫距离。
def Chebyshev(vec1, vec2):npvec1, npvec2 = np.array(vec1), np.array(vec2)
return max(np.abs(npvec1-npvec2))
# Chebyshev_Distance
5.闵可夫斯基距离
闵氏距离不是一种距离,而是一组距离的定义
#!/usr/bin/env pythonfrom math import*
from decimal import Decimal
def nth_root(value,n_root):
root_value=1/float(n_root)
return round(Decimal(value)**Decimal(root_value),3)
def minkowski_distance(x,y,p_value):
return nth_root(sum(pow(abs(a-b),p_value) for a,b in zip(x,y)),p_value)
print(minkowski_distance([0,3,4,5],[7,6,3,-1],3))
6.标准化欧氏距离
标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。标准欧氏距离的思路:既然数据各维分量的分布不一样,好吧!那我先将各个分量都标准化到均值、方差相等吧
def Standardized_Euclidean(vec1,vec2,v):from scipy import spatial
npvec = np.array([np.array(vec1), np.array(vec2)])
return spatial.distance.pdist(npvec, seuclidean, V=None)
# Standardized Euclidean distance
# http://blog.csdn.net/jinzhichaoshuiping/article/details/51019473
7.马氏距离
def Mahalanobis(vec1, vec2):npvec1, npvec2 = np.array(vec1), np.array(vec2)
npvec = np.array([npvec1, npvec2])
sub = npvec.T[0]-npvec.T[1]
inv_sub = np.linalg.inv(np.cov(npvec1, npvec2))
return math.sqrt(np.dot(inv_sub, sub).dot(sub.T))
# MahalanobisDistance
8.编辑距离
def Edit_distance_str(str1, str2):import Levenshtein
edit_distance_distance = Levenshtein.distance(str1, str2)
similarity = 1-(edit_distance_distance/max(len(str1), len(str2)))
return {Distance: edit_distance_distance, Similarity: similarity}
# Levenshtein distance
其中,输入数据是两个同维度的数组
以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。