相似重复记录是指数据库中存在这样的两条记录
R
1
R_{1}
R1和
R
2
R_{2}
R2,他们的内容相同或者相似,且都对应着同一个现实实体,则记录对
<
R
1
,
R
2
>
之所以会存在重复记录,是因为在进行数据获取或数据存储的过程中,相同数据产生了不同的表现形式,比如:同一个单词的拼写错误、印刷错误、字符格式不统一、字符缺失等。
SNM算法的设计思路如下:
本实验采用的数据是由第三方的数据生成器“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)