5.4 语义相似度

我们已经看到同义词集之间构成复杂的词汇关系网络。给定一个同义词集,我们可以遍历 WordNet 网络来查找相关含义的同义词集。知道哪些词是语义相关的,对索引文本集合非常有用,当搜索一个一般性的用语例如车辆时,就可以匹配包含具体用语例如豪华轿车的文档。

回想一下每个同义词集都有一个或多个上位词路径连接到一个根上位词,如entity.n.01。连接到同一个根的两个同义词集可能有一些共同的上位词(见图5.1)。如果两个同义词集共用一个非常具体的上位词——在上位词层次结构中处于较低层的上位词——它们一定有密切的联系。

  1. >>> right = wn.synset('right_whale.n.01')
  2. >>> orca = wn.synset('orca.n.01')
  3. >>> minke = wn.synset('minke_whale.n.01')
  4. >>> tortoise = wn.synset('tortoise.n.01')
  5. >>> novel = wn.synset('novel.n.01')
  6. >>> right.lowest_common_hypernyms(minke)
  7. [Synset('baleen_whale.n.01')]
  8. >>> right.lowest_common_hypernyms(orca)
  9. [Synset('whale.n.02')]
  10. >>> right.lowest_common_hypernyms(tortoise)
  11. [Synset('vertebrate.n.01')]
  12. >>> right.lowest_common_hypernyms(novel)
  13. [Synset('entity.n.01')]

当然,我们知道,鲸鱼是非常具体的(须鲸更是如此),脊椎动物是更一般的,而实体完全是抽象的一般的。我们可以通过查找每个同义词集深度量化这个一般性的概念:

  1. >>> wn.synset('baleen_whale.n.01').min_depth()
  2. 14
  3. >>> wn.synset('whale.n.02').min_depth()
  4. 13
  5. >>> wn.synset('vertebrate.n.01').min_depth()
  6. 8
  7. >>> wn.synset('entity.n.01').min_depth()
  8. 0

WordNet 同义词集的集合上定义的相似度能够包括上面的概念。例如,path_similarity是基于上位词层次结构中相互连接的概念之间的最短路径在0-1范围的打分(两者之间没有路径就返回-1)。同义词集与自身比较将返回1。考虑以下的相似度:露脊鲸与小须鲸、逆戟鲸、乌龟以及小说。数字本身的意义并不大,当我们从海洋生物的语义空间转移到非生物时它是减少的。

  1. >>> right.path_similarity(minke)
  2. 0.25
  3. >>> right.path_similarity(orca)
  4. 0.16666666666666666
  5. >>> right.path_similarity(tortoise)
  6. 0.07692307692307693
  7. >>> right.path_similarity(novel)
  8. 0.043478260869565216

注意

还有一些其它的相似性度量方法;你可以输入help(wn)获得更多信息。NLTK 还包括 VerbNet,一个连接到 WordNet 的动词的层次结构的词典。It can be accessed with nltk.corpus.verbnet.