Matlab計算字符串相似度

運行環境:Matlab

單純的計算字符串的相似度,並沒有計算詞性,如TF-IDF之類的;代碼如下:

%計算字符串相似度
%一個source字符串通過插入、刪除、替換而變成target字符串的操作次數越少,則兩個字符串越相近。
function strsim = mystrsim(target,source)  %X爲字符串
len1=length(source);
len2=length(target);
d=zeros(len1+1,len2+1);
    for i=2:length(source)+1
        d(i,1)= i;
    end
     for j=2:length(target)+1
         d(1,j)= j;
     end
     for i =2:length(source)+1
        for j = 2:length(target)+1
             if source(i - 1) == target(j - 1)
               d(i,j) = d(i-1,j-1); %不需要編輯操作
             else
                 edIns = d(i,j-1)+1;    %source 插入字符
                 edDel = d(i-1,j)+1;    %source 刪除字符
                 edRep = d(i-1,j-1)+1;  %source 替換字符
                 d(i,j)= min(min(edIns, edDel),edRep);
             end
        end
     end
        y=d(length(source)+1,length(target)+1);  %最少操作次數
        strsim=1/(y+1);    %相似度
end
        


實例:

1. 計算中文字符串相似度:


2. 計算英文字符串相似度:


3. 但是通過這種方式計算,其相似度效果不是很明顯,如下:



這裏需要注意的是:

 y是操作次數,1/(1+y)就是簡易版的相似度,如果讀者覺得這樣的相似度表意不清楚的話,可以自己選擇變換函數,比如log或1/(exp()+a)之類的函數平滑下。 
這裏簡易版的相似度,讀者可以設置閾值如0.3,基本就可以了。


那麼既然它不是計算語義相似度的,那麼它有什麼用呢?

比如,現在有很多數據,這些數據是地段的樓價。然後, 想知道某地段的樓價,但是這個地段的樓價並沒有在這些數據中,這個時候就可以根據周邊的樓價去匹配,得到類似的樓價。例如:現在想知道廣州天河車陂南的房價,那麼可以找到數據中包含車陂北街,車陂北街29號,車陂*等等這些地段的房價,然後求平均得到。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章