如何在SAS中对列内相似字符串进行大规模分组识别
SAS实现大规模姓名字符串相似性分组方案
针对短文本(姓名)的大规模相似识别,核心原则是先剪枝缩小计算范围,再做精准相似度计算,避免全量数据两两比对带来的性能问题,具体实现步骤如下:
实现逻辑说明
- 初筛剪枝:用SAS内置的
SOUNDEX语音编码函数,给每个姓名生成发音匹配码,仅对同编码的姓名做后续比对,直接过滤掉发音差异过大的条目,把计算量压缩几个数量级 - 精准匹配:对初筛后的姓名对,用
COMPGED函数计算莱文斯坦编辑距离(两个字符串互相转换需要的最少增/删/改字符操作成本),设定阈值筛选高相似配对 - 结果整合:把高相似配对中的姓名去重输出,得到最终结果
可直接运行的代码
/* 1. 导入原始姓名数据 */ data raw_names; input Name $20.; datalines; John Smith John Smth Jane Lee Jane Line Timothy Brown Timmothy Brown Agnes James Aaron James ; run; /* 2. 给每个姓名加语音编码用于初筛 */ data name_w_code; set raw_names; s_code = soundex(Name); run; /* 3. 同编码范围内做两两配对,计算编辑距离 */ proc sql noprint; create table sim_pairs as select a.Name as name1, b.Name as name2, compged(a.Name, b.Name) as dist from name_w_code a join name_w_code b on a.s_code = b.s_code and a.Name < b.Name /* 排除自匹配、重复配对 */ ; quit; /* 4. 按阈值筛选高相似姓名,合并去重得到结果 */ proc sql noprint; create table high_sim_result as select name1 as Name from sim_pairs where dist <= 100 union select name2 as Name from sim_pairs where dist <= 100 order by Name ; quit;
结果说明
运行后high_sim_result表输出内容和预期完全一致:
Name ---- John Smith John Smth Timothy Brown Timmothy Brown
阈值说明:代码里设置的dist <=100对应仅允许1个字符的增/删/改误差,刚好匹配示例里的拼写错误场景。如果业务允许更大的误差范围,可以适当调大阈值;百万级以上数据可以额外增加「姓名长度差不超过2」的筛选条件进一步压缩计算量。示例中未被选中的两对姓名,要么发音编码差异大,要么编辑距离超过阈值,会被自动过滤。
内容的提问来源于stack exchange,提问作者user1490
相关产品推荐
相关产品推荐

