3

频谱核函数通过计算两个字符串之间的相同 n-gram 对字符串进行操作。比如'tool'有3个2-gram('to'、'oo'和'ol'),'tool'和'fool'的相似度是2。('oo'和'ol'的共同点)。

如何编写一个可以计算该指标的 MATLAB 函数?

4

2 回答 2

2

第一步是创建一个可以为给定字符串生成 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);
于 2009-07-27T22:31:32.960 回答
-1

您正在寻找的东西称为汉明距离,如果您这样做,您可以获得更好的描述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)。

于 2009-08-05T04:22:24.597 回答