如何在MATLAB中执行频谱内核函数?(How to implement a spectrum ke

2019-06-26 22:57发布

频谱核函数对字符串由两个字符串之间的计数相同的n-gram进行操作。 例如,“工具”具有三个2克(“到”,“OO”,和“醇”),和“工具”和“傻瓜”之间的相似性为2(“OO”和在共同“醇” )。

我怎么能写一个MATLAB函数,可以计算该指标?

Answer 1:

第一步骤是,以创建可以产生n克对于给定的字符串的功能。 在量化的方式来做到这一点的方法之一是用一些巧妙的索引。

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用于计数每个唯一字符串的出现次数(如果需要它们由于任何原因)。

利用上述功能,可以很容易地再计数的使用两个串之间共享的n-gram的数目INTERSECT功能:

subStrings1 = n_gram('tool',2);
subStrings2 = n_gram('fool',2);
sharedStrings = intersect(subStrings1,subStrings2);
nShared = numel(sharedStrings);


Answer 2:

您要查找的是所谓的汉明距离,你可以,如果你得到的是一个更好的描述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

这种形式显示了许多信件是如何不同。 “马辛”和“马丁”之间的区别是1出的6个字母,让您得到1/6 = 0.1667“马辛” VS“玛莎”有3个6,所以3/6 = 0.5
如果你想要的是不同的字母的实际数目,只是乘以长度(A)整个矩阵。



文章来源: How to implement a spectrum kernel function in MATLAB?
标签: matlab n-gram