Py学习  »  Git

如何计算词语的相似性(附github)

超人汪小建 • 5 年前 • 421 次点击  
阅读 66

如何计算词语的相似性(附github)

前言

文本的相似性计算方法有很多,前面也讲了很多方式,下面继续讨论一种词语相似度的计算方法——基于知网的词语相似性计算。

词语语义

词语相似度也是没有一种明确的客观标准可用来衡量,相似度涉及到词语的词法、句法、语义、语用等,很难有一个统一的定义。

两类方法

词语相似度一般可分为两类方法,一种是基于 Ontology 或 Taxonomy 来计算,另外一种是基于大规模语料进行统计。

第一类方法一般是基于同义词词典,所有词组织在一棵或几棵树结构中,两个节点的路径长度即可作为语义距离。比如前面说到过的基于词林的相似度计算。

第二类方法需要大规模的语料,我们认为凡是语义相近的词,它们的上下文也应该相似,通过一定的概率模型可计算出词语的相关性,进而可计算相似性。

知网

《知网》由董振东先生研究十多载的成果,用于揭示概念与概念之间以及概念所具有的属性之间的关系为基本内容的常识知识库。知网含有丰富的词汇语义知识和世界知识,为自然语言处理提供了宝贵的资源。

知网结构

知网主要包含了“概念”和“义原”。概念是对词汇语义的一种描述,一个词也可以为几个概念。义原用于描述概念的最小意义单位。

《知网》一共采用了个 1500 义原,这些义原分为以下几个大类:

  1. Event|事件
  2. entity|实体
  3. attribute|属性值
  4. aValue|属性值
  5. quantity|数量
  6. qValue|数量值
  7. SecondaryFeature|次要特征
  8. syntax|语法
  9. EventRole|动态角色
  10. EventFeatures|动态属性

比如

概念编号 描述语言
017144 exercise|锻练,sport|体育
男人 059349 human|人,family|家,male|男
高兴 029542 aValue|属性值,circumstances|境况,happy|福,desired|良
生日 072280 time|时间,day|日,@ComeToWorld|问世,$congratulate|祝贺
北京 003815 place|地方,capital|国都,ProperName|专,(China|中国)
儿童基金会 024083 part|部件 ,%institution|机构 ,politics|政,#young|幼,#fund|资金,(institution|机构=UN|联合国)

义原划分

我们可以把知网的义原分为三组。

组别 名称 范围 作用
第一组 基本义原 包括第 1 到第 7 类的义原 用来描述单个概念的语义特征
第二组 语法义原 只包括第 8 类义原 用于描述词语的语法特征,主要是词性(Part of Speech)
第三组 关系义原 包括第 9 和第 10类的义原 用于描述概念和概念之间的关系(类似于深层格语法中的格关系)

描述语言符号

, 多个属性之间,表示“和”的关系
# 表示“与其相关”
% 表示“是其部分”
$ 表示“可以被该‘V’处置,或是该“V”的受事,对象,领有物,或者内容
* 表示“会‘V’或主要用于‘V’,即施事或工具
+ 对 V 类,它表示它所标记的角色是一种隐性的,几乎在实际语言中不会出现
& 表示指向
~ 表示多半是,多半有,很可能的
@ 表示可以做“V”的空间或时间
? 表示可以是“N”的材料,如对于布匹,我们标以“?衣服”表示布匹可以是“衣服”的材料
{} (1) 对于 V 类,置于 [ ] 中的是该类 V 所有的“必备角色”。如对于“购买”类,一旦它发生了,必然会在实际上有如下角色参与:施事,占有物,来源,工具。尽管在多数情况下,一个句子并不把全部的角色都交代出来(2) 表示动态角色,如介词的定义
() 置于其中的应该是一个词表记,例如,(China|中国)
^ 表示不存在,或没有,或不能
! 表示某一属性为一种敏感的属性,例如:“味道”对于“食物”,“高度”对于“山脉”,“温度” 对于“天象”等

实词与虚词

知网的概念包含了实词和虚词,虚词的描述比较简单,用“{句法义原}”或“{关系义原}”进行描述。实词的描述比较复杂,由一系列用逗号隔开的“语义描述式”组成。

image

实词可以包括如下描述:

  1. 基本义原描述式,用“基本义原”进行描述,第一个描述式总是一个基本义原描述式,这也是对该实词最重要的一个描述式,这个基本义原描述了该实词的最基本的语义特征;
  2. 关系义原描述式:用“关系义原=基本义原”或者“关系义原=(具体词)”或者“(关系义原=具体词)”来描述;
  3. 关系符号描述式:用“关系符号 基本义原”或者“关系符号(具体词)”加以描述,还可以由多个关系符号描述式采用同一个关系符号;

基本思想

知网中的每一个概念并非对应于一个树状概念层次体系中的一个结点,这点与同义词词林不一样,知网中是通过用一系列的义原并利用某种知识描述语言来描述一个概念。这些义原通过上下位关系组织成一个树状义原层次体系。现在要做的事就是找到一种方法来计算这种知识描述语言表示的两个语义表达式的相似度。

对于两个汉语词语 W1 和 W2,如果 W1 有 n 个概念:S11,S12,……,S1n, W2 有 m 个概念:S21,S22,……,S2m,则规定 W1 和 W2 的相似度是各 个概念的相似度最大值。

image

义原相似度

义原相似度计算时概念相似度的基础,义原由一个树状的义原层次体系构成,假设两个义原在这个层次体系中的路径距离为 d,可以得到这两个义原之间的语义距离为,

image

其中 p1 和 p2 表示两个义原,d 是 p1 和 p2 在义原层次体系中的路径长度,是一个正整数。α是一个可调节的参数。

虚词相似度

由于虚词和实词总是不能替换,所以虚词和实词的相似度总是为零。

另外,虚词总是用“{句法义原}”或“{关系义原}”这两种方式进行描述,所以虚词的相似度只需要计算其对应的句法义原或关系义原之间的相似度。

实词的相似度

知网的知识由义原、集合和特征结构共同表达,实词的整体相似建立在部分相似的基础上,把一个复杂的整体分解成部分,通过计算部分之间的相似度得到整体的相似度。

一个实词的描述可以表示为一个特征结构,该特征结构含有以下四个特征:

  1. 第一基本义原描述:其值为一个基本义原,我们将两个概念的这一部分的相似度记为 Sim1(S1,S2);
  2. 其它基本义原描述:对应于语义表达式中除第一基本义原描述式以外的所有基本义原描述式,其值为一个基本义原的集合,我们将两个概念的这一部分的相似度记为Sim2(S1,S2);
  3. 关系义原描述:对应于语义表达式中所有的关系义原描述式,其值是一个特征结构,对于该特征结构的每一个特征,其属性是一个关系义原,其值是一个基本义原,或一个具体词。我们将两个概念的这一部分的相似度记为 Sim3(S1,S2);
  4. 关系符号描述:对应于语义表达式中所有的关系符号描述式,其值也是一个特征结构,对于该特征结构的每一个特征,其属性是一个关系义原,其值是一个集合,该集合的元素是一个基本义原,或一个具体词。我们将两个概念的这一部分的相似度记为Sim4(S1,S2)。

则两个概念语义表达式的整体相似度为,

image

其中,

image

反映了 Sim1 到 Sim4 对于总体相似度所起到的作用依次递减。由于第一基本义原描述式反映了一个概念最主要的特征,所以应该将其权值定义得比较大,一般应在0.5以上。

第一基本义原描述相似度:就是两个义原的相似度,按照义原相似度计算;

其它基本义原描述相似度:其值为一个集合,转换为两个基本义原集合的相似度计算问题;建立两个集合的元素之间一一对应关系,方法为:

  1. 首先计算两个集合的所有元素两两之间的相似度;
  2. 从所有的相似度值中选择最大的一个,将这个相似度值对应的两个元素对应起来;
  3. 从所有的相似度值中删去那些已经建立对应关系的元素的相似度值;
  4. 重复上述第 2 步和第 3 步,直到所有的相似度值都被删除;
  5. 没有建立起对应关系的元素与空元素对应。

建立起两个集合元素的一一对应关系后,就很容易计算两个集合的相似度了:集合的相似度等于其元素对的相似度的加权平均。

关系义原描述相似度:其值为一个特征结构,转换为两个特征结构的相似度计算问题。属性相同的特征之间一一对应,如果没有属性相同的特征,那么该特征的对应物为空。特征结构的相似度就转化为各个特征的相似度的加权平均。

关系符号描述相似度:其值为一个特征结构,转换为两个特征结构的相似度计算问题。

github

https://github.com/sea-boat/TextAnalyzer/blob/master/src/main/java/com/seaboat/text/analyzer/similarity/HownetSimilarity.java

-------------推荐阅读------------

我的开源项目汇总(机器&深度学习、NLP、网络IO、AIML、mysql协议、chatbot)

为什么写《Tomcat内核设计剖析》

2018汇总数据结构算法篇

2018汇总机器学习篇

2018汇总Java深度篇

2018汇总自然语言处理篇

2018汇总深度学习篇

2018汇总JDK源码篇

2018汇总Java并发核心篇

2018汇总读书篇


跟我交流,向我提问:

欢迎关注:

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/29557
 
421 次点击