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で十分ですか?助けていただければ幸いです。