我想对 MATLAB 中的文本进行分层凝聚聚类。说,我有四句话,
I have a pen.
I have a paper.
I have a pencil.
I have a cat.
我想把上面四个句子聚类,看看哪个更相似。我知道统计工具箱有类似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 在 22 D(kk,jk)= levenshtein_distance(S1{kk},S2{jk}) 出现错误;
另外,为什么我要从第一个循环内的文件中读取事件?似乎不合逻辑。有点困惑,如果我能以这种方式工作,或者唯一的解决方案是在代码中输入所有字符串。非常感谢帮助。
更新
比较两个句子的代码:
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 存储了 Fire,我不会存储NY catches fire
。但是,对于第一种情况,我会存储为新信息。
LD 是否足以做到这一点?帮助表示赞赏。