但是,该算法也存在很多问题,比如有的词在词典中没有出现,或者有的词在词典中的解释过少。另外,也可以借助其他的词典,如同义词词典,就不是简单的判断重合度,也考虑了两句话中各个词同义词的重合度。在SenVal-2的评测任务中该方法的准确率达到50%-70%。
介绍一个基于WordNet的非常好用的计算词语相似度的工具JWS,如何使用http://www.cnblogs.com/sl-shilong/archive/2013/01/23/2874094.html,下面是简介
摘要:
wordent是一个免费的软件包,可以用来计算两个概念(或者word sense)之间的语义相似度,它提供了六种计算相似度 和三种计算概念之间的关联度方法,所有的这些方法都是基于wordnet这个词汇数据库。这些计算方法已经用Perl实现,算法模型的输入是两个概念,返回结果就是用来表示相似或者关联度的一个数量值。
概述:
计算两个概念相似的程度,主要是基于包含在层次结构“is-a”结构中的信息。比如:如果automobile和boat拥有同一个祖先vehicle,那么automobile 会被认为 与boat 的相似程度大于和tree的相似度。
自从wordnet把名词和动词组织成is-a这种层次关系,wordnet 就非常适合进行形似度的计算。在2.0版,有九个名词层次结构 包含80000个概念,还有554个动词层次结构包含13500个概念。
Wordnet中的is-a关系并不是跨词性的,所以,基于wordnet的相似度计算只是局限在名词之间(比如:cat 和dog)和动词对之间(比如:run和walk)。而wordnet也包含形容词和副词,这些词不能组织成is-a关系,所以这些词也就不能进行相似度的计算。
然而,概念之间除了通过相似度关联外,还可以通过很多种其他方法。比如:wheel 是car 的一部分,night是day的反面,snow是由water变成的,knife是用来切bread等等。Wordent也提供额外的联系 比如:has-part,is-made-of,is-an-attribute-of 等等。除此之外,每一个概念(或者word sense)都通过一段简短的定义或者注释加以描述。
计算关联的方法是基于这些额外的信息,并且这些方法可以运用的更广泛的概念对中。比如:可以跨越词性,然后可以达到使动词murder和名词gun相关联的程度。也可以计算不是is-a关系的词汇比如形容词 violent和harmful。
相似度计算
三种相似度的计算是基于概念之间路径长度的:lch(Leacock&Chodorow 1998),wup(Wu&Palmer 1994),和path,其中lch方法是找到两个概念之间的最短路径,然后在is-a层次中找到最大路径长度。Wup方法是找到两个概念从最近的公共祖先节点到root 节点的路径长度。Path方法是两个概念之间最短路径长度的倒数。
另外,概念的信息内容来自SemCor的sense-tagged 集合。然而,也有现成的程序可以对没有标注的集合中的信息进行计算,比如Brown Corpus,the Penn Treebank, British Nation Corpus ,或者任意形式的普通文本。
WordNet::Similarity支持两种假定的根节点,这两种根节点可以存在也可以不存在,当存在时,一个根节点包含所有的名词节点,另一个包含所有的动词节点。这样便允许把相似度计算应用到任意的名词和动词对之间。如果两个根节点不存在,那么只有在同一个is-a层次中的词才能计算相似度。
计算关联度
有三种wordnet支持的计算关联度的方法分别是:hso(Hirst&St-Onge1998),lesk(Banerjee&Pedersen 2003),和vector(Patwardhan 2003).hso方法是基于路径并且根据方向把关系分类。比如is-a关系是纵向的,has-part关系是横向的。最好能在两个概念之间找到一条路径,这条路径不能太长并且方向也不能改变的太频繁。
Wordnet中的每一个概念(或者word sense)都是通过一个短注释进行定义的。Lesk方法和Vector方法是把注释作为概念的唯一的标识方法。Lesk方法通过寻找和计算两个概念的注释的交叉部分,和在wordnet中同时与一个概念相连接的方法来计算相似度。
Vector方法建立一个由wordnet 注释组成的co-occurrence矩阵。Wordnet注释中每一个word都有一个关联向量。每一个注释都是由一个gloss vector的形式组成的,gloss vector 的内容通常是所有上下文向量的gloss中的词组成的。两个概念之间的关联度就是通过计算两个gloss向量的夹角余弦值。
运用 Wordnet::Similarity
Wordnet::Similarity 的实现具有Perl的面向对象的特征。利用Wordnet::QueryData 包(Rennie2000)来创建一个Wordnet的描述。已经有大量现成的方法实现现有的相似度测量方法。
当一个已有的方法要合并到Perl程序中,那种方法的对象必须通过new()方法创建。然后通过getRelatedness()方法得出WorldNet中的一对sense的相似度以及关联度。
Wordnet::Similarity 也可以通过应用程序similarity.pl提供的命令行接口来访问。这种方式可以允许用户对于具体的一对概念(以word#pos#sense的形式给出),利用某个方法交互式的操作。比如:car#n#3代表car 的第三个wordnet名词sense。另外还允许对于和一个word或者word#pos的组合相关联的所有可能的sense进行详细的说明。出此之外,还有基于这种应用程序的web形式的接口。
我们忽略wordnet怎样运行,Wordnet::Similarity对于每一个不同的方法都提供了详细的跟踪并显示出各种诊断信息的具体说明。比如:对于依赖于路径长度的方法(lch,wup,path),跟踪显示出所有的两个概念之间的所有的路径。对于信息内容的追踪方法(res,lin,jcn)则包含了两个概念之间所有的路径以及最近的公共子概念。对于hso方法的追踪显示出通过wordnet找到的真正路径,而lesk则显示出了wordnet中两个概念相互重叠的gloss以及以及他们相近的关系。Vector方法显示了用于创建一个概念的gloss向量的所有word vectors。
我们已经把Wordnet::Similarity合并到通用的基于语义联系的词意消歧的方法中(Patwardhan,Banerjee,&Pdersen2003)。这种方法已经在SenseRelate 包实现了(http://senserelate.sourceforge.net). 这个算法的前提是一个word的sense可以通过查找它所有的sense中与它相邻的word的sense关联最大的那个而得到.我们现在正在摸索把相似度和关联度算法运用到评估一个text generation system 的组建选择上.