¿Hay algún buen modelo de lenguaje listo para usar para Python?


11

Estoy creando prototipos de una aplicación y necesito un modelo de lenguaje para calcular la perplejidad en algunas oraciones generadas.

¿Hay algún modelo de lenguaje entrenado en Python que pueda usar fácilmente? Algo simple como

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

He visto algunos marcos pero no he podido encontrar lo que quiero. Sé que puedo usar algo como:

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

Esto utiliza una buena distribución de probabilidad de turing en Brown Corpus, pero estaba buscando un modelo bien diseñado en algún conjunto de datos grande, como el conjunto de datos de 1b palabras. Algo en lo que realmente puedo confiar en los resultados para un dominio general (no solo noticias)

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 


Bueno, esto no se puede usar fácilmente, pero es algo. Gracias :)
Fred

Es un modelo pre-entrenado que simplemente puede descargar y ejecutar, y cree que "no se puede usar fácilmente" ...
user12075

Creo que usted y yo tenemos definiciones muy diferentes de lo que significa "fácilmente utilizable" ... Necesitaría descubrir cómo obtener las operaciones de flujo de tensor que quiero (entrada y salida) y cómo se comportan, averiguar si hay algún preprocesamiento para esto y luego envolver todo en alguna función de perplejidad. No digo que no pueda hacerlo, solo digo que no es en absoluto la función "fácilmente utilizable" que mostré. Pero de nuevo, gracias por el puntero
Fred

¿Has probado google? Escuché que obtienen una buena cantidad de datos :) No estoy seguro si tienen las métricas exactas que busca. cloud.google.com/natural-language/docs
flyingmeatball

Respuestas:


5

El paquete spaCy tiene muchos modelos de idiomas , incluidos los formados en Common Crawl .

El modelo del lenguaje tiene un significado específico en el procesamiento del lenguaje natural (NlP). Un modelo de lenguaje es una distribución de probabilidad sobre secuencias de tokens. Dada una secuencia específica de tokens, el modelo puede asignar una probabilidad de que aparezca esa secuencia. Los modelos de lenguaje de SpaCy incluyen más que solo una distribución de probabilidad.

Es necesario instalar el paquete spaCy y descargar los modelos de idiomas:

$ pip install spacy 
$ python -m spacy download en

Luego, los modelos de lenguaje pueden usarse con un par de líneas de Python:

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

Para un modelo y token dados, se puede encontrar una estimación de probabilidad de registro suavizada del tipo de palabra de un token con: token.probatributo.


Eliminé mis comentarios anteriores ... Aparentemente, spacy incluye un modelo de lenguaje apropiado (usando el token.probatributo), pero solo está construido en la versión de modelo grande. Si edita su respuesta para incluir esa información, puedo darle la recompensa. Curiosamente, he estado usando spacy durante meses y en ninguna parte vi que tenía esta característica
Fred

👍 Me alegra que hayas encontrado algo que funcione para ti.
Brian Spiering

De nuevo ... Esto solo funciona si descargas el modelo inglés grande
Fred

6

Creo que la respuesta aceptada es incorrecta.

token.prob es el log-prob del token que es un tipo particular. Supongo que 'tipo' se refiere a algo como la etiqueta POS o el tipo de entidad con nombre (no está claro en la documentación de spacy) y el puntaje es una medida de confianza en el espacio de todos los tipos.

Esto no es lo mismo que las probabilidades asignadas por un modelo de lenguaje. Un modelo de lenguaje le brinda la distribución de probabilidad sobre todos los tokens posibles (no el tipo) que dice cuál de ellos es más probable que ocurra a continuación.

Este repositorio tiene bastante buena documentación sobre el uso de BERT (un modelo de última generación) con pesos pre-entrenados para la red neuronal,

Creo que las API no le dan perplejidad directamente, pero debería poder obtener puntajes de probabilidad para cada token con bastante facilidad ( https://github.com/huggingface/pytorch-pretrained-BERT#usage ).


4

También creo que la primera respuesta es incorrecta por las razones que @ noob333 explicó.

Pero también Bert no se puede usar fuera de la caja como modelo de lenguaje. Bert te da p(word|context(both left and right) )y lo que quieres es calcular p(word|previous tokens(only left contex)). El autor explica aquí: https://github.com/google-research/bert/issues/35 por qué no puede usarlo como una película.

Sin embargo, puede adaptar Bert y usarlo como modelo de lenguaje, como se explica aquí: https://arxiv.org/pdf/1902.04094.pdf

Pero puede usar los modelos abiertos ai gpt o gpt-2 del mismo repositorio ( https://github.com/huggingface/pytorch-pretrained-BERT )

Aquí es cómo puede calcular la perplejidad utilizando el modelo 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.