1.定义
词义消歧(Word-sense disambiguation,简称WSD)是识别在一个句子或其他上下文段落中所指的词义的过程。歧义与消歧是自然语言理解中最核心的问题,在词义、句义、篇章含义层次都会出现语言在上下文语义不同的现象,消歧即根据上下文确定对象语义的过程。词义消歧即在词语层次上的语义消歧。语义消歧(词义消歧)是自然语言处理任务的一个核心与难点,影响了几乎所有任务的性能,比如搜索引擎、意见挖掘、文本理解与产生、推理等。
在语言学长期发展的过程中,语言本身积累了许多一词多义的用法。语言的产生是多方面共同作用的结果。语言的使用是不断变化的,一个词在发展中有许多具体的意思,现在通用的还有一些意思。不同地区可能对一个词有不同的用法,不同的行业对一个词的用法也会不同,甚至不同群体、不同个人、不同语气都会有自己的特殊的解读意思。词义消歧是一种语言理解的方式,一方面我们要理解通用词语一词多义的含义及应用,另一方面,还要考虑到具体场景,运用相关知识库、语料训练来增加一词多义的性能。
2. 任务发展
词义消歧(WSD)是计算语言学最古老的问题之一,最初在机器翻译的早期阶段,即上世纪40年代,被提出作为一个独立的任务。1949年,Warren Weaver在他的有关翻译的备忘录中首次引入了这个问题。随后,Bar-Hillel提出,由于通常需要对所有世界知识建模,WSD无法通过“电子计算机”解决。
在20世纪70年代,WSD是在人工智能领域内发展的语义解释系统的一个子任务。然而,由于当时的WSD系统主要基于规则和手工编码的,它们容易受到知识获取瓶颈的影响。
到了20世纪80年代,出现了大规模的词汇资源,如牛津高级学习词典(OALD),手工编码被从这些资源中自动提取的知识所取代,但消歧仍然是基于知识或基于词典的。
在20世纪90年代,统计学革命推动了计算语言学的发展,WSD成为应用监督机器学习技术的典范问题之一。
到了21世纪初,监督技术的准确性达到了一个瓶颈,因此研究方向转向了更粗粒度的词义、领域适应、半监督和无监督的基于语料库的系统、不同方法的组合,以及通过基于图的方法重新引入基于知识的系统。
近年来,随着深度学习技术的发展、大规模语料库的出现和强大计算资源的可用,词义消歧任务一直在不断演进,研究者们在这一领域取得了显著的进展。
3.主要方法
3.1 基于字典和知识的方法
Lesk算法(1986)是一个具有开创性的基于词典的方法。该算法的基本假设是,文本中一起使用的词是相关的,并且这种关系可以在这些词及其词义的定义中观察到。通过在词典定义中找到具有最大词重叠的一对词义,来对两个(或更多)单词进行消歧。例如,在消除“pine cone”中的词义歧义时,适当词义的定义都包括evergreen和tree这两个词(至少在一个词典中)。另一种类似的方法是寻找两个词之间的最短路径:第二个词在每个第一个词的每个语义变体的定义中迭代搜索,然后在先前定义的每个词的每个语义变体的定义中搜索,依此类推。最后,通过选择使得从第一个词到第二个词的距离最小的语义变体来对第一个词进行消歧。
3.2 监督学习方法
监督的方法基于这样一种假设,即上下文本身就能提供足够的证据来消歧单词(因此,常识和推理被认为是不必要的)。几乎所有的机器学习算法都已应用于 WSD,包括特征选择、参数优化和集成学习等相关技术。支持向量机和基于记忆的学习目前被证明是最成功的方法,这是由于它们能够处理特征空间的高维度。然而,这些监督方法面临着新的知识获取瓶颈,因为它们依赖于大量手动标记词义的语料库进行训练,而这些语料库的创建是费力且昂贵的。
3.3 半监督学习方法
由于缺乏训练数据,许多词义消歧算法使用半监督学习方法,允许同时使用标记和未标记的数据。Yarowsky算法(1995)是这一个早期例子。它利用人类语言的"一义一搭配 "和"一义一话语"特性进行词义消歧——根据观察,在大多数特定的话语和特定的搭配中,词语往往只表现出一种意义。
自举法(Bootstrapping)始于每个词的一小部分种子数据:手动标记的训练示例或一小部分确定的规则。这些种子用于训练监督方法的初始分类器。然后,该分类器用于未标记的语料库,以获取一个更大的训练集。这个过程重复进行,每个新分类器都在一个逐渐变大的训练语料库上进行训练,直到整个语料库被标记,或者达到给定的最大迭代次数。
其他半监督技术使用大量未标记的语料库提供信息,以补充标记的语料库。这些技术有助于将监督模型适应到不同领域。
3.4 无监督学习方法
无监督学习是词义消歧研究者面临的最大挑战。其基本假设是相似的词义出现在相似的上下文中,因此可以通过使用某种上下文相似性度量对单词出现进行聚类来从文本中归纳出词义。然后,可以将新出现的单词分到最接近的聚类/词义中。
通过固定大小的密集向量(词嵌入)考虑单词上下文已成为几个自然语言处理系统中最基本的组成部分之一。尽管大多数传统的词嵌入技术将具有多个含义的词融合为单个向量表示,但它们仍然可以用于改进词义消歧。利用预先计算的词嵌入来表示词义的一个简单方法是计算词义聚类的质心。
除了词嵌入技术,词汇数据库(例如WordNet、ConceptNet、BabelNet)也可以帮助无监督系统将单词及其词义映射为词典。一些结合词汇数据库和词嵌入的技术包括AutoExtend和Most Suitable Sense Annotation(MSSA)。AutoExtend提出了一种方法,将对象的输入表示解析为其属性,例如单词及其词义。AutoExtend使用图结构将单词(例如文本)和非单词(例如WordNet中的同义词集)对象映射为节点,并将节点之间的关系作为边。MSSA利用预训练的词嵌入模型和WordNet中单词义项之间的相似性来选择最合适的词义。对于每个上下文窗口,MSSA通过使用预训练的词嵌入模型对WordNet中的词义定义(即简短的定义和一个或多个用法示例)中的单词向量进行平均,计算出每个词义定义的质心。接着,这些质心被用来选择目标词与其相邻词(即前驱和后继词)之间最高相似度的词义。在所有单词被注释和消歧之后,它们可以作为任何标准词嵌入技术中的训练语料库。在其改进版本中,MSSA可以利用词义嵌入来迭代地重复其消歧过程。
3.5 深度学习方法
一些深度模型,如BEM, GlossBERT等,弥补了传统监督学习中的一些问题,如词义分布不均。这些深度学习算法在词义消歧任务中都有一定的应用,它们的性能取决于数据的质量、模型的架构以及训练过程中的调优策略。
4.典型产品
软件:
Babelfy,一个用于多语言词义消歧和实体链接的系统
BabelNet API,一个基于知识的多语言词义消歧的Java API,使用BabelNet语义网络,支持6种不同语言
WordNet::SenseRelate,一个包含免费、开源的词义消歧和词汇样本词义消歧系统的项目
UKB: 基于图的WSD,一套用于执行基于图的词义消歧和词汇相似性/相关性的程序,使用预先存在的词汇知识库
pyWSD,WSD技术的Python实现
测试:使用NLTK中的Lesk算法进行词义消歧
相关代码:
import nltk
from nltk.corpus import wordnet
from nltk.wsd import lesk
# nltk.download('wordnet')
# nltk.download('punkt')
def simple_disambiguation(sentence, ambiguous_word):
# 使用NLTK中的Lesk算法进行词义消歧
context = nltk.word_tokenize(sentence)
synsets = wordnet.synsets(ambiguous_word)
if synsets:
best_sense = lesk(context, ambiguous_word)
return best_sense.definition()
else:
return "No synsets found for the word '{}'.".format(ambiguous_word)
# 示例句子和多义词
# example_sentence = "The bank was crowded with people making deposits of money."
# example_sentence = "She watched as the ship sailed along the bank of the river."
example_sentence = "The bat flew through the air."
# example_sentence = "He used a bat to hit the ball out of the park."
ambiguous_word = "bat"
# 调用简单的词义消歧函数
result = simple_disambiguation(example_sentence, ambiguous_word)
30. print("Original Sentence: ", example_sentence)
print("Ambiguous Word: ", ambiguous_word)
print("Disambiguated Meaning: ", result)
测试结果:
最后的一些其他的分析:
- 词义消歧技术面对的主要困难有:
- 确定词义:不同词典提供的词义划分不同。词义消歧领域的大部分研究都使用WordNet作为英语的参考词义库。其他语料库还包括Roget's Thesaurus, Wikipedia以及BabelNet、
- 词性标注:词性标注和词义标注是非常相关的,每一个都可能对另一个施加限制。
- 判断差别:词义消歧通常将其得出的结果与人类的结果进行比较来进行测试。但人类进行词义标需要克服许多困难。虽然个人可以记住一个单词的所有可能词性,但个人往往无法记住一个单词可以具有的所有词义。此外,人们在词义标注上并不总是达成一致意见。
- 在上面的测试案例中,可以看出Lesk算法的效果并不理想。在测试”The bat flew through the air.”一句中,bat应该指蝙蝠而不是” the club used in playing cricket”即球杆。不过这毕竟是早期的基于词典的算法。
- 看了一些blog,发现了一个有意思的观点,一个博主认为WSD是NLP的一个难点,但在NLP应用上不是问题。如果以信息抽取作为终极目标,绝大多数的一词多义不是真正的问题,除非这种歧义影响了句子的结构分析(多数词汇歧义并不影响结构分析)。原因在于信息抽取的时候,目标是明确的,建立的规则大多是词汇驱动的,而不是词义类别驱动的,因此歧义在抽取的时候有自动消失的条件。
举例说明:英语 buy 至少有两个义项:(1)购买:Microsoft bought Powerset for $100 million.(2)相信:I am not going to buy his argument.
不做 WSD(Word Sense Disambiguation),也并不影响结构分析:
信息抽取也可以绕开 WSD,譬如,如果抽取的目标是公司购并(company acquisition)事件,下列由buy这几个词驱动的规则一样可以逮住上述(1)的事件,而并不需要对buy先行WSD再行事件抽取。因为事件抽取的条件自动排除了歧义,使得句子(2)不会被误抓为公司购并(argument 不是公司名)。
动词:buy|purchase|acquire
逻辑主语 (Actor):公司名 @1
逻辑宾语 (Undergoer):公司名 @2
==》
《公司并购事件》:
收购公司: @1
被收购公司:@2