文本匹配 - 非结构化数据到结构化数据 - 在SAS或R中

时间:2013-12-19 05:35:57

标签: r mapping sas extract textmatching

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

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

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

3 个答案:

答案 0 :(得分:2)

如果您想尝试自动执行将众多错误值与正确值匹配的过程,您可以根据Hamming DistanceLevenshtein 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)