WordNet调研记录

WordNet是一个由普林斯顿大学编撰的以“同义关系”为主体的一部英语词典。本文将对其组织形式、内容、特点、使用方式进行介绍。

组织形式

这里的大部分内容都参考了WordNet简介 - jcsu - 博客园这篇博客。

如上所说,WordNet是以“同义关系”进行组织的。通过查询这部词典,你可以知道和某个词的特定词义相似的其它词汇有哪些。

组织结构示意图,来自“WordNet简介 - jcsu - 博客园”

这里的行代表词义,列代表词形,每一个非空单元格就相当于是某个单词的特定词义。按列看,相当于是一个单词具有多个词义,即多义词;按行看,相当于是同一个词义包含多个单词,即同义词集(Synsets)。

除去同义关系,词典中还包含上下位关系的概念。例如词义“yellow(noun)”包含的下位词义包括:amber、gamboge、orange yellow、pale yellow
等,它们都是在“黄色”的基础上进行一些特化所形成的概念,而其上位词义包括“color”。

事实上,从几个初始概念开始,每个同义词集都可以向下特化,形成下位概念,直到无法特化为止,这样就形成了类似多叉树的结构,其中的每个结点都是一个同义词集,如下图所示:

概念链,来自“WordNet简介 - jcsu - 博客园”

注意这里存在概念有一个以上直接上位概念的现象,所以并不是严格的树结构。

除此以外,还有反义关系、部分/整体关系等,这里不再详细介绍。

特点

  • 其中的词汇只包含四类:名词、动词、形容词、副词,也就是在这个世界上有实际含义的词汇;而不包括虚词(例如代词、冠词等,你无法在其中找到“the”这个单词)
  • 词典中的划分最小项是单词的词义,而不是这个单词本身(词形)
  • 其中的词汇只有标准型,而不包括各类变体(例如动词的现在、过去分词),但是有特定含义的另说(例如interestinginterested
  • 其中可能包括词组,例如词义“机动车”中包含两个词组:motor vehicle, automotive vehicle (a self-propelled wheeled vehicle that does not run on rails)
  • 似乎有多语言的用法,见:【Python&NLP】关于WordNet,我的一些用法和思路(一)

使用方式

安装

可以通过NLTK(python的一个自然语言处理工具)获取到WordNet。
第一次使用时需要下载WordNet词典,运行:

1
2
import nltk
nltk.download()

随后会进入交互界面,先输入d下载,然后它会问你要下载何种语料库,输入wordnet即可。

调用方法

推荐两篇讲得比较好的博客:WordNet Python API (整理总结) - qq-36771895的博客 - CSDN博客【Python&NLP】WordNet的应用 - 安立桐的博客 - CSDN博客

这里给出了一些用法的例子,更多用法可以参见nltk.corpus.reader.wordnet的文档

引入wordnet数据集:

1
from nltk.corpus import wordnet

获取一个单词或词组关联的所有同义词集:

1
2
3
4
5
6
7
8
wordnet.synsets("struggling")

# Output:
# [Synset('fight.v.03'),
# Synset('struggle.v.02'),
# Synset('clamber.v.01'),
# Synset('contend.v.06'),
# Synset('struggling.s.01')]

获取某个同义词集的名字:

1
2
3
4
synset = wordnet.synsets("struggling")[0]
synset.name()
# Output:
# 'fight.v.03'

获取某个同义词集的词性:

1
2
3
4
5
synset = wordnet.synsets("struggling")[0]
synset.pos()

# Output:
# 'v'

获取某个同义词集的所有词条:

1
2
3
4
5
synset = wordnet.synsets("struggling")[0]
synset.lemmas()

# Output:
# [Lemma('fight.v.03.fight'), Lemma('fight.v.03.struggle')]

获取两个同义词集在概念树中的距离:

1
2
3
4
5
synset1 = wordnet.synsets("struggle")[0]
synset1.name() # Output: 'struggle.n.01'
synset2 = wordnet.synsets("fight")[0]
synset2.name() # Output: 'battle.n.01'
synset1.shortest_path_distance(synset2) # Output: 6

参考

Author: yym6472
Link: https://yym6472.github.io/2019/11/06/WordNet调研记录/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.