我需要知道如何將非結構化數據映射到結構化數據。文本匹配 - 非結構化數據到結構化數據 - SAS或R
我有一個變量,包含客戶的地址,其中包括他們的城市。例如DELHI的城市名稱可以是「DELHI」,「DEHLI」,「DILLI」,「DELI」的形式,我需要從這些地址中檢測城市名稱並將其映射到正確的名稱「DELHI 」。
我想實現在SAS或R.
我需要知道如何將非結構化數據映射到結構化數據。文本匹配 - 非結構化數據到結構化數據 - SAS或R
我有一個變量,包含客戶的地址,其中包括他們的城市。例如DELHI的城市名稱可以是「DELHI」,「DEHLI」,「DILLI」,「DELI」的形式,我需要從這些地址中檢測城市名稱並將其映射到正確的名稱「DELHI 」。
我想實現在SAS或R.
在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;
我加一個空格前後的原始和新的字符串,以便它不會取代一個正確的字符串,它是一個字內(如美味路將改爲DELHICIOUS路)
如果你想嘗試自動化符合許多不正確的值修正值的過程中,你可以放在一起基於Hamming Distance或Levenshtein distance的東西,可能通過COMPGED function。您可以爲每個可能的匹配結構化值計算每個手動輸入行的分數,然後保留最低分數作爲最佳猜測。這可能不是100%準確的,但它應該比人類能做得更好。
我懷疑用自動化的方式完全編碼它是實際的,但我會建議採取兩步法。
首先,確定可能的匹配。您可以使用一些潛在的解決方案;這比StackOverflow解決方案複雜得多,但你已經有了一些建議,你可以看看互聯網上的文章,如this paper,它解釋了許多SAS函數和調用例程(COMPGED,SPEDIS,COMPLEV,COMPCOST,SOUNDEX , 比較)。
在相當寬泛的筆畫中使用這種方法 - 即,更傾向於誤報爲假陰性。只要把注意力集中在一對一的識別上;建立的的數據集,如
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語句);如果你的數據確實有這個問題發表評論,我會在稍後添加到解決方案。
我認爲你想把不正確的拼寫改成正確的拼寫? –