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



取以下句子:

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+,这不切实际地解释。

您要执行的操作称为词义消歧。多年来,它一直是研究的主题,虽然可能不是最受欢迎的问题,但它仍然是一个积极研究的主题。即使是现在,仅仅选择一个词的最常识也是一个强有力的基线。

单词嵌入可能很有用,但它们的使用与您在此处尝试执行的操作是正交的。

以下是来自pywsd的一些示例代码,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。

我不知道这有多大用处,但从我的 POV 来看,词向量嵌入是自然分离的,样本空间中的位置与这个词的不同用法密切相关。然而,就像你经常说的那样,一个词可以在几个上下文中使用。


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


可视化的角度来看,词向量的解释是不切实际的,而只能从样本空间中其他单词的"相对距离"角度进行解释。另一种方法是维护语料库的矩阵,并表示该矩阵中的单词的上下文用途。 事实上,有一个神经网络利用双向语言模型首先预测即将到来的单词,然后在句子结束时返回并尝试预测前一个单词。它被称为ELMo。你应该仔细阅读这篇论文。ELMo Paper 和此博客


当然,该模型从具有代表性的例子中学习。因此,你对同一个单词的不同用法给出的训练集越好,更好的模型就可以学会利用上下文为单词附加意义。通常,这是人们通过使用以领域为中心的训练数据来解决其特定案例的方法。

我认为这些可能会有所帮助: 有效估计单词表示 向量空间

像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

最新更新