【问题标题】:How to generate a list of tokens that are most likely to occupy the place of a missing token in a given sentence?如何生成最有可能在给定句子中占据缺失标记位置的标记列表?
【发布时间】:2021-03-02 10:41:12
【问题描述】:

如何生成最有可能在给定句子中占据缺失标记位置的标记列表?

我找到了这个StackOverflow answer,但是,它只会生成一个可能的单词,并且不是一个列表适合该句子的单词。我尝试打印出每个变量,看看他是否可能生成了所有可能的单词,但没有运气。

例如,

>>> sentence = 'Cristiano Ronaldo dos Santos Aveiro GOIH ComM is a Portuguese professional [].' # [] is missing word
>>> generate(sentence)
['soccer', 'basketball', 'tennis', 'rugby']

【问题讨论】:

  • 对于您的问题中引用的答案中生成的单词,可能有一种方法可以将单词分配给变量和/或将其附加到列表中。您尝试过这种方法吗?
  • @etch_45 我试过了,但我认为我做得不对。如果您能给我一些方法,那就太好了。
  • 如果您可以使用您尝试过的代码编辑问题 - 这将有助于审查和调试。
  • @etch_45 我试过了,但似乎没有用。

标签: python nlp nltk spacy bert-language-model


【解决方案1】:

我刚刚使用 BERT-base-uncased 模型在 model hub of HuggingFace 上试用了您的示例,它会生成一个可能的令牌列表:

我可以写一个 Colab 笔记本来解释如何编写代码。每个神经网络总是输出一个概率分布,所以你可以只返回概率最高的token。

【讨论】:

    【解决方案2】:

    您基本上可以执行与this answer 相同的操作,但不要只添加最合适的标记,而是以五个最合适的标记为例:

    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]':
                #instead of argmax, we use argsort to sort the tokens which best fit
                predicted_index = torch.argsort(predictions[0, i], descending=True)
                tokens = []
                #the the 5 best fitting tokens and add the to the list
                for k in range(5):
                     predicted_token = tokenizer.convert_ids_to_tokens([predicted_index[k].item()])[0]
                    tokens.append(predicted_token)
                results.append(tokens)
        return results
    

    对于你的句子,结果为:[['footballer', 'golfer', 'football', 'cyclist', 'boxer']]

    【讨论】:

      猜你喜欢
      • 2019-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多