sas文本挖掘案例:如何使用SAS计算Word Mover的距离

Word Mover的距离(WMD)是用于衡量两个文档之间差异的距离度量,它在文本分析中的应用是由华盛顿大学的一个研究小组在2015年引入的。该小组的论文“  从Word嵌入到文档距离”发表了在第32届国际机器学习大会(ICML)上。在本文中,他们证明了WMD度量导致8真实个文档世界分类照片数据集中前所未有的低的ķ最近邻文档分类错误率。

他们利用单词嵌入和WMD对文档进行分类,这种方法相对于传统方法的最大优点是它能够将单个单词对(例如总统和奥巴马)之间的语义相似性合并到文档距离度量中。以传统方式,操纵语义相似单词的一种方法是提供同义词表,以便算法在测量文档距离之前可以将具有相同含义的单词合并到代表性单词中,否则您将无法获得准确的相异性结果。然而,维护同义词表需要人类专家的不断努力,因此耗时且非常昂贵。此外,单词的语义含义取决于域,而通用同义词表不适用于不同的域。

Word Mover距离的定义

WMD是两个文档之间的距离,作为将所有单词从一个文档移动到另一个文档所需的最小(加权)累积成本。通过解决以下线性程序问题来计算距离。



T ij表示文档d中的单词i在文档d'中移动到单词j的多少;

C(1; j)的表示从文件d中的单词我到文件d '中的单词J‘行进’的费用; 这里的成本是word2vec嵌入空间中的两个词'欧几里德距离;

如果字我出现Ç我在文档d次,我们记


WMD是地球移动器距离度量(EMD)的一个特例,这是一个众所周知的运输问题。

如何用SAS计算地球移动器的距离?

SAS / OR是解决运输问题的工具。图1显示了一个带有四个节点和节点之间距离的传输示例,我从这个Earth Mover的距离文档中复制了这些节点。目标是找出从{x1 ,x2}到{y1,y2}的最小流量。现在让我们看看如何使用SAS / OR解决这个运输问题。

节点的权重和节点之间的距离如下。


图-1运输问题

datax_set; input_node_ $ _sd_; datalines; x10.74x20.26; datay_set; input_node_ $ _sd_; datalines; y10.23y20.51; dataarcdata; input_tail_ $ _head_ $ _cost_; datalines; x1 y1155.7x1 y2252.3x2 y1292.9x2 y2198.2; proc optmodel; setxNODES; num w {xNODES}; setyNODES; num u {yNODES};设置ARCS; num arcCost {ARCS}; readdatax_setintoxNODES = [_ node_] w = _sd_; readdatay_setintoyNODES = [_ node_] u = _sd_; readdataarcdataintoARCS = [_ tail_ _head_] arcCost = _cost_; varflow {inARCS}> = 0; impvar sumY = sum {jinyNODES} u [j]; minobj =(sum {inARCS} arcCost [i,j] * flow [i,j])/ sumY; con con_y {jinyNODES}:sum {inARCS} flow [i,j] = u [j]; con con_x {iinxNODES}:sum {<(i),j> inARCS} flow [i,j] <= w [i]; lp / algorithm = ns scale = none logfreq = 1; 印刷流程; 放弃;


SAS / OR的解决方案如表-1所示,EMD是目标值:203.26756757。


表-1 EMD用SAS / OR计算

我用SAS / OR表2得到的流量数据显示如下,与上述地球移动器距离文档中公布的图表相同。


表-2 SAS / OR的流量数据


图-2运输问题流程图


如何用SAS计算Word Mover的距离

本文从Word嵌入到文档距离,通过删除WMD的第二个约束来减少计算,提出了一个名为放松的Word Mover距离(RWMD)的新度量。由于我们需要读取文字嵌入数据,因此我将向您展示如何使用SAS Viya计算两个文档的RWMD。


doc2_id = 2); / *文本解析和聚合* / proc cas; textParse.tpParse / table = {name =“&textDS”,where =“&documentID =&doc1_id or&documentID =&doc2_id”} docId =“&documentID”,language =“ &语言”,词干=假,nounGroups =假,标记=假,偏移= {名称= “outpos”,替换= 1},文本= “文本”;运行; textparse.tpaccumulate /父= {名称= “outparent1”,替换= 1}语言= “&语言”,偏移= 'outpos',停止列表= {名称= “&停止列表”},术语= {名称= “outterms1”,替换= 1},child = {name =“outchild1”,replace = 1},reduce = 1,cellweight ='none',termWeight ='none'; run; quit; / *两个测试文档的条款* / proc cas; loadactionset“fedsql”; execdirect casout = {name =“doc_terms”,replace = true} query =“

选择outparent1。*,_ term_

来自outparent1

left join outterms1

on outparent1._termnum_ = outterms1._termnum_

其中_Document _ =&doc1_id或_Document _ =&doc2_id;

“; run; quit; / *术语向量和两个测试文档的计数* / proc cas; loadactionset”fedsql“; execdirect casout = {name =”doc1_termvects“,replace = true} query =”

选择word2vect。*

来自&word2VectDS word2vect,doc_terms

其中_Document _ =&doc2_id和lowcase(term)= _term_;

“; run; execdirect casout = {name =”doc1_terms“,replace = true} query =”

选择doc_terms。*

来自&word2VectDS,doc_terms

其中_Document _ =&doc2_id和lowcase(term)= _term_;

“; run; simple.groupBy / table = {name =”doc1_terms“} inputs = {”_ Term _“,”_ Count _“} aggregator =”n“casout = {name =”doc1_termcount“,replace = true}; run; quit ; proc cas; loadactionset“fedsql”; execdirect casout = {name =“doc2_termvects”,replace = true} query =“

选择word2vect。*

来自&word2VectDS word2vect,doc_terms

其中_Document _ =&doc1_id和lowcase(term)= _term_;

“; run; execdirect casout = {name =”doc2_terms“,replace = true} query =”

选择doc_terms。*

来自&word2VectDS,doc_terms

其中_Document _ =&doc1_id和lowcase(term)= _term_;

/ *计算文档之间的RWMD * / datax_set; setsascas1.doc1_termcount; rename_term _ = _ node _; _ weight _ = _ count_; run; datay_set; setsascas1.doc2_termcount; rename_term _ = _ node _; _ weight _ = _ count_; run; dataarcdata; setdistance; renamecol1 = _tail_; renamecol2 = _head_; length_cost_8; _cost_ = col3; run; proc optmodel; setxNODES; num w {xNODES}; setyNODES; num u {yNODES}; set ARCS; num arcCost {ARCS}; readdatax_setintoxNODES = [_ node_] w = _weight_; readdatay_setintoyNODES = [_ node_] u = _weight_; readdataarcdataintoARCS = [_ tail_ _head_] arcCost = _cost_; varflow {inARCS}> = 0; impvar sumY = sum {jinyNODES} u [j]; minobj = (sum {inARCS} arcCost [i,j] * flow [i,j])/ sumY; con con_y {jinyNODES}:sum {inARCS} flow [i,j] = u [j]; / * con con_x {i in xNODES}:sum {<(i),j> in ARCS} flow [i,j] <= w [i]; * / solve with lp / algorithm = ns scale = none logfreq = 1; callsymput('obj' ,strip(put(obj,best。))); createdataflowDatafrom [ij] = {inARCS:flow [i,j] .sol> 0} col(“cost”)= arcCost [i,j] col(“flowweight”)= flow [i,j] .sol; run;退出;%putRWMD =&OBJ;%mendcalculateRWMD; %calculateRWMD(textDS =文件,documentID =一样,文本=文本,语言=英语,STOPLIST = STOPLIST,word2VectDS =手套,doc1_id = 1,doc2_id = 2);



proc printdata = flowdata; 跑; 放弃;



WMD方法不仅可以测量文档的相似性,还可以通过可视化流数据来解释为什么这两个文档是相似的。

▍关注我们

大数据部落   -中国专业的第三方数据服务提供商,提供定制化的一站式数据挖掘和
统计分析和数据挖掘咨询服务: y0.cn/teradat (咨询服务请联系 官网客服
点击这里给我发消息 QQ:   3025393450

【服务场景】        
 
             
科研项目;
        
             
公司项目外包;线上线下一对一培训;学术研究。
【大数据部落】提供定制化的一站式数据挖掘和统计分析咨询服务
 
分享最新的大数据资讯,每天学习一点数据分析,让我们一起做有态度的数据人 【大数据部落】大数据部落提供定制化的一站式数据挖掘和统计分析咨询服务
微信客服号:lico_9e
QQ交流群:186388004  
欢迎关注微信公众号,了解更多数据干货资讯!

 

猜你喜欢

转载自blog.csdn.net/qq_19600291/article/details/81064476
SAS