python实现文本相似度排名计算

   项目中,客户突然提出需要根据一份企业名单查找对应的内部系统用户信息,然后根据直接的企业社会统一信用号和企业名称进行匹配,发现匹配率只有2.86%,低得可怜。所以根据客户的要求,需要将匹配率提高到70-80%左右,于是开始了折腾之路。

    上网一查,各种相似度的算法供选择,简直是眼花缭乱,感叹现在python发展的强大,需要做什么研究都能快速运用上各种算法库,找到的算法有:

1、欧几里得距离(Eucledian Distance)
欧氏距离是最常用的距离计算公式,衡量的是多维空间中各个点之间的绝对距离。

2、曼哈顿距离(Manhattan Distance)
曼哈顿距离依赖坐标系统的转度,而非系统在坐标轴上的平移或映射,他是使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和。

3.切比雪夫距离
在数学中,切比雪夫距离(Chebyshev distance)或是L∞度量,是向量空间中的一种度量,二个点之间的距离定义是其各坐标数值差绝对值的最大值。以数学的观点来看,切比雪夫距离是由一致范数(uniform norm)(或称为上确界范数)所衍生的度量,也是超凸度量(injective metric space)的一种。 
4、明可夫斯基距离(Minkowski distance)
明氏距离是欧氏距离的推广。闵氏距离不是一种距离,而是一组距离的定义。闵氏距离的定义:两个n维变量a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的闵可夫斯基距离定义为:
其中p是一个变参数。
当p=1时,就是曼哈顿距离
当p=2时,就是欧氏距离
当p→∞时,就是切比雪夫距离
根据变参数的不同,闵氏距离可以表示一类的距离。
5、词袋模型 6、TF-IDF 7、余弦相似度8、Python自带比较相似度函数difflib.SequenceMatcher 9、word2vec 10、JS距离 11、simtext 等等... ...

然后最后我们采用的是 Levenshtein,Levenshtein Distance是一个度量两个字符序列之间差异的字符串度量标准,两个单词之间的Levenshtein Distance是将一个单词转换为另一个单词所需的单字符编辑(插入、删除或替换)的最小数量。Levenshtein Distance是1965年由苏联数学家Vladimir Levenshtein发明的。Levenshtein Distance也被称为编辑距离(Edit Distance)。
 安装对应的库

# conda install python-Levenshtein
# pip install python-Levenshtein

计算字符串的相似度

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

编辑距离,也称为Levenshtein距离,描述由一个字串转化成另一个字串最少的操作次数,在其中的操作包括插入、删除、替换。

莱文斯坦比,计算公式 r = (sum - ldist) / sum, 其中sum是指str1 和 str2 字串的长度总和,ldist是类编辑距离
注意:这里的类编辑距离不是2中所说的编辑距离,2中三种操作中每个操作+1,而在此处,删除、插入依然+1,但是替换+2
这样设计的目的:ratio(‘a’, ‘c’),sum=2,按2中计算为(2-1)/2 = 0.5,’a’,'c’没有重合,显然不合算,但是替换操作+2,就可以解决这个问题。
 

在实际操作中,我们应用了莱文斯坦比来给不同的企业名称打分

第一步:剔除高频词,由于通过企业名称精确匹配发现很难匹配到对应的用户名称,那么很有可能这份企业名单中的企业名称不是那么符合规范也可能更改了其他后缀、前缀,所以通过剔除高频词之后,再进行模糊匹配。

#region 第一步excelname = '*******.xlsx'LoadPath = excelname  #加载excel路径(这里为相对路径,excel表与该程序在同一文件夹下就能识别,所以只用excel文件名即可)#excel表格初始化book=load_workbook(LoadPath, data_only=True)#加载已有Excel文档sheet_current_week_result=book['sheet1']#加载需要的工作簿(这里为excel表中的sheet工作簿)#  剔除企业高频词       w = 1w = w + 1while w <= sheet_current_week_result.max_row:strreplace = sheet_current_week_result['A'+str(w)].valuefor qy_gpc in ['有限公司','**省','科技','供应站','分公司','有限责任','有限','贸易','湖南','公司']:            strreplace = strreplace.replace(qy_gpc,'')sheet_current_week_result['E'+str(w)].value = strreplaceprint(w)w = w + 1book.save(LoadPath)
#endregion

第二步:模糊匹配,根据剔除后的企业名称与内部系统的用户名进行模糊匹配,可能得到一个企业名称对应多个用户名的情况,这样才需要我们的第三步,用户名称相似度排名打分,当然第二步中我们可能获取到完全匹配的名称,我们需要另外存放起来。

#region 第二步df = pd.read_excel('***.xlsx', sheet_name='sheet1')df.index = range(1,len(df)+1)df = df[:len(df)+1]df = df.values.tolist()all_zbdc = []zbdc_tup = []for row in df: # 2. 将剔除后的企业名称、匹配后用户名称完全相等的记录找出来,得到表AllMateqy_nm,qy_area,qy_code,qy_bs_scope,qy_tc_gpc,qy_mate_nm = rowzbdc = row[0]res_zbdc = []flag = Trueif qy_nm == qy_mate_nm:res_row = [qy_nm,qy_area,qy_code,qy_bs_scope,qy_tc_gpc,qy_mate_nm,100,1,Levenshtein.ratio(qy_nm, qy_tc_gpc) * 100]print(res_row)all_zbdc.append(res_row)flag = False if flag:zbdc_tup.append([qy_nm,qy_area,qy_code,qy_bs_scope,qy_tc_gpc,qy_mate_nm])df = pd.DataFrame(all_zbdc)df.to_excel('AllMate.xlsx', sheet_name='mate', index=False)#endregion

第三步:相似度排名打分

#region 第三步print(len(zbdc_tup))res = []for row in zbdc_tup:qy_nm,qy_area,qy_code,qy_bs_scope,qy_tc_gpc,qy_mate_nm = rowres_zbdc = []strreplace = qy_mate_nmfor qy_mate_gpc in ['有限公司','**省','科技','供应站','分公司','有限责任','有限','贸易','**','公司']:            strreplace = strreplace.replace(qy_mate_gpc,'')d_n =  intersection(strreplace, qy_tc_gpc)sim = max(Levenshtein.ratio(strreplace, d_n),Levenshtein.ratio(qy_tc_gpc, d_n))res_row = [qy_nm,qy_area,qy_code,qy_bs_scope,qy_tc_gpc,qy_mate_nm,strreplace,sim * 100]res_zbdc.append(res_row)res.append(get_top3(res_zbdc))df = pd.concat(res)df.to_excel('SimilarMate.xlsx', sheet_name='mate', index=False)#endregion

涉及到的自定义函数:

def intersection(string1, string2):return [cha for cha in string2 if cha in string1]def get_top3(datas:list):df = pd.DataFrame(datas,columns=["企业名称","区块","统一社会信用代码","经营范围","企业匹配结果名称","企业匹配结果名称剔除高频","名称相似度"])df = df.sort_values("名称相似度",ascending=False)df.index = range(1,len(df)+1)df = df[:3]df['相似度排名'] = df.indexall_sim = []for i in range(len(df)):row = df.iloc[i].to_list()all_sim.append(Levenshtein.ratio(row[0], row[3]) * 100)df['全名相似度'] = all_simprint(df)return df

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/38248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue2+百度地图web端开发

在Vue 2中开发百度地图Web端应用&#xff0c;你可以使用百度地图JavaScript API来实现地图功能。以下是一个简单的示例&#xff1a; 简单的示例&#xff1a; 首先&#xff0c;在你的Vue项目中安装vue-baidu-map插件&#xff1a; npm install vue-baidu-map --save在你的Vue组…

大数据Flink(五十九):Flink on Yarn的三种部署方式介绍以及注意

文章目录 Flink on Yarn的三种部署方式介绍以及注意 一、Pre-Job 模式部署作业

对任意类型数都可以排序的函数:qsort函数

之前我们学习过冒泡排序&#xff1a; int main() {int arr[] { 9,7,8,6,5,4,3,2,1,0 };int sz sizeof(arr)/sizeof(arr[0]);int i 0;for (i 0; i < sz-1; i) {int j 0;for (j 0; j < sz-1-i; j) {if (arr[j] > arr[j 1]){int temp 0;temp arr[j];arr[j] ar…

接口测试及接口抓包常用的测试工具

接口 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 接口测试的重要性 是节省时间前后端不…

七、dokcer-compose部署springboot的jar

1、准备 打包后包名为 ruoyi-admin.jar 增加接口 httpL//{ip}:{port}/common/test/han #环境变量预application.yml 中REDIS_HOSTt的值&#xff0c;去环境变量去找&#xff1b;如果找不到REDIS_HOST就用myredis 1、Dockerfile FROM hlw/java:8-jreRUN ln -sf /usr/share/z…

私密相册管家-加密码保护私人相册照片安全

App Store史上最安全、最强大、最卓越的私密相册App&#xff01;再也不用担心私密照片视频被别人看见了&#xff01;
私密相册为你提供多重密码保护机制、简单便捷的照片存储空间&#xff0c;完美地将你的私密照片远离一切恶意偷窥者的窥探&#xff01; 【产品功能】
 √ 支…

Redis—持久化

这里写目录标题 AOF三种写回策略写回策略的优缺点AOF 重写机制AOF后台重写AOF优缺点使用命令 RDBRDB 持久化的工作原理执行快照时&#xff0c;数据能被修改吗RDB 持久化的优点RDB 持久化的缺点 混合持久化大key对持久化的影响 AOF 保存写操作命令到日志的持久化方式&#xff0…

开源数据库Mysql_DBA运维实战 (DML/DQL语句)

DML/DQL DML INSERT 实现数据的 插入 实例&#xff1a; DELETE 实现数据的 删除 实例&#xff1a; UPDATE 实现数据的 更新 实例1&#xff1a; 实例2&#xff1a; 实例3&#xff1a; DQL DML/DQL DML语句 数据库操纵语言&#xff1a; 插入数据INSERT、删除数据DELE…

2023年即将推出的CSS特性对你影响大不大?

Google开发者大会每年都会提出有关于 Web UI 和 CSS 方面的新特性&#xff0c;今年又上新了许多新功能&#xff0c;今天就从中找出了影响最大的几个功能给大家介绍一下 :has :has() 可以通过检查父元素是否包含特定子元素或这些子元素是否处于特定状态来改变样式&#xff0c;也…

Python|OpenCV-绘制图形和添加文字的方法(2)

前言 本文是该专栏的第2篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 OpenCV作为一个强大的计算机视觉功能库,除了能解决图像处理和计算机视觉任务之外,它还有着非常丰富的图像绘制功能。可以说,不论是在计算机视觉任务中标记目标领域,还是在图像上绘制一些…

二刷LeetCode--155. 最小栈(C++版本),思维题

思路:本题需要使用两个栈,一个就是正常栈,执行出入操作,另一个栈只负责将对应的最小值进行保存即可.每次入栈的时候,最小值栈的栈顶也需要入栈元素,不过这个元素是最小值,那么就需要进行比较,因此在getmin()的时候只需要将最小值栈的栈顶元素弹出即可.初始化的时候只需要将最小…

【vue3】点击按钮弹出卡片,点击卡片中的取消按钮取消弹出的卡片(附代码)

实现思路&#xff1a; 在按钮上绑定一个点击事件&#xff0c;默认是true&#xff1b;在export default { }中注册变量给卡片标签用v-if判断是否要显示卡片&#xff0c;ture则显示&#xff1b;在卡片里面写好你想要展示的数据&#xff1b;给卡片添加一个取消按钮&#xff0c;绑…

JVM G1垃圾回收机制介绍

G1(Garbage First)收集器 (标记-整理算法)&#xff1a; Java堆并行收集器&#xff0c;G1收集器是JDK1.7提供的一个新收集器&#xff0c;G1收集器基于“标记-整理”算法实现&#xff0c;也就是说不会产生内存碎片。此外&#xff0c;G1收集器不同于之前的收集器的一个重要特点是&…

vue中 contenteditable 中如何将光标聚焦到最后位置

场景: 1. 在vue中, 又在for循环中, 给div元素配置contenteditable属性, 但是使用不了v-model绑定 2. 点击外部元素需要聚焦并将光标聚焦到最后位置 方案: 1. 使用vue-input-contenteditable第三方包, 可以使用v-model绑定, // 下载 yarn add vue-input-contenteditable…

每日一学——网络层

网络层是计算机网络体系结构中的一个关键层级。它负责将数据从源主机发送到目标主机&#xff0c;通过路由选择和路径管理实现在不同网络之间的数据传输。以下是网络层的详细资料&#xff0c;包括应用、案例和常见问题&#xff1a; 功能&#xff1a;网络层的主要功能是提供端到端…

[Poetize6] IncDec Sequence

题目描述 给定一个长度为 n 的数列 a_1,a_2,...,a_n&#xff0c;每次可以选择一个区间[l,r]&#xff0c;使这个区间内的数都加 1 或者都减 1。 请问至少需要多少次操作才能使数列中的所有数都一样&#xff0c;并求出在保证最少次数的前提下&#xff0c;最终得到的数列有多…

django部署到centos服务器上

具体的操作步骤 步骤一 更新系统和安装依赖&#xff0c; sudo yum update sudo yum install python3 python3-pip python3-devel git步骤二&#xff1a;创建并激活虚拟环境 在终端中执行以下命令&#xff1a; python3 -m venv myenv source myenv/bin/activate可以不创建虚拟…

Python 基础教程,Python 是什么?

Python 的诞生是极具戏曲性的&#xff0c;据 Guido 自述记载&#xff0c;Python 语言是在圣诞节期间为了打发无聊的时间而开发的&#xff0c;之所以会选择 Python 作为该编程语言的名字&#xff0c;是因为 Guido 是 Monty Python 戏剧团的忠实粉丝。 Python 语言是在 ABC 语言的…

深度学习的“前世今生”

1、“感知机”的诞生 20世纪50年代&#xff0c;人工智能派生出了这样两个学派&#xff0c;分别是“符号学派”及“连接学派”。前者的领军学者有Marvin Minsky及John McCarthy&#xff0c;后者则是由Frank Rosenblatt所领导。 符号学派的人相信对机器从头编程&#xff0c;一个…

JavaScript基础:学习JavaScript语言的基本语法和常用操作,了解网页交互的基本原理

JavaScript是一种广泛应用于网页开发中的脚本语言&#xff0c;它可以与HTML和CSS一起使用&#xff0c;实现网页交互及动态效果。 以下是JavaScript的基本语法和常用操作&#xff1a; 变量声明&#xff1a;使用var、let或const关键字声明变量。 var name "John";let …