我想在MATLAB中对文本进行层次聚集聚类我有四句话,
I have a pen.
I have a paper.
I have a pencil.
I have a cat.
我想把上面四个句子归类,看看哪个更相似我知道Statistic toolbox有类似于
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的链接时出错
与的输出不兼容
PDIST函数。
20时的错误==>未标题2
Z=连杆(X,“单个”)。
为什么完全可以使用链接功能吗感谢帮助。
更新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).
错误:??? 来自非单元格数组对象的单元格内容引用。
22时的错误==>未标题2
D(kk,jk)=levenshtein_距离(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。
使用不同的字符串:
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
不过,对于第一种情况,我会存储为新的信息。身份证足够吗感谢帮助。
最佳答案
你需要的是一个能处理字符串的距离函数查看Levenshtein distance(编辑距离)有很多实现:
Wikibooks.org
"Calculation of distance between strings" on FEX
或者,您应该提取一些有趣的特征(例如:元音的数量、字符串的长度等)来构建向量空间表示,然后您可以对新表示应用任何常用的距离度量(欧几里德,…)。
编辑
代码的问题是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)
有关更多信息,请参阅有关功能的文档。。。