gpt4 book ai didi

matlab - MATLAB 中的聚类文本

转载 作者:太空宇宙 更新时间:2023-11-03 20:22:47 27 4
gpt4 key购买 nike

我想在 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);

我得到的输出是:

Error using ==> linkage at 93 Size of Y not compatible with the output of the PDIST function.

Error in ==> Untitled2 at 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。

使用不同的字符串:

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 足以做到这一点吗?感谢帮助。

最佳答案

您需要的是一个可以处理字符串的距离函数。查看Levenshtein distance (编辑距离)。那里有很多实现:

或者,您应该提取一些有趣的特征(例如:元音的数量、字符串的长度等)来构建向量空间表示,然后您可以应用任何常用的距离度量(欧几里得,...)关于新的代表。


编辑

您的代码的问题是 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)

有关更多信息,请参阅相关函数的文档...

关于matlab - MATLAB 中的聚类文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3646169/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com