スペクトルカーネル関数は、2つの文字列の間で同じnグラムを数えることによって文字列に対して作用します。たとえば、 'tool'には2つの2グラム( 'to'、 'oo'、 'ol')があり、 'tool'と 'fool'の類似度は2です( 'oo'と 'ol'は共通しています) )。MATLABでスペクトルカーネル関数を実装する方法は?
このメトリックを計算するMATLAB関数を作成するにはどうすればよいですか?
スペクトルカーネル関数は、2つの文字列の間で同じnグラムを数えることによって文字列に対して作用します。たとえば、 'tool'には2つの2グラム( 'to'、 'oo'、 'ol')があり、 'tool'と 'fool'の類似度は2です( 'oo'と 'ol'は共通しています) )。MATLABでスペクトルカーネル関数を実装する方法は?
このメトリックを計算するMATLAB関数を作成するにはどうすればよいですか?
最初の手順は、指定された文字列に対してnグラムを生成できる関数を作成することです。ベクトル化された方法でこれを行う方法の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
これは、最初の指定された文字列から一意のN長ストリングの各セットを選択する指標のマトリックスを作成する機能HANKELを使用します。このインデックス行列で指定された文字列を索引付けすると、行ごとに1つのN長の部分文字列を持つ文字配列が作成されます。関数CELLSTRは文字配列の各行をセル配列のセルに配置します。次に、関数UNIQUEは繰り返し部分文字列を削除し、関数ACCUMARRAYを使用して、各ユニークな部分文字列の出現をカウントします(何らかの理由でそれらが必要な場合)。
subStrings1 = n_gram('tool',2);
subStrings2 = n_gram('fool',2);
sharedStrings = intersect(subStrings1,subStrings2);
nShared = numel(sharedStrings);
何がハミング距離と呼ばれて探している、あなたが得ることができる:上記機能付き
あなたは、簡単にINTERSECT機能を使用して2つの文字列の間で共有のnグラムの数をカウントすることができますもしあなたが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'は6のうち3/6 = 0.5
実際の番号が必要な場合長さ(A)で行列全体を掛けるだけです。
これは、質問が説明しているようには聞こえません。 – gnovice
サポートベクトルマシンクラシファイアのために、他の目的のためにカーネル関数を作成することに興味があるように聞こえます。そのため、ハミング距離だけでは、入手可能な情報を十分に活用することはできません。 http://en.wikipedia.org/wiki/String_kernelここでソースリンクを見てください。幸運を祈る!私は同じことをしようとしています。 –