Python如何判断字符串相似度,方法有什么
Admin 2022-08-30 群英技术资讯 623 次浏览
利用difflib模块—实现两个字符串或文本相似度比较
首先导入difflib模块
import difflib
示例:
Str = '上海中心大厦' s1 = '大厦' s2 = '上海中心' s3 = '上海中心大楼'
print(difflib.SequenceMatcher(None, Str, s1).quick_ratio()) print(difflib.SequenceMatcher(None, Str, s2).quick_ratio()) print(difflib.SequenceMatcher(None, Str, s3).quick_ratio()) 0.5 0.8 0.8333333333333334
在评估相似度的时候,经常会用到“距离”:
有没有搞错,又不是学几何,怎么扯到夹角余弦了?各位看官稍安勿躁。几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来衡量样本向量之间的差异。
(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。
import numpy as np # 余弦相似度(法1): def cosin_distance2(vector1, vector2): user_item_matric = np.vstack((vector1, 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] return user_similarity data = np.load("data/all_features.npy") #sim = cosin_distance(data[22], data[828]) sim = cosin_distance2(data[22], data[828]) print(sim) # 余弦相似度(法2) from sklearn.metrics.pairwise import cosine_similarity a = np.array([1, 2, 8, 4, 6]) a1 = np.argsort(a) user_tag_matric = np.vstack((a, a1)) user_similarity = cosine_similarity(user_tag_matric) print(user_similarity[0][1]) # 余弦相似度(法3) from sklearn.metrics.pairwise import pairwise_distances 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)结果
欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式
# 1) given two data points, calculate the euclidean distance between them def 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))
从名字就可以猜出这种距离的计算方法了。想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”。而这也是曼哈顿距离名称的来源, 曼哈顿距离也称为城市街区距离(CityBlock distance)。
def Manhattan(vec1, vec2): npvec1, npvec2 = np.array(vec1), np.array(vec2) return np.abs(npvec1-npvec2).sum() # Manhattan_Distance,
国际象棋玩过么?国王走一步能够移动到相邻的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
闵氏距离不是一种距离,而是一组距离的定义
#!/usr/bin/env python from 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))
标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。标准欧氏距离的思路:既然数据各维分量的分布不一样,好吧!那我先将各个分量都“标准化”到均值、方差相等吧
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
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
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
其中,输入数据是两个同维度的数组
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
当使用桌面应用程序的时候,有没有那么一瞬间,想学习一下桌面应用程序开发?下面这篇文章主要给大家介绍了关于Python使用pywebview开发桌面应用的相关资料,需要的朋友可以参考下
FlashText是GitHub上的一个开源Python库,正如之前所提到的,它在提取关键字和替换关键字任务上有着极高的性能。本文将详解一下flashtext的使用,需要的可以参考一下
PyMuPDF是MuPDF的Python绑定-“轻量级PDF和XPS查看器”。本文将利用PyMuPDF实现PDF的一些基本操作,文中的示例代码讲解详细,感兴趣的可以了解一下
这篇文章主要为大家介绍了Python的模块,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
这篇文章主要介绍了Python制作当年第一款手机游戏-贪吃蛇游戏,文章利用Python pygame做一个贪吃蛇的小游戏而且讲清楚每一段代码是用来干嘛的,需要的朋友可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008