1

我需要知道如何将非结构化数据映射到结构化数据。

我有一个变量,其中包含客户的地址,其中包括他们的城市。城市名称,例如 DELHI,可以是“DELHI”、“DEHLI”、“DILLI”、“DELI”的形式,我需要从这些地址中检测城市名称并将其映射到正确的名称“DELHI” ”。

我正在尝试在 SAS 或 R 中实施解决方案。

4

3 回答 3

2

如果您想尝试自动化将大量错误值与正确值匹配的过程,您可以根据Hamming DistanceLevenshtein distance组合一些东西,也许通过COMPGED 函数。您可以为每个可能匹配的结构化值计算每个手动输入行的分数,然后将分数最低的保留为您的最佳猜测。这可能不会 100% 准确,但它应该做得比人类快得多。

于 2013-12-19T11:16:05.250 回答
2

我怀疑以自动化方式完全编码是否可行,但我建议采用两步法。

首先,确定可能的匹配项。您可以使用许多潜在的解决方案;这比 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 语句);如果您的数据确实存在此问题,请发表评论,稍后我将添加到解决方案中。

于 2013-12-19T15:03:54.003 回答
0

在 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)

于 2013-12-19T06:44:45.907 回答