两个系统中的数据匹配方法

一、首先介绍几种常用的相似度计算
1.1最长公共子序列(LCS)
最长公共子序列(Longest Common Subsequence,简称LCS)是在两个或多个序列中寻找最长的公共子序列的问题。这里所说的“子序列”指的是原序列中元素的子集,但保持元素的原始顺序。

动态规划算法
最长公共子序列问题可以通过动态规划方法解决。以下是算法的步骤:

初始化:创建一个二维数组 dp,其大小为 (len(X) + 1) x (len(Y) + 1),其中 X 和 Y 是两个序列。数组的每个元素 dp[i][j] 表示序列 X[0…i-1] 和序列 Y[0…j-1] 的最长公共子序列的长度。

填充数组:按照以下规则填充数组:

如果 X[i-1] == Y[j-1],则 dp[i][j] = dp[i-1][j-1] + 1。
如果 X[i-1] != Y[j-1],则 dp[i][j] = max(dp[i-1][j], dp[i][j-1])。
结果:dp[len(X)][len(Y)] 就是两个序列的最长公共子序列的长度。

#---------------1 采用动态规划方法计算文本相似度------------------
## 最长公共子序列计算最长公共子串-------------------
def LCS(str_a, str_b):
	if len(str_a) == 0 or len(str_b) == 0:
		return 0
	dp = [0 for _ in range(len(str_b) + 1)]
	for i in range(1, len(str_a) + 1):
		left_up = 0
		dp[0] = 0
		for j in range(1, len(str_b) + 1):
			left = dp[j-1]
			up = dp[j]
			if str_a[i-1] == str_b[j-1]:
				dp[j] = left_up + 1
			else:
				dp[j] = max([left, up])
			left_up = up
	return dp[len(str_b)]

#转换最长公共子序列为0-1之间的数值,结果越接近1,相似度越大
def LCS_Score(str_a, str_b):
	return np.round(LCS(str_a, str_b)*2/(len(str_a)+len(str_b)),2)

#LCS_Score(str_a, str_b)    


## 对dataframe的2列按照最长公共子序列计算相似度
## df: 数据来源变量
## col_name1、col_name2:用于计算相似度的2个列名
## simarity_score_name: 返回的相似度结果的列名
## 返回数据框,则simarity_score_name是用该计算方法对2列文本相似度的计算结果
def df_simarity_lcs(df , col_name1 , col_name2 , simarity_score_name):
    df[simarity_score_name] = list(map(lambda str_a, str_b:LCS_Score(str_a, str_b),df[col_name1],df[col_name2]))
    return df

1.2 余弦相似度
余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。 向量,是多维空间中有方向的线段,如果两个向量的方向一致,即夹角接近零,那么这两个向量就相近。对于2个向量a和b,余弦相似度计算公式如下所示:
在这里插入图片描述
在这里插入图片描述

使用场景:对于待比较的字段都为数值型变量时,这一部分的相似度可通过该方式进行计算。

## vec1, vec2:待计算的向量
## 返回2个向量的相似度
def cosine_simi(vec1, vec2):
    from scipy import spatial
    return 1 - spatial.distance.cosine(vec1, vec2)

## 对dataframe的2列按照最长公共子序列计算相似度
## df: 数据来源变量
## col_name1、col_name2:用于计算相似度的2个列名
## simarity_score_name: 返回的相似度结果的列名
## 返回数据框,则simarity_score_name是用该计算方法对2列文本相似度的计算结果 
def df_simarity_cosine(df , col_name1 , col_name2 , simarity_score_name):
    df[simarity_score_name] = list(map(lambda str_a, str_b:cosine_simi(str_a, str_b),df[col_name1],df[col_name2]))
    return df

1.3 集合运算
在这里插入图片描述

## 采用集合的方法计算2个集合的相似度
def similarity(a, b):
    try:
        return np.round(len(a & b) / len(a | b),2)
    except ZeroDivisionError:
        return -1e-4

## 采用集合的方法计算一个数据框中2个列的文本相似度
## df: 数据来源变量
## col_name1、col_name2:用于计算相似度的2个列名
## simarity_score_name: 返回的相似度结果的列名
## 返回数据框,则simarity_score_name是用该计算方法对2列文本相似度的计算结果
#对dataframe的2列按照海明威计算相似度          
def df_simarity_jh(df , col_name1 , col_name2 , simarity_score_name):
    df[simarity_score_name] = list(map(lambda str_a, str_b:similarity(set(str_a), set(str_b)),df[col_name1],df[col_name2]))
    return df 

1.4汉明距离
表示两个相同长度的字符串在相同位置上不同字符的个数。用d(x,y)来表示x和y两个字符串的汉明距离。汉明距离可以用来计算两个文本之间的相似度,根据不同字符的个数来判断两个文本是否相似。对于2个变量X1、X2,他们之间的汉明距离如下式所示:

在这里插入图片描述

使用场景:对于2条记录的同一个字段如果是类别变量,常采用该算法进行计算,码值相同时相似度取值为1,码值不同时相似度取值为0。

## 计算汉明距离,相同时取值为1,不同时取值为0,用来计算类别变量之间的相似度
def hmw_dist(str_a, str_b):
    if  str_a == str_b:
        return 1
    else :
        return 0 
    
## 对dataframe的2列按照最长公共子序列计算相似度
## df: 数据来源变量
## col_name1、col_name2:用于计算相似度的2个列名
## simarity_score_name: 返回的相似度结果的列名
## 返回数据框,则simarity_score_name是用该计算方法对2列文本相似度的计算结果 
#对dataframe的2列按照海明威计算相似度   
def df_simarity_hmw(df , col_name1 , col_name2 , simarity_score_name):
    df[simarity_score_name] = list(map(lambda str_a, str_b:hmw_dist(str_a, str_b),df[col_name1],df[col_name2]))
    return df 

1.5 基于欧式距离的文本相似度计算
在这里插入图片描述

import numpy as np
def embedding_simi(vec1, vec2):
    from scipy import spatial
    return   1/(np.linalg.norm(feature_1 - feature_2) + 0.01)
## df: 数据来源变量
## col_name1、col_name2:用于计算相似度的2个列名
## simarity_score_name: 返回的相似度结果的列名
## 返回数据框,则simarity_score_name是用该计算方法对2列文本相似度的计算结果-------------------
def df_simarity_embedding(df , col_name1 , col_name2 , simarity_score_name):
    df[simarity_score_name] = list(map(lambda str_a, str_b:embedding_simi(set(str_a), set(str_b)),df[col_name1],df[col_name2]))
    return df 

二、来自两个不同系统的数据匹配
由于字段都不统一时,用2个系统的数据海量匹配会面临运算量大的问题,因此需要想办法提升运算效率,用key,value时会大幅度提升,下面是一段代码的示例:
首先:对某一个系统中某一个字段取定值时为例,比如以地市编码为区分:

dict_adcode_sx = adcode_sx[['adcode','dict']].set_index('adcode')['dict'].to_dict()
column_lst = ['cust_no', 'id' , 'semi_score']
recomand_index = pd.DataFrame(columns = column_lst)
inner_tmp = pd.DataFrame(columns = ['cust_no','cust_name_brief'])
outer_tmp = pd.DataFrame(columns = ['id','name_brief'])
## 循环地区编码,在同一个地区编码内进行内外部数据的比对
for tmp_dict in dict_adcode_sx.keys():
     # 提取内部数据的 cust_no 和 cust_name_brief 转换为dict
     inner_tmpx = inner_data[inner_data['dict_code'] == tmp_dict]
     inner_tmp = inner_tmpx[['cust_no','cust_name_brief']]
     inner_tmp_dict = inner_tmp.set_index('cust_no')['cust_name_brief'].to_dict()
     #dict_semi_result = semi_result.set_index('cust_no')['cust_name'].to_dict()
      # 提取外部数据的 id 和 name_brief 转换为dict
#     outer_tmpx = outer_data[outer_data['dict_code'] == tmp_dict]
      outer_tmp = outer_data[['id','name_brief']]
      outer_tmp_dict = outer_tmp.set_index('id')['name_brief'].to_dict()
      #semi_lst = []
      ## 大循环内部数的信息
      for cust_no , cust_name_brief in  inner_tmp_dict.items():
            semi = 0
            key_id = 0
            tmp_cust_no = cust_no
            # 小循环外部数据的信息
            for key, value in outer_tmp_dict .items():
                #semi_r = LCS_Score(cust_name_brief, value)
                semi_r = similarity(set(cust_name_brief), set(value))
                if semi_r > semi:
                    key_id = key
                    semi = semi_r
            ## 给内部数据推荐名称相似度最大的外部数据 
            tmp_df = pd.DataFrame({'cust_no': [tmp_cust_no],
                                   'id': [key_id],
                                   'semi_score': [semi]
                                 })
            recomand_index = recomand_index.append(tmp_df)    
            recomand_index = recomand_index[recomand_index['semi_score'] > 0.88]
        # 拎出来其他的字段
    recomand_result = pd.merge( pd.merge(recomand_index , 
                                inner_data[['cust_no' , 'cust_name' , 'cert_number','ec_addr','cust_name_brief']]
                                ), 
                      outer_data[['id','name', 'credit_code' , 'reg_location','name_brief']])
    recomand_result_unique = recomand_result.drop_duplicates(subset=['cust_no','id'], keep='last')  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

暗区突围资格 暗区突围测试资格 暗区突围资格申请

《暗区突围》作为一款备受瞩目的战术射击手游,以其独特的撤离玩法、高度拟真的枪战体验以及丰富的装备搜集系统,在玩家群体中迅速积累了极高的人气。游戏设定在一个充满未知与危险的封闭区域,玩家需要凭借智慧、策略与精湛的操作,…

使用./build.sh编译ORB_SLAM源码时出现报错:/usr/bin/ld:找不到 -lboost_serialization的解决办法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、/usr/bin/ld:找不到 -lboost_serialization1.问题描述2.解决(1). 下载源码(2) . 编译安装 一、/usr/bin/ld:找不到 -lboost_serialization 1.问题描述 在安装…

DPDK e1000 ring buffer

基本原理 如图(盗图) 内存(RAM)和网卡(NIC)之间通过Descriptor ring 交互网络报文数据内存中需要申请内存 packet buffer 的内存池,内存池中的每个实例,地址是物理连续的或者IOVA…

day3_prefixSum

一、前缀和技巧 重点 前缀和技巧适用于快速、频繁地计算一个索引区间内的元素之和 个人理解;预计算,空间换时间 1.(一维数组的前缀和)303区域和检索-数组不可变 获取闭区间值 [left,right] -> preSum[right 1] - preSum[left],其中preSum[right…

泵站远程启停

随着物联网技术的迅猛发展,传统泵站的管理方式正面临前所未有的变革。在这一变革的浪潮中,HiWoo Cloud平台凭借其卓越的技术实力和创新理念,为泵站远程启停控制带来了全新的解决方案。本文将详细介绍HiWoo Cloud平台在泵站远程启停方面的应用…

基于Python的飞机大战游戏

学习目标 了解 飞机大战游戏的规则 理解 面向对象思想,会独立设计游戏的类与模块 掌握 pygame模块的使用 1.1 游戏介绍 飞机大战是一款由腾讯公司微信团队推出的软件内置的小游戏,这款游戏画面简洁有趣,规则简单易懂,操作简便易上手,在移动应用兴起之初曾风靡一时。 1.1.…

Navicat导出表结构到Excel或Word

文章目录 sql语句复制到excel复制到Word sql语句 SELECTcols.COLUMN_NAME AS 字段,cols.COLUMN_TYPE AS 数据类型,IF(pks.CONSTRAINT_TYPE PRIMARY KEY, YES, NO) AS 是否为主键,IF(idxs.INDEX_NAME IS NOT NULL, YES, NO) AS 是否为索引,cols.IS_NULLABLE AS 是否为空,cols.…

Lombok介绍、使用方法和安装

目录 1 Lombok背景介绍 2 Lombok使用方法 2.1 Data 2.2 Getter/Setter 2.3 NonNull 2.4 Cleanup 2.5 EqualsAndHashCode 2.6 ToString 2.7 NoArgsConstructor, RequiredArgsConstructor and AllArgsConstructor 3 Lombok工作原理分析 4. Lombok的优缺点 5. 总结 1 …

Go实现树莓派读取at24c02 eeprom读写数据

步骤 启用i2c 参考 Go实现树莓派读取bh1750光照强度 代码 package mainimport ("fmt""periph.io/x/conn/v3/i2c" )type AT24C02Device struct {dev *i2c.Dev }func NewAT24C02Device(addr uint16, bus i2c.BusCloser) (*AT24C02Device, error) {var (d…

wordpress主题 7B2 PRO主题5.4.2免授权直接安装

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 WordPress 资讯、资源、社交、商城、圈子、导航等多功能商用主题:B2 PRO 其设计风格专业且时尚,功能十分强大,包括多栏布局、自定义页面、强大的主…

03c++重载运算符

1、深入理解new和delete原理 #include<iostream> using namespace std;/* new 和 delete 1、malloc和new的区别 new 内存开辟构造函数 2、free和 delete的区别 delete 内存回收析构函数 开辟失败malloc返nullptr ,new抛出bad_alloc异常new->operator new delete -&…

AppBuilder低代码体验:构建雅思大作文组件

AppBuilder低代码体验&#xff1a;构建雅思大作文组件 ​ 在4月14日&#xff0c;AppBuilder赢来了一次大更新&#xff0c;具体更新内容见&#xff1a;AppBuilder 2024.04.14发版上线公告 。本次更新最大的亮点就是**新增了工作流&#xff0c;低代码制作组件。**具体包括&#x…

JavaEE初阶-多线程4

文章目录 一、单例模式1.1 饿汉模式1.2 懒汉模式 二、阻塞队列1.1 生产者消费者模型1.1.1 现实生活举例1.1.2 生产者消费模型的两个优势1.1.2.1 解耦合1.1.2.2 削峰填谷 1.2 阻塞队列代码1.2.1 使用java标准库的阻塞队列实现生产者消费者模型1.2.2 实现自己的阻塞队列 一、单例…

【Go语言初探】(一)、Linux开发环境建立

一、操作系统选择 选择在Windows 11主机上运行的CentOS 7 Linux 虚拟机&#xff0c;虚拟化平台为VMWare Workstation. 二、安装Go语言环境 访问Go语言官网&#xff0c;选择Linux版本下载&#xff1a; 解压&#xff1a; tar -xvf go1.22.3.linux-amd64.tar.gz检验安装结果&…

uniapp + vue3 使用axios

场景 uniapp自带的uni.request不太好用&#xff0c;也有可能是自己用axios用的太熟悉了&#xff0c;所以还是用axios趁手点&#xff0c;所以尝试在uniapp中使用axios。 操作 因为uniapp项目没有package.json&#xff0c;所以先在项目根目录下执行 npm init, 执行完毕后直接…

算法设计与分析 例题解答 解空间与搜索

1.请画出用回溯法解n3的0-1背包问题的解空间树和当三个物品的重量为{20, 15, 10}&#xff0c;价值为{20, 30, 25}&#xff0c;背包容量为25时搜索空间树。 答&#xff1a; 解空间树&#xff1a; 搜索空间树&#xff1a; 2. 考虑用分支限界解0-1背包问题 给定n种物品和一背包…

线路和绕组中的波过程(三)

本篇为本科课程《高电压工程基础》的笔记。 本篇为这一单元的第三篇笔记。上一篇传送门。 冲击电晕对线路上波过程的影响 实际中的导线存在电阻&#xff0c;而且还有对地电导&#xff0c;会消耗一部分能量。但是因为雷击所涉及的传输距离很短&#xff0c;所以几乎可以忽略这…

JS代码随想录(一):数组

代码随想录 一、数组理论基础 二、LeetCode 704. 二分查找 三、LeetCode 27. 移除元素 四、LeetCode 977.有序数组的平方 五、LeetCode 209.长度最小的子数组 六、LeetCode 59.螺旋矩阵II 七、数组总结 一、数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 数组…

你真的会用 ChatGPT 吗?来看看这 4 个模式,让你的 AI 技能更上一层楼!(上)

一年半已经过去&#xff0c;ChatGPT 虽然风靡一时&#xff0c;但真正发挥其超过 30% 效能的人却寥寥无几。许多资深用户依然沿用传统的人机交互方式&#xff0c;认为只需要事无巨细地编写指令&#xff0c;让 AI 服从即可。大多数人并不了解这些生成式 AI 的某些不为人之的特性&…

第四百九十八回

文章目录 1. 概念介绍2. 使用方法2.1 固定样式2.2 自定义样式 3. 示例代码4. 内容总结 我们在上一章回中介绍了"GetMaterialApp组件"相关的内容&#xff0c;本章回中将介绍使用get显示SnackBar.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在介…