python有没有好的开箱即用的语言模型?

数据挖掘 Python nlp 语言模型
2021-10-07 01:34:24

我正在对应用程序进行原型设计,我需要一个语言模型来计算一些生成的句子的困惑度。

python中有没有我可以轻松使用的训练有素的语言模型?像这样简单的东西

model = LanguageModel('en')
p1 = model.perplexity('This is a well constructed sentence')
p2 = model.perplexity('Bunny lamp robert junior pancake')
assert p1 < p2

我查看了一些框架,但找不到我想要的。我知道我可以使用类似的东西:

from nltk.model.ngram import NgramModel
lm = NgramModel(3, brown.words(categories='news'))

这在布朗语料库上使用了一个很好的图灵概率分布,但我在一些大数据集上寻找一些精心设计的模型,比如 1b 单词数据集。我实际上可以信任一般域的结果(不仅是新闻)

4个回答

由于@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

我认为接受的答案是不正确的。

token.prob 是特定类型令牌的日志概率。我猜“类型”是指类似于 POS 标签或命名实体类型(从 spacy 的文档中不清楚),并且分数是所有类型空间的置信度度量。

语言模型分配的概率不同。语言模型为您提供所有可能标记(而不是类型)的概率分布,说明接下来哪些标记最有可能出现。

这个 repo 有关于使用 BERT(一种最先进的模型)和神经网络的预训练权重的非常好的文档,

我认为 API 不会直接给您带来困惑,但您应该能够很容易地获得每个令牌的概率分数。

spaCy包有许多语言模型,包括在Common Crawl上训练的语言模型

语言模型在自然语言处理 (NlP) 中具有特定的含义。语言模型是令牌序列上的概率分布。给定特定的标记序列,模型可以分配该序列出现的概率。SpaCy 的语言模型不仅仅包含概率分布。

需要安装 spaCy 包并且需要下载语言模型:

$ pip install spacy 
$ python -m spacy download en

然后语言模型可以与几行 Python 一起使用:

>>> import spacy
>>> nlp = spacy.load('en')

对于给定的模型和令牌,可以通过以下方式找到令牌单词类型的平滑对数概率估计:token.prob属性。

您可以使用lm_scorer包来计算使用 GPT-2 模型的语言模型概率。

首先将软件包安装为:

pip install lm-scorer

然后,您可以通过指定模型大小来创建记分器。

from lm_scorer.models.auto import AutoLMScorer
scorer = AutoLMScorer.from_pretrained("gpt2-large")

def score(sentence):
    return scorer.sentence_score(sentence)

将其应用于您的文本,您将获得概率。

>>> score('good luck')
8.658163769270644e-11

如果您想了解更多详细信息,还可以参考我不久前写的一篇博文。