1、什麼叫對碼?
舉例說明,資料庫中有兩張表。
表 1:
編號 描述表 2:11兒科門診
22**門診
33 產科門診
編號 描述現在要在表 1 和表 2 之間找到一一對應。比如:111兒科門診
222**門診
333 產科門診
編號1 編號2這就是對碼。11111
22222
33333
是不是很簡單?只要 select 出兩個表中描述相同的編號就可以了。但如果兩個表的描述並不是那麼準確相等呢?譬如乙個是「產科」,乙個是「婦產科」,怎麼找到匹配呢?有人會說用 like '%產科%' 模糊匹配,用儲存過程也能實現,但你怎麼知道哪個表的描述內容少呢,該 like 哪個表字段呢?還有,如果乙個是「**」,乙個是「婦產科」呢?這個想當然地用 like 肯定是不行了。這個時候就要找個方法來計算兩個字串的相似度或者匹配度,選擇相似度最高的資料來做匹配。
對碼這種需求其實是很常見的。比如,現有執行的系統裡用的是表 1,現在上級部門要求你給它定期傳資料,而且要求科室編號用表 2,一般情況下不可能直接在自己執行良好的系統裡貿然用表 2 替換表 1,只有新建個表 1 和表 2 的對碼表,在提取的時候對錶 1 的編號做個替換。而且經常表 1 和表 2 的描述還不完全相同,這個對碼就是個問題。
對碼可以手工對,用自己的眼睛乙個乙個找,那麼當資料量很大時,這將是場災難。所以,正常點兒的工程師都會寫程式先實現初級的字串匹配,然後再人工檢查,糾正程式處理不了的錯誤。
本文介紹的就是如何利用字串相似度的知識來做這個對碼。
2、對碼,有很多方法可以實現。比如我相信一些對 sql 高手可以輕鬆用儲存過程實現。我這裡是先把表 1 和表 2 讀取到文字裡,然後用 matlab 讀取並做匹配,再將匹配結果寫入到新文字裡。當然,這個用 python、r 語言也可以輕鬆實現,很簡單。我這裡選擇 matlab 只是因為自己最近用得多點兒。
文字1:his.txt
992文字2:yy.txt心血管兒科
993血液兒科
994新生兒科
995感染兒科
996**門診
997 產科門診
1008matlab **如下:生殖醫學中心ivf
1307
**化療
1036
**icu
1004
產科1303
**1302
婦產科門診
1030
婦產科教研室
1093 婦產科
[yycode,yydesc]=textread('其中 levenshtein 函式是計算兩個字串的相似度,用的是「最小編輯距離」。yy.txt
','%s%s');
yylen=length(yycode);
[hiscode,hisdesc]=textread('
his.txt
','%s%s');
hislen=length(hiscode);
hisyy=cell(1,4
);hisyy=hiscode;
hisyy=hisdesc;
for i=1:1
:hislen
index=1
;simmax=0
;for j=1:1
:yylen
simvalue=levenshtein(hisdesc,yydesc);
if simvalue>simmax
simmax=simvalue;
index=j;
endend
hisyy=yycode;
hisyy=yydesc;
endfp = fopen('
his-yy.txt
','wt');
for i=1:1
:hislen
fprintf(fp,
'%s\t
',hisyy);
fprintf(fp,
'%s\t
',hisyy);
fprintf(fp,
'%s\t
',hisyy);
fprintf(fp,
'%s\n
',hisyy);
endfclose(fp);
levenshtein.m。該**來自網路:
function re=levenshtein(ch1,ch2)view coden=length(ch1);
m=length(ch2);
if n==0
ld=m;
end;
if m==0
ld=n;
end;
a=zeros(n+1,m+1
);for ii=1:n+1
a(ii,
1)=ii-1
;end;
for ii=1:m+1;a(
1,ii)=ii-1
;end;
for ii=2:m+1
for j=2:n+1
if ch2(ii-1)==ch1(j-1
)cost=0
;else cost=1
;end;
a=a(j-1,ii)+1
;b=a(j,ii-1)+1
;c=a(j-1,ii-1)+cost;
d=min(a,b);
a(j,ii)=min(c,d);
end;
end;
ld=a(n+1,m+1
);re = (max(n,m) - ld)/max(n,m);
生成的對碼檔案:his-yy.txt
990 普兒一區 14073、matlab 處理流程普兒一科
991 普兒二區 1048
普兒二科
992 心血管兒科 1405
心血管科
993 血液兒科 1046
新生兒科
994 新生兒科 1406
新生兒科
995 感染兒科 3046 感染管理科
首先讀取兩個表的文字,並計算資料個數。
[yycode,yydesc]=textread('yy然後建立元胞陣列,並把第乙個檔案的值複製進去。注意元胞陣列的使用,這裡建立了 1 行 4 列的元胞陣列,每個元素又可以儲存任意個字串陣列,每個元素的型別跟上面的 yycode 和 yydesc 一樣。.txt
','%s%s');
yylen=length(yycode);
[hiscode,hisdesc]=textread('
his.txt
','%s%s');
hislen=length(hiscode);
hisyy=cell(1,4接下來遍歷第乙個檔案中的每乙個描述,將該描述字串同第二個文字中的每乙個描述做匹配,計算相似度,最終取得相似度最高的存到元胞陣列的第三列和第四列。);hisyy=hiscode;
hisyy=hisdesc;
for i=1:1最後將 hisyy中的結果寫入檔案 his-yy.txt。:hislen
index=1
;simmax=0
;for j=1:1
:yylen
simvalue=levenshtein(hisdesc,yydesc);
if simvalue>simmax
simmax=simvalue;
index=j;
endend
hisyy=yycode;
hisyy=yydesc;
end
fp = fopen('his-yy.txt
','wt');
for i=1:1
:hislen
fprintf(fp,
'%s\t
',hisyy);
fprintf(fp,
'%s\t
',hisyy);
fprintf(fp,
'%s\t
',hisyy);
fprintf(fp,
'%s\n
',hisyy);
endfclose(fp);
Matlab實現imresize函式功能
根據放縮倍數,開闢乙個新矩陣存放放縮後的影象 利用雙線性插值公式,計算新影象中的每個點對映回原影象中的灰度值 注意邊界處理 function outputimg my imresize a,n a 是影象矩陣,n是放縮的倍數 返回值outputimg是乙個放縮後的影象矩陣 if n 0 error ...
驗證碼的功能實現
1.介面採用的js為extjs,在extjs的view中的login資料夾中,有乙個form.js,驗證碼部分的 是 xtype fieldcontainer layout hbox items listeners autoel 2.建立systemusercontroller 在這個control...
驗證碼功能js實現
onload createcode type text id input1 disabled type text id checkcode class code onclick createcode 看不清楚 span id button1 onclick validate type button ...