找回密码
 注册
关于网站域名变更的通知
查看: 613|回复: 1
打印 上一主题 下一主题

基于WMD(词移距离)的句子相似度分析MATLAB代码

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-10-19 15:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
; S; y$ S5 _  D- X9 y
文章目录
+ L+ }( @+ l3 f, ?; ~" O" j
  • WMD简介
  • WMD MATLAB代码
  • RWMD(Relaxed word moving distance )
  • RWMD MATLAB代码
  • 上述两个代码的distance函数
  • 数据集来源
  • 结果
  • 分析
  • 参考资料
    1 o5 T' e. n* M- s+ F; N' F' a$ K

9 y5 }1 h* C7 Y8 u) b; ~WMD简介
# N7 h7 s5 ~% c( V8 C词移距离(Word Mover’s Distance)
+ C" ~4 z5 T7 S9 s" n
9 ?* J  g; i5 @
  g8 V% t. v. O- W5 W5 o" U3 r- C2 g% Y* Q

5 X3 ], D" z! k% L  O) T. W$ f, gWMD MATLAB代码$ U* @9 {/ g9 L& t/ m9 T
注意emd_mex是调用搬土距离的库Earth Mover’s Distance6 p# r; R5 o9 g4 G9 R# C
- W6 K# a/ p3 C! I6 n. S/ R
  • %徐奕 E21614061
  • clc
  • clear
  • tic;
  • load_file = 'bbcsport.mat'; % 数据集为bbcsport
  • save_file = 'wmd_d_bbcsport.mat';
  • %X每个单元对应一个文档,是一个[d,u]矩阵,
  • %其中d是嵌入单词的维数bbcsport中的是300,u是该文档中Unique单词的数量
  • %每一列是特定单词的word2vec向量。
  • %Y是文档的标签
  • %BOW_X单元阵列中的每个单元格都是与文档对应的向量。
  • %向量的大小是文档中Unique单词的数量,每个条目是每个Unique单词出现的频率。
  • %indices 每个单元格对应于一个文档,它本身就是一个{1,u}单元格,其中每个条目是对应于每个Unique单词的实际单词
  • %TR每一行对应于训练集的随机分割,每个条目是相对于完整数据集的索引。
  • load(load_file)
  • docNum = length(BOW_X); %文档的数量
  • WMD = zeros(docNum,docNum);
  • paRFor i = 1:docNum %并行运行
  •     E_distance = zeros(1,docNum); %用来存放当前文档与其他文档的距离
  •     for j = (i+1):docNum
  •         if isempty(BOW_X{i}) || isempty(BOW_X{j})
  •             E_distance(j) = Inf;  % 错误处理
  •         else
  •         x1 = BOW_X{i}./sum(BOW_X{i}); %归一化
  •         x2 = BOW_X{j}./sum(BOW_X{j}); %归一化
  •         %%% 求欧式距离
  •         D = distance(X{i}, X{j}); %计算两个文档间的距离(计算X{i}和{j}中的任意列向量之间的两两平方距离矩阵)
  •         D(D < 0) = 0; %设置下限
  •         D = sqrt(D);  %开方
  •         [emd,flow]=emd_mex(x1,x2,D); %调用搬土距离的库Earth Mover's Distance,求WMD
  •         E_distance(j) = emd;
  •         end
  •     end
  •     WMD(i,:) = E_distance; %存放到外部变量
  • end
  • %% 根据距离矩阵计算相似度,使用归一化
  • similarVar = -WMD;
  • maxs = max(similarVar);
  • mins = min(similarVar);
  • for i = 1:size(WMD,1)
  •     for j = 1:length(WMD(i,:))
  •         similarVar(i,j) = (similarVar(i,j)-mins)/(maxs-mins);
  •     end
  • end
  • toc
  • %% 保存数据与文件
  • save('wmd_sim',similarVar);
  • save(save_file,'WMD');$ d; V" P- b, W4 \. V  p
               
0 J: N- I3 f3 v* \* Y5 X
9 }3 y. \! `9 p8 mRWMD(Relaxed word moving distance ), {7 i# k/ r) s' j* J/ f
先去掉一个约束,计算相应的WMD,最终取最大值。
# E/ \/ B# i9 H/ N# d$ M
! e( Z' \! L% T5 ]这两个 relax 过的优化问题的解,恰好对应于词向量矩阵的行空间和列空间上的最近邻问题,也是很好算的。最后定义 RWMD 为这两个 relaxed 优化问题的两个目标值中的最大值。9 a; k& F' g# h. }+ u

4 P' c# [6 ^$ W+ W% t5 W' k0 yRWMD MATLAB代码
/ U0 |2 r# j$ _本代码不需要任何外部包
1 E! Z' u, R3 G2 o# v" N3 M
6 G6 e" ~) S; T1 m  W" k
  • %徐奕 E21614061
  • clc
  • clear
  • tic;
  • addpath('emd')
  • load_file = 'bbcsport.mat'; % 数据集为bbcsport
  • save_file = 'rwmd_bbcsport.mat';
  • load(load_file)
  • %X每个单元对应一个文档,是一个[d,u]矩阵,
  • %其中d是嵌入单词的维数bbcsport中的是300,u是该文档中Unique单词的数量
  • %每一列是特定单词的word2vec向量。
  • %Y是文档的标签
  • %BOW_X单元阵列中的每个单元格都是与文档对应的向量。
  • %向量的大小是文档中Unique单词的数量,每个条目是每个Unique单词出现的频率。
  • %indices 每个单元格对应于一个文档,它本身就是一个{1,u}单元格,其中每个条目是对应于每个Unique单词的实际单词
  • %TR每一行对应于训练集的随机分割,每个条目是相对于完整数据集的索引。
  • docNum = length(BOW_X); % 读取文档的数量
  • RWMD = zeros(docNum,docNum); % 最终的生成矩阵
  • parfor i = 1:docNum %并行运行
  •     E_distance = zeros(1,docNum); % 计算单个文档与其他文档的距离
  •     for j = (i+1):docNum
  •         if isempty(BOW_X{i}) || isempty(BOW_X{j}) % 错误处理
  •             E_distance(j) = Inf;
  •         else
  •             x1 = BOW_X{i}./sum(BOW_X{i}); % 归一化
  •             x2 = BOW_X{j}./sum(BOW_X{j}); % 归一化
  •             DD = distance(X{i}, X{j});  % 计算两个文档间的距离(计算X{i}和{j}中的任意列向量之间的两两平方距离矩阵)
  •             m1 = sqrt(max(min(DD,[],1),0));
  •             m2 = sqrt(max(min(DD,[],2),0));
  •             dist1 = m1*x2'; % 只保留约束1
  •             dist2 = m2'*x1'; % 只保留约束2
  •             E_distance(j) = max(dist1,dist2); % 根据论文,对于RWMD,需要选择两个目标中最大的值
  •         end
  •     end
  •     RWMD(i,:) = E_distance; %存储
  •     fprintf("doc %d done!\n",i);
  • end
  • RWMD = RWMD + RWMD'; % 上三角加上下三角
  • %% 根据距离矩阵计算相似度,归一化
  • similarVar = -RWMD;
  • maxs = max(similarVar);
  • mins = min(similarVar);
  • for i = 1:size(RWMD,1)
  •     for j = 1:length(RWMD(i,:))
  •         similarVar(i,j) = (similarVar(i,j)-mins)/(maxs-mins);
  •     end
  • end
  • %% 保存数据与文件
  • toc;
  • save(save_file,'RWMD');
  • save('rwmd_sim', 'similarVar');
    , B# [" r3 x8 F$ r5 h& s
                . y) W4 `+ O: x+ q" }  I5 l$ T

2 s0 l2 N8 m. S+ q; H上述两个代码的distance函数* ?1 C" @; K- f2 A; S' @

) Q$ E) Y) t3 z. L" M/ D6 L
  • function dist=distance(X,x)
  • % dist=distance(X,x)
  • % 计算X和中的任意列向量之间的两两平方距离矩阵
  • [D,~] = size(X);
  • if(nargin>=2)
  •     [d,~] = size(x);
  •      if(D~=d)
  •          error('注意维度要相等!\n');
  •      end
  •      X2 = sum(X.^2,1);
  •      x2 = sum(x.^2,1);
  •      dist = bsxfun(@plus,X2.',bsxfun(@plus,x2,-2*X.'*x));
  • else
  •     [D,N] = size(X);
  •     s=sum(X.^2,1);
  •     dist=bsxfun(@plus,s',bsxfun(@plus,s,-2*X.'*X));
  • end1 V& @% o0 J) |& M) I  ]2 _) T
  
0 q) E, R/ n0 d7 |0 r6 w
5 d% f( W- s8 P4 `) M结果
+ v: P7 c% c. L: F7 Y& X生成的WMD距离矩阵(左),归一化后可以转化为相似度矩阵(右)5 H6 v- G- \5 C/ P, G

" H/ c4 N9 \' B% |/ e: \) j
* A" D; y$ b2 y! r
  W! _6 ]: l  y# |5 c7 F5 H结果举例:找出的相似的两个文本,下面的相似度为47.78%(与文档1最相似)6 O+ r2 v5 p4 b3 V( Q0 Y& _
/ s6 h! p3 I$ d* G' ?; x' ?

' b  y# I9 ^6 A* M5 Z- e; A9 e* n$ m1 B
其中用不同颜色标注的是有明显相似特征的句子。
5 f/ J$ N; K/ j. D9 k) y2 g0 x! ^4 E& U" r, A1 j
分析
1 u0 i. n& B( E3 F* `通过下面的文档相似度矩阵可以发现,文档与文档间的相似度较小,这是因为数据集是真实世界的数据集,即BBC SPORT中没有两篇完全一样的报道。另外,BBC SPORT共有5个不同的类别,从实验结果可以看到相同类别间的相似度远远大于不同类别间的相似度,因此,WMD对文本分类是有一定的效果。
9 A- g* t1 R; o7 ^: x* K/ m1 l
$ I" F/ _2 f3 G, L8 u另外从作者的论文中实验结果可以看到,基于KNN的词移距离算法相对于大多数其他主流文本相似度分析算法来说,错误率要少很多,因此,在工业界,使用WMD来做NLP处理是非常有前景的。
4 b3 m9 o- K$ B/ I9 V: N
0 W5 {+ h* B4 M0 p- L最后,根据由于WMD是无监督学习,通过有监督学习的论文(Supervised word mover’s distance)中可以发现,加上了监督机制后错误率还能再下降一个层次。  [! U7 ^( h3 ~: p7 T$ v  n) B( G

1 _3 S: K: ?) [; A( x: i6 C, l# {需要指出的是,不能简单地添加基于度量学习的监督矩阵,一方面,在计算过程中梯度可能不存在,另一方面,基于KNN的SWMD将会耗费大量的时间,因此需要采取相关措施来解决这些问题。5 g9 N  N" ]  u, s9 S
0 q, [' M) K! h% d8 r
SWMD简介:, P% y, q4 ~/ J3 G4 o

) E& B, H  o! ^( u% v! A8 H7 z  ~  T

/ T- C9 {) H, E
  • TA的每日心情
    开心
    2022-12-26 15:46
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-10-19 17:05 | 只看该作者
    看的我眼睛都花了
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-24 11:38 , Processed in 0.171875 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表