Сопоставление текста - неструктурированные данные со структурированными данными - в SAS или R
Мне нужно знать, как отобразить неструктурированные данные в структурированные данные.
У меня есть переменная с адресами клиентов, которая включает их города. Название города, например, DELHI, может иметь форму "DELHI", "DEHLI", "DILLI", "DELI", и мне нужно определить название города по этим адресам и сопоставить его с правильным названием "DELHI". ".
Я пытаюсь реализовать решение в SAS или R.
3 ответа
Я сомневаюсь, что практично полностью автоматизировать кодирование, но я бы предложил двухэтапный подход.
Сначала определите возможные совпадения. Вы можете использовать ряд потенциальных решений; это гораздо сложнее, чем решение Stackru, но у вас уже есть некоторые предложения, и вы можете посмотреть статьи в Интернете, например, эту статью, в которой объясняются многие функции 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); если ваши данные имеют эту проблему, оставьте комментарий, и я добавлю к решению позже.
Если вы хотите попытаться автоматизировать процесс сопоставления ваших многочисленных неправильных значений с правильными значениями, вы можете собрать что-то на основе расстояния Хэмминга или расстояния Левенштейна, возможно, с помощью функции COMPGED. Вы можете рассчитать оценку для каждой строки, введенной вручную, для каждого возможного совпадающего структурированного значения, а затем сохранить значение с наименьшей оценкой в качестве наилучшего предположения. Это, вероятно, не будет на 100% точным, но это должно сделать довольно хорошую работу намного быстрее, чем человек.
В 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)