我需要知道如何将非结构化数据映射到结构化数据。
我有一个变量,其中包含客户的地址,其中包括他们的城市。城市名称,例如 DELHI,可以是“DELHI”、“DEHLI”、“DILLI”、“DELI”的形式,我需要从这些地址中检测城市名称并将其映射到正确的名称“DELHI” ”。
我正在尝试在 SAS 或 R 中实施解决方案。
我需要知道如何将非结构化数据映射到结构化数据。
我有一个变量,其中包含客户的地址,其中包括他们的城市。城市名称,例如 DELHI,可以是“DELHI”、“DEHLI”、“DILLI”、“DELI”的形式,我需要从这些地址中检测城市名称并将其映射到正确的名称“DELHI” ”。
我正在尝试在 SAS 或 R 中实施解决方案。
如果您想尝试自动化将大量错误值与正确值匹配的过程,您可以根据Hamming Distance或Levenshtein distance组合一些东西,也许通过COMPGED 函数。您可以为每个可能匹配的结构化值计算每个手动输入行的分数,然后将分数最低的保留为您的最佳猜测。这可能不会 100% 准确,但它应该做得比人类快得多。
我怀疑以自动化方式完全编码是否可行,但我建议采用两步法。
首先,确定可能的匹配项。您可以使用许多潜在的解决方案;这比 StackOverflow 解决方案复杂得多,但是您已经有了一些建议,您可以查看 Internet 上的论文,例如解释许多 SAS 函数和调用例程(COMPGED、SPEDIS、COMPLEV、COMPCOST、 SOUNDEX,比较)。
以相当广泛的方式使用这种方法 - 即,更喜欢误报而不是误报。只需专注于一对一识别单词;建立一个数据集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 语句);如果您的数据确实存在此问题,请发表评论,稍后我将添加到解决方案中。
在 SAS 中,这可能不是最简单的方法,但如果您的城市名称在地址字符串中,那么执行此操作的一种方法是使用该TRANWRD
函数。这可以替换地址变量中的字符串。语法是:
tranwrd(variable, original_str, new_str);
例如使用您所在的城市德里:
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)