poster
2019-12-10, 20:48
我想在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) 正常工作并返回树状图。
我想知道我可以在上面提到的文本上使用这些命令吗?有什么想法吗 ?
更新:
感谢Amro。阅读理解并计算字符串之间的距离。代码如下:
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 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 at 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。
根据距离,一个完全不同的句子看起来很相似。我要尝试做的是,如果我将Fire存放在NY ,则不会存储NY catches fire 。但是,对于第一种情况,由于信息是新的,因此我将进行存储。
LD是否足以做到这一点?帮助表示赞赏。
回答:
您需要一个可以处理字符串的距离函数。找出Levenshtein距离 (http://en.wikipedia.org/wiki/Levenshtein_distance) (编辑距离)。有很多实现:
Wikibooks.org (http://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Levenshtein_distance#Octave_And_MATLAB)
FEX上的“字符串之间的距离计算” (http://www.mathworks.com/matlabcentral/fileexchange/17585-calculation-of-distance-between-strings)
另外,您应该提取一些有趣的特征(例如:元音的数量,字符串的长度等)来构建向量空间表示,然后可以在新的特征上应用任何常规的距离度量(欧几里得等)。表示。
编辑
您的代码的问题是LINKAGE (http://www.mathworks.com/help/toolbox/stats/linkage.html)期望输入距离格式与PDIST的 (http://www.mathworks.com/access/helpdesk/help/toolbox/stats/pdist.html)格式匹配,即与一对观测值相对应的行向量,其顺序为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) 请参阅有关功能的文档以获取更多信息...
更多&回答... (https://stackoverflow.com/questions/3646169)
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) 正常工作并返回树状图。
我想知道我可以在上面提到的文本上使用这些命令吗?有什么想法吗 ?
更新:
感谢Amro。阅读理解并计算字符串之间的距离。代码如下:
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 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 at 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。
根据距离,一个完全不同的句子看起来很相似。我要尝试做的是,如果我将Fire存放在NY ,则不会存储NY catches fire 。但是,对于第一种情况,由于信息是新的,因此我将进行存储。
LD是否足以做到这一点?帮助表示赞赏。
回答:
您需要一个可以处理字符串的距离函数。找出Levenshtein距离 (http://en.wikipedia.org/wiki/Levenshtein_distance) (编辑距离)。有很多实现:
Wikibooks.org (http://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Levenshtein_distance#Octave_And_MATLAB)
FEX上的“字符串之间的距离计算” (http://www.mathworks.com/matlabcentral/fileexchange/17585-calculation-of-distance-between-strings)
另外,您应该提取一些有趣的特征(例如:元音的数量,字符串的长度等)来构建向量空间表示,然后可以在新的特征上应用任何常规的距离度量(欧几里得等)。表示。
编辑
您的代码的问题是LINKAGE (http://www.mathworks.com/help/toolbox/stats/linkage.html)期望输入距离格式与PDIST的 (http://www.mathworks.com/access/helpdesk/help/toolbox/stats/pdist.html)格式匹配,即与一对观测值相对应的行向量,其顺序为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) 请参阅有关功能的文档以获取更多信息...
更多&回答... (https://stackoverflow.com/questions/3646169)