如何在MATLAB中实现频谱核函数?

时间:2009-07-27 20:54:52

标签: matlab n-gram

谱内核函数通过计算两个字符串之间相同的n-gram来对字符串进行操作。例如,'工具'有三个2克('到','oo'和'ol'),'工具'和'傻瓜'之间的相似性是2.('oo'和'ol'的共同点)。

如何编写可以计算此指标的MATLAB函数?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:-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'对''Marsha'有6个中的3个,所以3/6 = 0.5
如果您想要不同的实际字母数,只需将整个矩阵乘以长度(A)。