スペクトルカーネル関数は、2つの文字列の間の同じn-gramをカウントすることにより、文字列を操作します。たとえば、「tool」には3つの2グラム(「to」、「oo」、および「ol」)があり、「tool」と「fool」の類似性は2です(「oo」と「ol」は共通です) )。
このメトリックを計算できるMATLAB関数を作成するにはどうすればよいですか?
最初のステップは、特定の文字列に対してn-gramを生成できる関数を作成することです。ベクトル化された方法でこれを行う1つの方法は、いくつかの巧妙な索引付けを使用することです。
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長の部分文字列の各セットを選択するインデックスの行列を作成します。このインデックスマトリックスを使用して特定の文字列にインデックスを付けると、行ごとに1つのN長のサブストリングを持つ文字配列が作成されます。次に、関数CELLSTRは、文字配列の各行をセル配列のセルに配置します。次に、関数UNIQUEは繰り返される部分文字列を削除し、関数ACCUMARRAYを使用して、一意の各部分文字列の出現回数をカウントします(何らかの理由で必要な場合)。
上記の関数を使用すると、 INTERSECT関数を使用して2つの文字列間で共有される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です。異なる場合は、行列全体にlength(A)を掛けるだけです。