我需要知道如何将非结构化数据映射到结构化数据。
我有一个变量,其客户的地址包含他们的城市。例如DELHI的城市名称可以是“DELHI”,“DEHLI”“DILLI”,“DELI”的形式,我需要从这些地址中检测城市名称并将其映射到正确的名称“DELHI” ”
我正在尝试在SAS或R中实施解决方案。
答案 0 :(得分:2)
如果您想尝试自动执行将众多错误值与正确值匹配的过程,您可以根据Hamming Distance或Levenshtein distance汇总一些内容,也许可以通过COMPGED function。您可以为每个可能匹配的结构化值计算每个手动输入行的分数,然后将分数最低的分数作为最佳猜测。这可能不是100%准确,但它应该比人类做得更好。
答案 1 :(得分:2)
我怀疑以自动方式完全编码是否切合实际,但我建议采用两步法。
首先,确定可能的匹配。您可以使用许多潜在的解决方案;这比StackOverflow解决方案复杂得多,但你已经有了一些建议,你可以查看互联网上的论文,例如this paper,它解释了许多SAS功能和调用例程(COMPGED,SPEDIS,COMPLEV) ,COMPCOST,SOUNDEX,COMPARE)。
使用这种方法具有相当广泛的中风 - 即,优选假阳性假阴性。只需专注于一对一地识别单词;构建original, translation
的数据集,例如
Delli, Delhi
Deli, Delhi
Dalhi, Delhi
等
然后目视检查文件并根据需要进行更正(即删除误报)。
获得此数据集后,您可以使用一些选项来使用结果。如果您已将城市名称作为单独的字段,或者您可以将其放在单独的字段中或使用scan
轻松识别该城市,则可以使用格式解决方案。
data for_fmt;
set translations;
start=original;
label=translation;
fmtname='$CITYF';
*no hlo=o record as we want to preserve nonmatches as is;
run;
proc format cntlin=for_Fmt;
quit;
data want;
set have;
city_fixed=put(city,$CITYF.);
run;
如果您无法轻易识别地址中的城市(即您的地址字段类似于“10532 NELSON DRIVE DELHI”,没有逗号等),那么TRANWRD解决方案可能是最好的。您可以编写基于散列或基于数组的解决方案来实现它(而不是很多if语句);如果您的数据在评论后确实存在此问题,我稍后会添加到解决方案中。
答案 2 :(得分:0)
在SAS中,这可能不是最简单的方法,但如果您的城市名称在地址字符串中,则执行此操作的一种方法是使用TRANWRD
功能。这可以替换地址变量中的字符串。语法是:
tranwrd(variable, original_str, new_str);
例如使用您所在的城市DELHI:
data city;
input address $1-30;
datalines;
1 Ocean drive, DEHLI
2 Peak road, DELI
45 Buck street DILLI
;
run;
data change;
set city;
address = tranwrd(address,' DEHLI ',' DELHI ');
address = tranwrd(address,' DELI ',' DELHI ');
address = tranwrd(address,' DILLI ',' DELHI ');
run;
我在原始字符串和新字符串之前和之后放置了一个空格,这样它就不会替换单词中的正确字符串(例如,DELICIOUS Road将更改为DELHICIOUS Road)