由于@noob333 解释的原因,我还认为第一个答案是不正确的。
但 Bert 也不能作为语言模型开箱即用。Bert 给你p(word|context(both left and right) )
,你想要的是计算p(word|previous tokens(only left contex))
。作者在这里解释了为什么不能将它用作lm。
但是,您可以调整 Bert 并将其用作语言模型,如此处所述。
但是您可以使用来自同一个repo的 open ai gpt 或 gpt-2 预存模型
这是使用 gpt 模型计算困惑度的方法。
import math
from pytorch_pretrained_bert import OpenAIGPTTokenizer, OpenAIGPTModel, OpenAIGPTLMHeadModel
# Load pre-trained model (weights)
model = OpenAIGPTLMHeadModel.from_pretrained('openai-gpt')
model.eval()
# Load pre-trained model tokenizer (vocabulary)
tokenizer = OpenAIGPTTokenizer.from_pretrained('openai-gpt')
def score(sentence):
tokenize_input = tokenizer.tokenize(sentence)
tensor_input = torch.tensor([tokenizer.convert_tokens_to_ids(tokenize_input)])
loss=model(tensor_input, lm_labels=tensor_input)
return math.exp(loss)
a=['there is a book on the desk',
'there is a plane on the desk',
'there is a book in the desk']
print([score(i) for i in a])
21.31652459381952, 61.45907380241148, 26.24923942649312