频谱核函数通过计算两个字符串之间的相同 n-gram 对字符串进行操作。比如'tool'有3个2-gram('to'、'oo'和'ol'),'tool'和'fool'的相似度是2。('oo'和'ol'的共同点)。
如何编写一个可以计算该指标的 MATLAB 函数?
第一步是创建一个可以为给定字符串生成 n-gram 的函数。以矢量化方式执行此操作的一种方法是使用一些巧妙的索引。
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
这使用函数HANKEL首先创建一个索引矩阵,该矩阵将从给定字符串中选择每组唯一的 N 长度子字符串。用这个索引矩阵索引给定的字符串将创建一个字符数组,每行有一个 N 长度的子字符串。然后,函数CELLSTR将字符数组的每一行放入元胞数组的一个元胞中。然后函数UNIQUE删除重复的子字符串,函数ACCUMARRAY用于计算每个唯一子字符串的出现次数(如果出于任何原因需要它们)。
使用上述函数,您可以使用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' vs 'Marsha' 有 3 个,共 6 个,所以 3/6=0.5
如果你想要实际的字母数这是不同的,只需将整个矩阵乘以长度(A)。