【问题标题】:Natural Language Processing techniques for understanding contextual words用于理解上下文词的自然语言处理技术
【发布时间】:2020-04-03 07:11:04
【问题描述】:

取下面的句子:

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+,这在解释上是不切实际的。

【问题讨论】:

    标签: machine-learning deep-learning nlp word-embedding linguistics


    【解决方案1】:

    您尝试执行的操作称为Word Sense Disambiguation。多年来,它一直是研究的主题,虽然它可能不是最流行的问题 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

    【讨论】:

    • 似乎是一个非常好的开始。我非常感谢您的回答
    【解决方案2】:

    我不知道这有多大用处,但从我的 POV 来看,词向量嵌入是自然分离的,并且样本空间中的位置与该词的不同用途密切相关。但是,就像您经常说的那样,一个词可能会在多种情况下使用。


    为了解决这个目的,通常利用上下文的编码技术(如连续词袋或连续跳过语法模型)用于对特定上下文中的单词用法进行分类,例如用于交换或调整的更改。这个想法也适用于基于 LSTM 的架构或在输入序列上保留上下文的 RNN。


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


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

    我认为这些可能会有所帮助: Efficient Estimation of Word Representations in Vector Space

    【讨论】:

    • 感谢您的回答。我听说过 Elmo、BERT 和其他流行的嵌入模型,它们似乎是这个问题的逻辑解决方案。只是好奇,你知道从视觉角度来看更简单的任何技术吗?因此,例如,如果有一个类似于 Elmo 的模型,但不是一个巨大的 500+ 数组,它会返回一个 10 元素数组,大多数人只要看到它就会知道句子是不同的。我可能正在描述目前不可能的事情(我仍在学习嵌入的来龙去脉)
    • 嗯,您总是可以通过添加一两层来修改架构以将输出处理到较低维度。但是,它可能会损害模型的准确性。前段时间我尝试使用较低维度的 Word-2-vec 模型,但经过长时间的训练,结果证明这是一种浪费。考虑到我们在语料库中可以拥有的单词数量,更高的维度可以保护相似性,同时突出差异。限制为 10 维向量会使其变得困难。但同样,您可以在不同的上下文中发布相同单词的处理输出并进行更简单的表示
    【解决方案3】:

    正如另一个答案中提到的,像 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
    • 不,这是在所有句子中将标记“Apple”的基于上下文的嵌入与 index=0 进行比较。您可以查看我链接的文章了解更多详细信息
    最近更新 更多