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

3

请看以下句子:

I'm going to change the light bulb

Change的意思是替换,例如有人要替换灯泡。可以使用字典API或类似的工具轻松解决这个问题。然而,以下句子

I need to go the bank to change some currency

You need to change your screen brightness

第一句话不再意味着“替换”,而是意味着“交换”,第二句话,“更改”意味着“调整”。如果您试图理解这种情况中“更改”的含义,那么基于上下文语境萃取正确定义的技巧是什么?我正在尝试做什么?请注意,输入只有一句话。
Screen brightness is typically too bright on most peoples computers.
People need to change the brightness to have healthier eyes.

这不是我试图解决的问题,因为您可以使用前面的句子来设置上下文。而且,这将适用于许多不同的单词,而不仅仅是“change”这个词。

感谢建议。

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

3个回答

2
你试图做的是词义消歧。这已经是多年的研究课题了,虽然可能不是最受欢迎的问题,但它仍然是一个活跃研究主题。即使现在,只选择一个词的最常见意义也是一种强有力的基线。
词嵌入可能是有用的,但它们的使用与你在这里尝试做的事情无关。
这是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

看起来是一个非常好的开始。我真的很感激这个答案。 - Landon G

1
我不知道这有多有用,但是从我的角度来看,词向量嵌入自然地分离,并且样本空间中的位置与单词的不同用法密切相关。然而,正如你所说,一个单词经常会在几个上下文中使用。
为了解决这个目的,通常使用利用上下文的编码技术,如连续词袋或连续跳跃模型,用于对特定上下文中单词的用法进行分类,例如将“change”用于交换还是调整。这个思想也被应用在基于LSTM的架构或RNN中,其中上下文被保留在输入序列中。
从可视化角度来看,词向量的解释并不实用,但从与样本空间中其他单词的“相对距离”角度来看则很实用。另一种方法是维护一个语料库矩阵,表示该矩阵中的单词的上下文使用情况。 事实上,有一个神经网络利用双向语言模型首先预测即将出现的单词,然后在句子末尾返回并尝试预测前面的单词。它被称为ELMo。您应该仔细阅读这篇论文ELMo Paper和这个blog
自然地,模型从代表性例子中学习。因此,您提供的训练集越好,包含相同单词的多种用法,模型就能更好地学习利用上下文将含义附加到单词上。通常,这是人们使用领域特定训练数据来解决特定情况的方法。
我认为这些可能会有所帮助: 向量空间中单词表示的高效估计

谢谢你的回答。我听说过Elmo、BERT和其他流行的嵌入模型,它们似乎是这个问题的逻辑解决方案。只是好奇,你知道有没有从视觉角度来看更简单的技术吗?例如,如果有一个类似于Elmo的模型,但返回一个10元素数组,大多数人只需从外观上看就知道句子不同了。我可能在描述一些目前不可能的东西(我还在学习嵌入的内部细节)。 - Landon G
你可以通过添加一两个层来修改架构,将输出处理为较低维度。但这可能会影响模型的准确性。我曾经尝试过使用较低维度的Word-2-vec模型,但经过长时间的训练后,发现这是一种浪费。更高的维度保护相似性,同时突出差异,考虑到我们可以在语料库中拥有多少单词。限制为10-D矢量会使其更加困难。但是,您可以对不同上下文中相同单词的输出进行后处理,并使其变得更简单。 - Sushant

0

预训练语言模型(如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

谢谢你的回答。这不是在比较整个句子,而是只有关键词 Apple - Landon G
不,这是在所有句子中比较索引为0的标记“Apple”的基于上下文的嵌入。您可以查看我链接的文章以了解更多细节。 - cookiemonster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接