数据清洗:相似重复记录检测算法SNM及其Python实现

1. 相似重复记录删除

  相似重复记录是指数据库中存在这样的两条记录 R 1 R_{1} R1 R 2 R_{2} R2,他们的内容相同或者相似,且都对应着同一个现实实体,则记录对 < R 1 , R 2 > <R_{1},R_{2}> <R1,R2>互为相似重复记录。实际数据库中可能存在多对互为相似重复的记录,它们的存在降低了数据的质量,可能会妨碍系统的正常运行,甚至会影响企业信息管理系统决策的正确性。

  之所以会存在重复记录,是因为在进行数据获取或数据存储的过程中,相同数据产生了不同的表现形式,比如:同一个单词的拼写错误、印刷错误、字符格式不统一、字符缺失等。

2. SNM(近邻排序算法)

  SNM算法的设计思路如下:

  • 首先,根据所在领域的专家知识经验,指定数据集排序时所使用的关键字的生成方式;
  • 其次,遍历数据集,对每一条记录生成的排序非关键字,然后按照记录的排序关键字对记录进行排序,根据相似记录对应的关键字内容也相似的原理,不同的重复记录在排序完成后理论上会处于邻近的位置;
  • 重复记录检测及合并: 为数据集设定一个大小可以滑动的窗口。将最后一个滑入窗口的记录数据与窗口内的其他记录数据进行比较,判定两条记录是否完全相同。如果相同则将两条记录判定为相似重复记录,并将这两条记录进行合并;如果不同,就将窗口向后滑动。滑动窗口内的记录是采用先进先出的方式进行组织,比较后的数据则滑向下一条记录的位置,再进行新的检测。

3. Python实现

  本实验采用的数据是由第三方的数据生成器“febrl"生成的,”febrl"生成的数据的来源是澳大利亚某卫生部门的数据库。

import pandas as pd
import numpy as np

data=pd.read_csv(r'C:/Users/sunta/Downloads/febrl-master/data/dedup-dsgen/dataset_A_10000.csv')

def edit_distance_similarity(word1,word2):
    len1,len2=len(word1),len(word2)
    dp=np.zeros((len1+1,len2+1))
    dp[0]=range(len2+1)
    dp[:,0]=range(len1+1)
    
    for i in range(1,len1+1):
        for j in range(1,len2+1):
            delta=0 if word1[i-1]==word2[j-1] else 1
            dp[i,j]=min(dp[i-1,j-1]+delta,dp[i-1,j]+1,dp[i,j-1]+1)
        
    similarity=1-dp[len1,len2]/max(len1,len2)
    return similarity

def detect_similarity(col1,col2):    
    similarity=[edit_distance_similarity(str(col1[idx]),str(col2[idx])) for idx in col1.index]
    return sum(similarity)/len(similarity)
    
#排序
data_sorted=data.sort_values(by='soc_sec_id')
threshold=4 #窗口大小
label=[]
for i in range(data_sorted.shape[0]):
    start=0 if i<threshold else i-threshold+1
    end=i+1
    tmp=data_sorted.iloc[start:end,:]
    if tmp.shape[0]==1:
        label.append(1)
    else:
        tmp_old=tmp.iloc[:-1,:]
        tmp_new=tmp.iloc[-1,:]
        tmp_old=tmp_old.apply(detect_similarity,axis=1,args=(tmp_new,))
        label.append(1 if tmp_old.max()>0.9 else 0)   

参考文献

  1. 《面向重复记录检测的数据清洗算法的研究》
  2. 《相似重复记录的数据清洗技术的研究_王开祥》
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值