nlp - 一种建议不完整句子中的单词列表的 NLP 模型

标签 nlp

我读过一些关于预测句子中缺失单词的论文。我真正想要的是创建一个模型,从不完整的句子中建议单词。

  Example:

  Incomplete Sentence :
  I bought an ___________  because its rainy.

  Suggested Words:
      umbrella
      soup
      jacket

从我读到的期刊中,他们利用 Microsoft Sentence Completion Dataset 来预测句子中缺失的单词。

  Example :

  Incomplete Sentence :

  Im sad because you are __________

  Missing Word Options:
  a) crying
  b) happy
  c) pretty
  d) sad
  e) bad

我不想从选项列表中预测丢失的单词。我想建议一个不完整句子中的单词列表。可行吗?请赐教,因为我真的很困惑。我可以使用什么最先进的模型来从不完整的句子中建议单词列表(语义上连贯)?

是否有必要将建议单词列表作为输出包含在训练数据集中?

最佳答案

这正是 BERT 的方式模型经过训练:屏蔽句子中的一些随机单词,并让您的网络预测这些单词。所以是的,这是可行的。并非如此,没有必要将建议单词列表作为训练输入。然而,这些建议的单词应该是训练该 BERT 的总体词汇的一部分。

我改编了this answer展示补全函数如何工作。

# install this package to obtain the pretrained model
# ! pip install -U pytorch-pretrained-bert

import torch
from pytorch_pretrained_bert import BertTokenizer, BertForMaskedLM

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForMaskedLM.from_pretrained('bert-base-uncased')
model.eval(); # turning off the dropout

def fill_the_gaps(text):
    text = '[CLS] ' + text + ' [SEP]'
    tokenized_text = tokenizer.tokenize(text)
    indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)
    segments_ids = [0] * len(tokenized_text)
    tokens_tensor = torch.tensor([indexed_tokens])
    segments_tensors = torch.tensor([segments_ids])
    with torch.no_grad():
        predictions = model(tokens_tensor, segments_tensors)
    results = []
    for i, t in enumerate(tokenized_text):
        if t == '[MASK]':
            predicted_index = torch.argmax(predictions[0, i]).item()
            predicted_token = tokenizer.convert_ids_to_tokens([predicted_index])[0]
            results.append(predicted_token)
    return results

print(fill_the_gaps(text = 'I bought an [MASK] because its rainy .'))
print(fill_the_gaps(text = 'Im sad because you are [MASK] .'))
print(fill_the_gaps(text = 'Im worried because you are [MASK] .'))
print(fill_the_gaps(text = 'Im [MASK] because you are [MASK] .'))

[MASK] 符号表示缺失的单词(可以有任意数量)。 [CLS][SEP] 是 BERT 特定的特殊标记。这些特定打印的输出是

['umbrella']
['here']
['worried']
['here', 'here']

这种重复并不奇怪——变压器神经网络通常擅长复制单词。从语义的角度来看,这些对称延续看起来确实很有可能。

此外,如果丢失的不是随机单词,而是最后一个单词(或最后几个单词),则可以使用任何语言模型(例如另一个著名的 SOTA 语言模型 GPT-2 )来完成句子.

关于nlp - 一种建议不完整句子中的单词列表的 NLP 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56822991/

相关文章:

nlp - 如何计算音频文件中的口语音节数?

java - 使用 shell 命令运行项目

algorithm - Earley 识别器到 Earley 解析器

machine-learning - 如何初始化词汇表外的词嵌入?

python - 了解 ELMo 的演示次数

java - 用 WordNet 检测专有名词?

java - UMBC 语义相似性实现

objective-c - Objective-C 中的简单自然语言解析器

c# - 如何识别文本中的模式并对其进行分类

python - NLTK 使用的实际例子