運行環境: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. 但是通過這種方式計算,其相似度效果不是很明顯,如下:
這裏需要注意的是:
那麼既然它不是計算語義相似度的,那麼它有什麼用呢?
比如,現在有很多數據,這些數據是地段的樓價。然後, 想知道某地段的樓價,但是這個地段的樓價並沒有在這些數據中,這個時候就可以根據周邊的樓價去匹配,得到類似的樓價。例如:現在想知道廣州天河車陂南的房價,那麼可以找到數據中包含車陂北街,車陂北街29號,車陂*等等這些地段的房價,然後求平均得到。