2

我正在尝试编写一个程序,给定一个句子列表,返回最可能的一个。我想使用 GPT-2,但我对使用它很陌生(因为我真的不知道该怎么做)。我计划在给定先前单词的情况下找到单词的概率,并将所有概率相乘以获得该句子出现的总体概率,但是我不知道如何在给定先前单词的情况下找到单词出现的概率. 这是我的(伪)代码:

sentences = # my list of sentences

max_prob = 0
best_sentence = sentences[0]

for sentence in sentences:
    prob = 1 #probability of that sentence

    for idx, word in enumerate(sentence.split()[1:]):
        prob *= probability(word, " ".join(sentence[:idx])) # this is where I need help

    if prob > max_prob:
        max_prob = prob
        best_sentence = sentence

print(best_sentence)

请问我可以帮忙吗?

4

4 回答 4

2
from transformers import GPT2LMHeadModel, GPT2Tokenizer
import numpy as np 


model = GPT2LMHeadModel.from_pretrained('gpt2')
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')

def score(tokens_tensor):
    loss=model(tokens_tensor, labels=tokens_tensor)[0]
    return np.exp(loss.cpu().detach().numpy())

texts = ['i would like to thank you mr chairman', 'i would liking to thanks you mr chair in', 'thnks chair' ]
for text in texts:
    tokens_tensor = tokenizer.encode( text, add_special_tokens=False, return_tensors="pt")           
    print (text, score(tokens_tensor))

此代码片段可能是您正在寻找的示例。你给模型提供一个句子列表,每个句子都打分,越低越好。

上面代码的输出是:

i would like to thank you mr chairman 122.3066
i would liking to thanks you mr chair in 1183.7637
thnks chair 14135.129
于 2020-12-10T21:58:02.810 回答
1

您还可以尝试 lm-scorer,这是一个围绕转换器的小型包装器,允许您使用支持它的模型获取句子概率(在撰写本文时仅实现 GPT2 模型)。

https://github.com/simonepri/lm-scorer

我只是自己使用它并且完美地工作。

警告:如果您在同一环境中使用其他变压器/管道,事情可能会变得一团糟。

于 2021-12-12T16:31:41.797 回答
0

我写了一组函数,可以精确地完成你正在寻找的事情。回想一下,GPT-2 将其输入解析为标记(而不是单词):“Joe flicked the Grasshopper”中的最后一个单词实际上是三个标记:“grass”、“ho”和“pper”。该cloze_finalword函数将这一点考虑在内,并计算所有标记的概率(以出现在它们之前的标记为条件)。您可以调整此函数的一部分,以便它返回您正在寻找的内容。我希望你发现代码有用!

于 2021-03-27T17:15:04.930 回答
-3

我认为 GPT-2 对于你想要实现的目标来说有点过分了。您可以构建一个基本语言模型,该模型将使用NLTK为您提供句子概率。可以在这里找到一个教程。

于 2020-09-18T15:48:04.383 回答