¿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)

Fred
fuente
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.

Brian Spiering
fuente
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 ).

noob333
fuente
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
muchachos
fuente