You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 09:36:24