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

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

Word Mover的距离(WMD)是用于衡量两个文档之间差异的距离度量,它在文本分析中的应用是由华盛顿大学的一个研究小组在2015年引入的。


Word Mover距离的定义

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


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

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

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


WMD是Word Mover距离度量(EMD)的一个特例,这是一个众所周知的问题。


如何用SAS计算Word Mover的距离?


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

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

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};set<str,str> ARCS;
num arcCost{ARCS}; 
readdatax_setintoxNODES=[_node_]w=_sd_;
readdatay_setintoyNODES=[_node_]u=_sd_;
readdataarcdataintoARCS=[_tail_ _head_]arcCost=_cost_;
varflow{<i,j>inARCS}>=0;
impvar sumY =sum{jinyNODES}u[j];
minobj =(sum{<i,j>inARCS}arcCost[i,j]* flow[i,j])/sumY;
con con_y{jinyNODES}:sum{<i,(j)>inARCS}flow[i,j]= u[j];
con con_x{iinxNODES}:sum{<(i),j>inARCS}flow[i,j]<= w[i];
 solve with lp / algorithm=ns scale=none logfreq=1;
 print flow;
 quit;


图-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。

/* start CAS server */cas casauto host="host.example.com"port=5570;libnamesascas1 cas;/* load documents into CAS */datasascas1.documents;infiledatalines delimiter='|'missover;lengthtext varchar(300);inputtext$ did;datalines;Obama speaks to the mediainIllinois.|1The President greets the pressinChicago.|2;run;/* create stop list*/datasascas1.stopList;infiledatalines missover;lengthterm $20;inputterm$;datalines;thetoin;run;/* load word embedding model */proc cas;loadtable path='datasources/glove_100d_tab_clean.txt'caslib="CASTestTmp"importOptions={fileType="delimited",delimiter='\t',getNames=True,guessRows=2.0,varChars=True}casOut={name='glove'replace=True};run;quit;%macrocalculateRWMD(textDS=documents,documentID=did,text=text,language=English,stopList=stopList,word2VectDS=glove,doc1_id=1,doc2_id=2);/* text parsing and aggregation */proc cas;textParse.tpParse/table={name="&textDS",where="&documentID=&doc1_id or &documentID=&doc2_id"}docId="&documentID",language="&language",stemming=False,nounGroups=False,tagging=False,offset={name="outpos",replace=1},text="&text";run; textparse.tpaccumulate/parent={name="outparent1",replace=1}language="&language",offset='outpos',stopList={name="&stoplist"},terms={name="outterms1",replace=1},child={name="outchild1",replace=1},reduce=1,cellweight='none',termWeight='none';run;quit;/* terms of the two test documents */proc cas;loadactionset"fedsql";execdirect casout={name="doc_terms",replace=true}query="

select outparent1.*,_term_

from outparent1

left join outterms1

on outparent1._termnum_ = outterms1._termnum_

where _Document_=&doc1_id or _Document_=&doc2_id;

";run;quit;/* term vectors and counts of the two test documents */proc cas;loadactionset"fedsql";execdirect casout={name="doc1_termvects",replace=true}query="

select word2vect.*

from &word2VectDS word2vect, doc_terms

where _Document_=&doc2_id and lowcase(term) = _term_;

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

select doc_terms.*

from &word2VectDS, doc_terms

where _Document_=&doc2_id and 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="

select word2vect.*

from &word2VectDS word2vect, doc_terms

where _Document_=&doc1_id and lowcase(term) = _term_;

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

select doc_terms.*

from &word2VectDS, doc_terms

where _Document_=&doc1_id and lowcase(term) = _term_;

";run; simple.groupBy /table={name="doc2_terms"}inputs={"_Term_","_Count_"}aggregator="n"casout={name="doc2_termcount",replace=true};run;quit;/* calculate Euclidean distance between words */datadoc1_termvects;setsascas1.doc1_termvects;run;datadoc2_termvects;setsascas1.doc2_termvects;run;proc iml;use doc1_termvects;read allvar_char_intolterm;read allvar_num_intox;closedoc1_termvects; use doc2_termvects;read allvar_char_intorterm;read allvar_num_intoy;closedoc2_termvects; d = distance(x,y); lobs=nrow(lterm);robs=nrow(rterm);d_out=j(lobs*robs, 3, ' ');doi=1to lobs;doj=1to robs;d_out[(i-1)*robs+j,1]=lterm[i];d_out[(i-1)*robs+j,2]=rterm[j];d_out[(i-1)*robs+j,3]=cats(d[i,j]);end;end;createdistancefromd_out;appendfromd_out;closedistance;run;quit;/* calculate RWMD between documents */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<str,str> ARCS;num arcCost{ARCS}; readdatax_setintoxNODES=[_node_]w=_weight_;readdatay_setintoyNODES=[_node_]u=_weight_;readdataarcdataintoARCS=[_tail_ _head_]arcCost=_cost_;varflow{<i,j>inARCS}>=0;impvar sumY =sum{jinyNODES}u[j];minobj =(sum{<i,j>inARCS}arcCost[i,j]* flow[i,j])/sumY;con con_y{jinyNODES}:sum{<i,(j)>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[i j]={<i, j="">inARCS: flow[i,j].sol >0}col("cost")=arcCost[i,j]col("flowweight")=flow[i,j].sol;run;quit;%putRWMD=&obj;%mendcalculateRWMD; %calculateRWMD(textDS=documents,documentID=did,text=text,language=English,stopList=stopList,word2VectDS=glove,doc1_id=1,doc2_id=2);

<str,str>

<str,str>proc printdata=flowdata;run;quit;



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

 

相关文章
|
SQL DataWorks NoSQL
DataWorks报错问题之datax mongodb全量迁移报错如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
|
存储 缓存 分布式计算
阿里云服务器2核16G、4核32G、8核64G配置最新收费标准及活动价格参考(2024更新)
2核16G、8核64G、4核32G配置的云服务器处理器与内存比为1:8,这种配比的云服务器一般适用于数据分析与挖掘,Hadoop、Spark集群和数据库,缓存等内存密集型场景,因此,多为企业级用户选择,目前用户购买2核16G配置活动价格最低为1473.41元/1年起,购买4核32G配置活动价格最低为2896.42元/1年起,购买8核64G配置活动价格最低为5742.43元/1年起,本文介绍这些配置的最新购买价格,包含原价收费标准和最新活动价格。
阿里云服务器2核16G、4核32G、8核64G配置最新收费标准及活动价格参考(2024更新)
|
存储 固态存储 安全
阿里云服务器最新价格参考,2024年阿里云服务器活动价格表及收费标准
进入2024年,阿里云服务器的活动价格又降价了,现在购买阿里云服务器年付最低仅需61元即可购买一台2核2G3M带宽的轻量应用服务器,而月付最低只需要30.06元即可购买一台2核4G3M带宽配置的云服务器,另外通用算力型u1实例2核4G、4核8G和8核16G等热门配置的活动价格在2024年也再次下降了,例如2核4G配置1M带宽20G ESSD Entry云盘,现在活动价格只要531.79元/1年了,选择5M带宽现在只要898.99元/1年了,下面是2024年阿里云服务器最新活动价格表。
阿里云服务器最新价格参考,2024年阿里云服务器活动价格表及收费标准
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
VideoWorld:字节开源自回归视频生成模型,支持输入视频指导AI生成视频!弥补文本生成视频的短板
VideoWorld 是由字节跳动、北京交通大学和中国科学技术大学联合推出的自回归视频生成模型,能够从未标注的视频数据中学习复杂知识,支持长期推理和规划任务。
810 8
VideoWorld:字节开源自回归视频生成模型,支持输入视频指导AI生成视频!弥补文本生成视频的短板
|
分布式计算 数据处理 流计算
【原理】Flink如何巧用WaterMark机制解决乱序问题
【原理】Flink如何巧用WaterMark机制解决乱序问题
|
SQL 关系型数据库 数据库
实时计算 Flink版产品使用问题之如何同步一个数据库的数据转换到另一个库
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
存储 弹性计算 人工智能
2024年阿里云服务器多少钱一年?阿里云服务器新版租用活动价格表
2024年租用阿里云服务器多少钱一年?这是很多初次选择阿里云服务器的用户比较关心的问题,为此,小编特意查询并整理了一份截止目前阿里云服务器最新版的租用活动价格表。目前阿里云服务器经济型e实例2核2G3M带宽99元一年、通用算力型u1实例2核4G5M带宽199元一年、轻量应用服务器2核2G3M带宽只要61元一年、热卖游戏联机服务器4核16G10M带宽26.52元1个月起。
2024年阿里云服务器多少钱一年?阿里云服务器新版租用活动价格表
|
存储 弹性计算 固态存储
阿里云服务器价格参考,2024最新收费标准与活动价格参考
同配置的阿里云服务器有多种实例规格可选,2024年,经济型e、通用算力型u1、计算型c7、计算型c8y、通用型g7和通用型g8y等实例2核4G、4核8G、8核16G、2核8G、4核16G、8核32等配置的云服务器有优惠,其中,通用算力型u1实例2核4G,5M固定带宽,80G ESSD Entry盘企业用户购买只要199元/1年,另外轻量应用服务器2核2G和2核4G配置也有优惠。下面是2024年截至目前阿里云服务器主要配置的最新活动价格及选择建议参考。
阿里云服务器价格参考,2024最新收费标准与活动价格参考
|
关系型数据库 分布式数据库 数据库
PolarDB for PostgreSQL报错问题之psql连接数据库报错如何解决
PolarDB for PostgreSQL是基于PostgreSQL开发的一款云原生关系型数据库服务,它提供了高性能、高可用性和弹性扩展的特性;本合集将围绕PolarDB(pg)的部署、管理和优化提供指导,以及常见问题的排查和解决办法。