2009-07-27 18 views
3

スペクトルカーネル関数は、2つの文字列の間で同じnグラムを数えることによって文字列に対して作用します。たとえば、 'tool'には2つの2グラム( 'to'、 'oo'、 'ol')があり、 'tool'と 'fool'の類似度は2です( 'oo'と 'ol'は共通しています) )。MATLABでスペクトルカーネル関数を実装する方法は?

このメトリックを計算するMATLAB関数を作成するにはどうすればよいですか?

+1

サポートベクトルマシンクラシファイアのために、他の目的のためにカーネル関数を作成することに興味があるように聞こえます。そのため、ハミング距離だけでは、入手可能な情報を十分に活用することはできません。 http://en.wikipedia.org/wiki/String_kernelここでソースリンクを見てください。幸運を祈る!私は同じことをしようとしています。 –

答えて

2

最初の手順は、指定された文字列に対して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); 
+0

を追加する必要があります。subStrings = intersect(subStrings、subStrings);反復を避けるために関数n_gramに を追加してください。たとえば、n_gram( 'hubbub'、2)は、元の定式化で繰り返される 'ub'メンバーを持ちます。 – mtrw

+0

@mtrw:良い点ですが、UNIQUE関数がうまく機能します。私はそれに応じて更新します。 – gnovice

+0

Oof。ええ、ユニークはもう少し適切です。 – mtrw

-1

何がハミング距離と呼ばれて探している、あなたが得ることができる:上記機能付き

あなたは、簡単に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)で行列全体を掛けるだけです。

+0

これは、質問が説明しているようには聞こえません。 – gnovice

関連する問題