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

Posted

技术标签:

【中文标题】如何在给定上下文的句子中获取特定标记(单词)的概率【英文标题】:How to get the probability of a particular token(word) in a sentence given the context 【发布时间】:2020-08-30 10:14:18 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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 是:

披头士乐队

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

【讨论】:

感谢您的回答。我想知道我是否可以根据单词的概率预测将 [MASK] 标记放置在损坏的句子中的位置,以便可以使用掩码语言建模来预测 [MASK] 标记,以获得正确干净且语法正确的句子。 @D.Perera 您可能会发现this 的工作很有趣。您只需要拥有大量的替代编辑空间,然后使用给定概率的模型和贪婪搜索来选择最佳编辑。

以上是关于如何在给定上下文的句子中获取特定标记(单词)的概率的主要内容,如果未能解决你的问题,请参考以下文章

如何通过C#中的特定片段从句子中提取整个单词?

概率图模型导论

识别句子中单词的上下文

使用Berkeley Parser进行句法分析

如何修改与 Python 中特定正则表达式匹配的文本?

如何从句子中标记的word2vec中获取句子的向量