3

MATLAB でテキストに対して階層的凝集クラスタリングを実行したいと考えています。たとえば、私には 4 つの文があります。

I have a pen.
I have a paper. 
I have a pencil.
I have a cat. 

上記の 4 つの文をクラスター化して、どちらがより類似しているかを確認したいと思います。pdist統計ツールボックスには、ペアごとの距離を測定linkageしたり、クラスターの類似性を計算したりするなどのコマンドがあることを知っています。次のような単純なコード:

X=[1 2; 2 3; 1 4];
Y=pdist(X, 'euclidean');
Z=linkage(Y, 'single');
H=dendrogram(Z)

正常に動作し、デンドログラムを返します。

上記のように、これらのコマンドをテキストで使用できるのだろうか。何かご意見は ?


更新:

アムロに感謝。文字列間の距離を理解して計算しました。コードは次のとおりです。

clc
S1='I have a pen'; % first String

f_id=fopen('events.txt','r'); %saved strings to compare with
events=textscan(f_id, '%s', 'Delimiter', '\n');
fclose(f_id); %close file.
events=events{1}; % saving the text read.

ii=numel(events); % selects one text randomly.
% store the texts in a cell array

for kk=1:ii

   S2=events(kk);
   S2=cell2mat(S2);
   Z=levenshtein_distance(S1,S2);
   X(kk)=Z;

end 

文字列を入力すると、4 つの保存された文字列がありました。ここで、関数を使用してペアワイズ距離を計算しましたlevenshtein_distance。行列を返しますX=[ 17 0 16 18 16]

** これは私のペアごとの距離行列だと思います。pdist が行うことと同様です。それは...ですか ?

** 今、私は X を入力して次のようなリンケージを計算しようとしています

Z=linkage(X, 'single);

私が得ている出力は次のとおりです。

93 での ==> リンケージの使用エラー Y のサイズは PDIST 関数の出力と互換性がありません。

==> Untitled2 の 20 Z=linkage(X,'single') のエラー。

なんでそうなの ?連携機能は使えるの?助けていただければ幸いです。

更新 2

clc
S1='I have a pen';

f_id=fopen('events.txt','r');
events=textscan(f_id, '%s', 'Delimiter', '\n');
fclose(f_id); %close file.
events=events{1}; % saving the text read.

ii=numel(events)+1; % total number of strings in the comparison

D=zeros(ii, ii); % initialized distance matrix;
for kk=1:ii 

    S2=events(kk);

    %S2=cell2mat(S2);

    for jk=kk+1:ii

  D(kk,jk)= levenshtein_distance(S1{kk},S2{jk});

    end

end

D = D + D';       %'# symmetric distance matrix

%# linkage expects the output format to match that of pdist,
%# so we convert D to a row vector (lower/upper part of matrix)
D = squareform(D, 'tovector');

T = linkage(D, 'single');
dendrogram(T).

エラー: ???非セル配列オブジェクトからセルの内容を参照しています。==> Untitled2 at 22 D(kk,jk)= levenshtein_distance(S1{kk},S2{jk}); のエラー

また、最初のループ内のファイルからイベントを読み取るのはなぜですか? 論理的ではないようです。この方法で作業できる場合、またはコード内にすべての文字列を入力することが唯一の解決策である場合、少し混乱します。大変助かります。

アップデート

2 つの文を比較するコード:

clc
    str1 = 'Fire in NY';
    str2= 'Jeff is sick';

D=levenshtein_distance(str1,str2);
D = D + D';       %'# symmetric distance matrix

%# linkage expects the output format to match that of pdist,
%# so we convert D to a row vector (lower/upper part of matrix)

%D = squareform(D, 'tovector');

T = linkage(D, 'complete');
[H,P] = dendrogram(T,'colorthreshold','default');  

出力 D=18。

WITH 異なる文字列:

clc
str1 = 'Fire in NY';
str2= 'NY catches fire';

D=levenshtein_distance(str1,str2);
D = D + D';       %'# symmetric distance matrix

%# linkage expects the output format to match that of pdist,
%# so we convert D to a row vector (lower/upper part of matrix)

%D = squareform(D, 'tovector');

T = linkage(D, 'complete');
[H,P] = dendrogram(T,'colorthreshold','default'); 

D=28。

距離に基づいて、まったく異なる文が似ているように見えます。私がやろうとしているのは、ニューヨークに火を保存した場合、保存しませんNY catches fire。ただし、最初のケースでは、情報が新しいので保存します。

これを行うにはLDで十分ですか?助けていただければ幸いです。

4

1 に答える 1

5

必要なのは、文字列を処理できる距離関数です。レーベンシュタイン距離(編集距離)を確認してください。そこにはたくさんの実装があります:

または、いくつかの興味深い特徴(母音の数、文字列の長さなど)を抽出してベクトル空間表現を作成する必要があります。その後、通常の距離測度(ユークリッド、...)を新しいものに適用できます。表現。


編集

コードの問題は、LINKAGEが入力距離形式がPDISTの形式と一致することを期待していることです。つまり、1-vs-2、1-vs-3、2-vs-3などの順序の観測値のペアに対応する行ベクトルです。 ..これは基本的に完全な距離行列の下半分です(として対称であると想定されているためdist(1,2) == dist(2,1)

%# instances
str = {'I have a pen.'
    'I have a paper.'
    'I have a pencil.'
    'I have a cat.'};
numStr = numel(str);

%# create and fill upper half only of distance matrix
D = zeros(numStr,numStr);
for i=1:numStr
    for j=i+1:numStr
        D(i,j) = levenshtein_distance(str{i},str{j});
    end
end
D = D + D';       %'# symmetric distance matrix

%# linkage expects the output format to match that of pdist,
%# so we convert D to a row vector (lower/upper part of matrix)
D = squareform(D, 'tovector');

T = linkage(D, 'single');
dendrogram(T)

詳細については、問題の関数のドキュメントを参照してください...

于 2010-09-05T17:26:37.643 に答える