用于理解上下文单词的自然语言处理技术

Natural Language Processing techniques for understanding contextual words

取下面这句话:

I'm going to change the light bulb

change的意思就是replace,就像有人要换灯泡一样。这可以很容易地通过使用字典 api 或类似的东西来解决。然而,下面的句子

I need to go the bank to change some currency

You need to change your screen brightness

第一句不再是replace的意思,而是Exchange的意思,第二句change的意思是adjust

如果您想在这种情况下理解 change 的含义,有人会使用什么技术根据句子的上下文提取正确的定义?我想做的事情叫什么?

请记住,输入只能是一个句子。所以像:

Screen brightness is typically too bright on most peoples computers.
People need to change the brightness to have healthier eyes.

不是我要解决的问题,因为你可以用前面的句子来设置上下文。这也适用于很多不同的词,而不仅仅是 change.

这个词

感谢您的建议。

编辑: 我知道各种嵌入模型可以帮助深入了解这个问题。如果这是你的答案,你如何解释返回的词嵌入?这些数组的长度可能超过 500+,这在解释上是不切实际的。

我不知道这有什么用,但从我的 POV 来看,词向量嵌入是自然分离的,样本中的位置 space 与词的不同用法密切相关。但是就像你经常说的那样,一个词可能会在多种情况下使用。


为了解决这个问题,通常利用上下文的编码技术,如连续的词袋,或连续的 skip gram 模型,用于对特定上下文中单词的使用进行分类,如交换或调整的变化。这个想法也适用于基于 LSTM 的架构或在输入序列上保留上下文的 RNN。


词向量的解释从可视化的角度来看并不实用,而只能从 'relative distance' 样本中其他词的角度 space。另一种方法是维护一个语料库矩阵,其中为该矩阵中的单词表示上下文使用。 事实上,有一个神经网络利用双向语言模型首先预测即将到来的单词,然后在句子末尾返回并尝试预测前一个单词。它叫做 ELMo。你应该看看论文。ELMo Paper and this blog


模型自然会从代表性示例中学习。因此,您为同一个词的不同用法提供的训练集越好,模型就可以学会利用上下文为该词赋予意义。通常这是人们通过使用以领域为中心的训练数据来解决他们的特定案例的方法。

我认为这些可能会有所帮助: 词表示的有效估计 矢量Space

您正在尝试做的事情叫做 Word Sense Disambiguation. It's been a subject of research for many years, and while probably not the most popular problem it remains a topic of active research。即使是现在,仅选择最常见的单词含义也是一个强大的基准。

词嵌入可能有用,但它们的使用与您在此处尝试做的事情正交。

这里有一些来自 pywsd 的示例代码,Python 库实现了一些经典技术:

>>> from pywsd.lesk import simple_lesk
>>> sent = 'I went to the bank to deposit my money'
>>> ambiguous = 'bank'
>>> answer = simple_lesk(sent, ambiguous, pos='n')
>>> print answer
Synset('depository_financial_institution.n.01')
>>> print answer.definition()
'a financial institution that accepts deposits and channels the money into lending activities'

这些方法大多有点陈旧,我无法评价它们的质量,但这至少是一个很好的起点。

词义通常来自 WordNet

正如另一个答案中提到的,像 BERT 这样的预训练语言模型可能对此很有用。这些模型根据上下文生成表示。

最近的预训练语言模型使用词块,但 spaCy 有一个实现将它们与自然语言标记对齐。例如,有可能根据上下文检查不同标记的相似性。来自 https://explosion.ai/blog/spacy-transformers

的示例
import spacy
import torch
import numpy

nlp = spacy.load("en_trf_bertbaseuncased_lg")
apple1 = nlp("Apple shares rose on the news.")
apple2 = nlp("Apple sold fewer iPhones this quarter.")
apple3 = nlp("Apple pie is delicious.")
print(apple1[0].similarity(apple2[0]))  # 0.73428553
print(apple1[0].similarity(apple3[0]))  # 0.43365782