快速浏览
使用WordNet和Lesk算法进行英文消歧义的Python实现
作者:牛伯雨
概览
英文中有一个用来消歧义的经典算法——Lesk算法。实现这一算法需要一个重要零组件:WordNet。Lesk算法还有一个简化版本,我们也会在后面讨论。
WordNet
初识WordNet
WordNet 1 2,顾名思义,word“词”,net“网”,它是由很多单词组成的网,是一个庞大的英文词汇库。单词与单词之间通过其语义相连,所以利用这一工具,我们可以快速查阅一个词的上位词(比如“机器”machine是“计算机”computer的上位词,因为计算机是一种机器),下位词(比如“服务器”server是“计算机”computer的下位词,因为服务器是一种计算机),近义词等,对于需要学英语的朋友们来说也是个能助力快速扩充词汇量的好帮手。
WordNet 有网页版,可以进行鼠标操作,界面简洁友好;我们在Python中也可以利用NLTK包来进行调取。接下来,我们就简单介绍它在Python当中的一般用法。
WordNet 在 Python 中的使用
首先调用NLTK中的WordNet:
from nltk.corpus import wordnet as wn
而后我们就可以对wn进行一些基本操作了。
需要说明的是,WordNet是以近义词集合(synset, synonym set的缩合写法)为基础的。比如说我们可以查看英文单词“snow",看它有多少含义:
synsetExample = wn.synsets("snow")
我们可以查看到结果:
[Synset('snow.n.01'),
Synset('snow.n.02'),
Synset('snow.n.03'),
Synset('coke.n.03'),
Synset('snow.v.01'),
Synset('bamboozle.v.01')]
两个点之间的n代表名词,v代表动词,所以在这个数据库中,snow有四个名词含义,两个动词含义。
WordNet的一个强大之处是,我们可以调取每个含义的文字定义。比如snow的第一个名词含义是上面列表的首个元素,因此
wn.synset(synsetExample[0].name()).definition()
返回结果是其定义
'precipitation falling from clouds in the form of ice crystals'
同理,调取第一个动词含义(即列表标号为4的元素)的定义:
wn.synset(synsetExample[4].name()).definition()
返回结果:
'fall as snow'
利用WordNet,我们还可以找上位词,下位词,近义词等,但是使用Lesk算法我们只需要能调出一个词的各个含义的定义即可。
Lesk算法
Lesk算法经典版
这个算法虽然以Lesk命名,但Lesk本人却表示这个算法最初是Millar和Urdang提出的3。
假设需要消歧义的词为 w w w,Lesk算法的基本思想可以用三个英文词概括:
(1) context,即 w w w周围的词 v j v_j vj,…, v m v_m vm所组成的集合 C C C,比如 w w w同一句子里的其他词;
(2) definition,即 w w w的每个含义 s i s_i si的字典定义 D i D_i Di,以及 w w w周围所有词 v j v_j vj,…, v m v_m vm的所有含义的定义的集合。假设 s j 1 s_{j_1}