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



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

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

希望我能够收到这方面的想法或解决方案。任何帮助,不胜感激。谢谢。

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.convert_ids_to_tokens(prediction[2].numpy().tolist()))

它打印令牌编号 11581,即:

披 头 士

为了获得BERT词汇表的归一化概率分布,您可以使用softmax函数对数进行归一化,即F.softmax(logits, dim=1),(假设标准import torch.nn.fucntional as F(。

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