是否有适用于python的好的即用型语言模型?


11

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

我可以随时使用经过训练的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'))

这在Brown Corpus上使用了很好的图林概率分布,但是我正在一些大型数据集(例如1b单词数据集)上寻找精心设计的模型。我可以真正相信一般领域的结果(不仅是新闻)

python  nlp  language-model  r  statistics  linear-regression  machine-learning  classification  random-forest  xgboost  python  sampling  data-mining  orange  predictive-modeling  recommender-system  statistics  dimensionality-reduction  pca  machine-learning  python  deep-learning  keras  reinforcement-learning  neural-network  image-classification  r  dplyr  deep-learning  keras  tensorflow  lstm  dropout  machine-learning  sampling  categorical-data  data-imputation  machine-learning  deep-learning  machine-learning-model  dropout  deep-network  pandas  data-cleaning  data-science-model  aggregation  python  neural-network  reinforcement-learning  policy-gradients  r  dataframe  dataset  statistics  prediction  forecasting  r  k-means  python  scikit-learn  labels  python  orange  cloud-computing  machine-learning  neural-network  deep-learning  rnn  recurrent-neural-net  logistic-regression  missing-data  deep-learning  autoencoder  apache-hadoop  time-series  data  preprocessing  classification  predictive-modeling  time-series  machine-learning  python  feature-selection  autoencoder  deep-learning  keras  tensorflow  lstm  word-embeddings  predictive-modeling  prediction  machine-learning-model  machine-learning  classification  binary  theory  machine-learning  neural-network  time-series  lstm  rnn  neural-network  deep-learning  keras  tensorflow  convnet  computer-vision 


好吧,这根本不是立即可用的,而是某种东西。谢谢:)
弗雷德

这是一个经过预先训练的模型,您可以简单地下载并运行它,并且您认为这“根本无法立即使用” ...
user12075

我认为您和我对“易于使用”的含义有非常不同的定义...我将需要弄清楚如何获取所需的tensorflow操作(输入和输出)以及它们的行为方式,弄清楚是否需要进行任何预处理然后将所有内容包装在一些困惑函数中。我并不是说我做不到,而是说它根本不是我展示的“易于使用”功能。但是,再次感谢您的指点
Fred

您尝试过Google吗?我听说他们得到了大量数据:)不知道它们是否具有您要遵循的准确指标。cloud.google.com/natural-language/docs
flyingmeatball

Answers:


5

spaCy包有多个语言模型,包括那些受过训练的常见抓取

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

需要安装spaCy软件包,并需要下载语言模型:

$ pip install spacy 
$ python -m spacy download en

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

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

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


删除了我之前的评论...显然,spacy确实包含适当的语言模型(使用token.prob属性),但是仅在大型模型版本中构建。如果您编辑答案以包含该信息,我可以给您赏金。够有趣的是,我已经使用spacy数月了,无处不见它具有此功能
Fred

👍很高兴您找到了适合自己的东西。
Brian Spiering 18/09/29

再次..如果你下载的大量英文模式这仅适用
弗雷德

6

我认为接受的答案是错误的。

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

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

此回购提供了关于将BERT(最新模型)与神经网络进行预先训练的权重结合使用的相当不错的文档,

我认为API不会直接给您带来困惑,但是您应该能够很容易地获得每个令牌的概率分数(https://github.com/huggingface/pytorch-pretrained-BERT#usage)。


4

我也认为由于@ 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。

但是,您可以调整Bert并将其用作语言模型,如下所述:https : //arxiv.org/pdf/1902.04094.pdf

但是您可以使用来自同一仓库的开放式AI gpt或gpt-2预置模型(https://github.com/huggingface/pytorch-pretrained-BERT

这是您可以使用gpt模型计算困惑的方法(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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.