频谱核函数通过计算两个字符串之间相同的n元组数量来操作字符串。例如,'tool'有三个2元组('to','oo'和'ol'),而'tool'和'fool'之间的相似度为2(共有'oo'和'ol')。
我该如何编写一个MATLAB函数来计算这个度量值?
function [subStrings, counts] = n_gram(fullString, N)
if (N == 1)
[subStrings, ~, index] = unique(cellstr(fullString.')); %.'# Simple case
else
nString = numel(fullString);
index = hankel(1:(nString-N+1), (nString-N+1):nString);
[subStrings, ~, index] = unique(cellstr(fullString(index)));
end
counts = accumarray(index, 1);
end
有了上面的函数,您可以使用INTERSECT函数轻松地计算两个字符串之间共享的n-gram数量:
subStrings1 = n_gram('tool',2);
subStrings2 = n_gram('fool',2);
sharedStrings = intersect(subStrings1,subStrings2);
nShared = numel(sharedStrings);
doc pdist
,你可以得到更好的描述。A=['Marcin'; 'Martin'; 'Marsha'] %data
squareform(pdist(A, 'hamming')) returns
0 0.1667 0.5000
0.1667 0 0.5000
0.5000 0.5000 0
这个表单展示了有多少个字母是不同的。'Marcin'和'Martin'之间的差异是6个字母中的1个,所以你得到1/6=0.1667。'Marcin'与'Marsha'相比有6个字母中的3个不同,因此为3/6=0.5。
如果您想要实际不同字母的数量,只需将整个矩阵乘以A的长度即可。