Matlab 實現對碼功能

2022-04-05 14:59:27 字數 4371 閱讀 9202

1、什麼叫對碼?

舉例說明,資料庫中有兩張表。

表 1:

編號 描述

11兒科門診

22**門診

33 產科門診

表 2:

編號 描述

111兒科門診

222**門診

333 產科門診

現在要在表 1 和表 2 之間找到一一對應。比如:

編號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

心血管兒科

993血液兒科

994新生兒科

995感染兒科

996**門診

997 產科門診

文字2:yy.txt

1008

生殖醫學中心ivf

1307

**化療

1036

**icu

1004

產科1303

**1302

婦產科門診

1030

婦產科教研室

1093 婦產科

matlab **如下:

[yycode,yydesc]=textread('

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 函式是計算兩個字串的相似度,用的是「最小編輯距離」。

levenshtein.m。該**來自網路:

function re=levenshtein(ch1,ch2)

n=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);

view code

生成的對碼檔案:his-yy.txt

990    普兒一區    1407

普兒一科

991 普兒二區 1048

普兒二科

992 心血管兒科 1405

心血管科

993 血液兒科 1046

新生兒科

994 新生兒科 1406

新生兒科

995 感染兒科 3046 感染管理科

3、matlab 處理流程

首先讀取兩個表的文字,並計算資料個數。

[yycode,yydesc]=textread('yy

.txt

','%s%s');

yylen=length(yycode);

[hiscode,hisdesc]=textread('

his.txt

','%s%s');

hislen=length(hiscode);

然後建立元胞陣列,並把第乙個檔案的值複製進去。注意元胞陣列的使用,這裡建立了 1 行 4 列的元胞陣列,每個元素又可以儲存任意個字串陣列,每個元素的型別跟上面的 yycode 和 yydesc 一樣。

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;

end

最後將 hisyy中的結果寫入檔案 his-yy.txt。

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 ...