また、@ noob333が説明した理由により、最初の答えは正しくないと思います。
しかし、Bertをそのまま言語モデルとして使用することはできません。バートはあなたにあなたに与え、あなたp(word|context(both left and right) )
が望むのは計算することですp(word|previous tokens(only left contex))
。著者はここで説明します:https : //github.com/google-research/bert/issues/35なぜそれをlmとして使用できないのですか?
ただし、https://arxiv.org/pdf/1902.04094.pdfで説明されているように、Bertを適応させて言語モデルとして使用できます。
ただし、同じリポジトリのオープンAI GPTまたはGPT-2事前保持モデルを使用できます(https://github.com/huggingface/pytorch-pretrained-BERT)
これは、gptモデルを使用してperplexityを計算する方法です(https://github.com/huggingface/pytorch-pretrained-BERT/issues/473)
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