如何在给定上下文的情况下获得句子中特定标记(单词)的概率

D.P*_*era 4 nlp pytorch bert-language-model huggingface-transformers

我正在尝试使用 NLP 计算句子中单词的概率或任何类型的分数。我已经使用 Huggingface Transformers 库对 GPT2 模型尝试了这种方法,但是,由于模型的单向性质,我无法在上下文中进行预测,因此无法获得令人满意的结果。所以我想知道是否有办法使用 BERT 计算上述内容,因为它是双向的。

我发现这篇文章相关,我前几天随机看到的,但没有看到任何对我有用的答案。

希望我能够收到想法或解决方案。任何帮助表示赞赏。谢谢你。

Jin*_*ich 5

BERT 被训练为掩码语言模型,即它被训练来预测被标记替换的[MASK]标记。

from transformers import AutoTokenizer, BertForMaskedLM

tok = AutoTokenizer.from_pretrained("bert-base-cased")
bert = BertForMaskedLM.from_pretrained("bert-base-cased")

input_idx = tok.encode(f"The {tok.mask_token} were the best rock band ever.")
logits = bert(torch.tensor([input_idx]))[0]
prediction = logits[0].argmax(dim=1)
print(tok.ids_to_tokens[prediction[2].numpy().tolist()])
Run Code Online (Sandbox Code Playgroud)

它打印令牌号。11581 即:

披头士乐队

棘手的是,单词可能会被拆分为多个子单词。您可以模拟添加多个[MASK]标记,但是您会遇到如何可靠地比较不同长度的预测分数的问题。我可能会平均概率,但也许有更好的方法。