Esistono buoni modelli linguistici predefiniti per Python?


11

Sto prototipando un'applicazione e ho bisogno di un modello linguistico per calcolare la perplessità su alcune frasi generate.

Esiste un modello di linguaggio addestrato in Python che posso usare facilmente? Qualcosa di semplice come

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

Ho esaminato alcuni framework ma non sono riuscito a trovare quello che volevo. So di poter usare qualcosa come:

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

Questo utilizza una buona distribuzione di probabilità turing su Brown Corpus, ma stavo cercando un modello ben realizzato su alcuni grandi set di dati, come il set di dati di parole 1b. Qualcosa di cui posso davvero fidarmi dei risultati per un dominio generale (non solo notizie)

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 


Bene, questo non è affatto facilmente utilizzabile, ma è qualcosa. Grazie :)
Fred,

Questo è un modello pre-addestrato che puoi semplicemente scaricare ed eseguire, e pensi che "non sia prontamente utilizzabile" ...
user12075

Penso che tu e io abbiamo definizioni molto diverse di cosa significhi "prontamente utilizzabile" ... Avrei bisogno di capire come ottenere le operazioni tensorflow che desidero (input e output) e come si comportano, capire se c'è qualche pre-elaborazione questo e poi avvolgi tutto in qualche funzione di perplessità. Non sto dicendo che non posso farlo, sto solo dicendo che non è affatto la funzione "facilmente utilizzabile" che ho mostrato. Ma ancora una volta, grazie per il puntatore
Fred,

Hai provato google? Ho sentito che ricevono una discreta quantità di dati :) Non sono sicuro che abbiano le metriche esatte che stai cercando. cloud.google.com/natural-language/docs
flyingmeatball

Risposte:


5

Il pacchetto spaCy ha molti modelli linguistici , compresi quelli addestrati sulla scansione comune .

Il modello linguistico ha un significato specifico nell'elaborazione del linguaggio naturale (NlP). Un modello di linguaggio è una distribuzione di probabilità su sequenze di token. Data una specifica sequenza di token, il modello può assegnare una probabilità che appaia quella sequenza. I modelli linguistici di SpaCy includono molto più di una semplice distribuzione di probabilità.

Il pacchetto spaCy deve essere installato e i modelli di lingua devono essere scaricati:

$ pip install spacy 
$ python -m spacy download en

Quindi i modelli di linguaggio possono essere usati con un paio di righe di Python:

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

Per un determinato modello e token, esiste una stima della probabilità di registro livellata del tipo di parola di un token che può essere trovata con: token.probattributo.


Eliminato i miei commenti precedenti ... Apparentemente spacy include un modello di linguaggio corretto (usando l' token.probattributo), ma è costruito solo nella versione di modello grande. Se modifichi la tua risposta per includere quelle informazioni, posso darti la generosità. Abbastanza divertente, sto usando spacy da mesi ormai e da nessuna parte ho visto che aveva questa funzione
Fred,

👍 Sono contento che tu abbia trovato qualcosa che funziona per te.
Brian Spiering,

Ancora .. Funziona solo se scarichi il grande modello inglese
Fred,

6

Penso che la risposta accettata sia errata.

token.prob è il log-prob del token che è un tipo particolare. Immagino che "tipo" si riferisca a qualcosa come il tag POS o il tipo di entità denominata (non è chiaro dalla documentazione di Spacy) e il punteggio è una misura di confidenza sullo spazio di tutti i tipi.

Questo non è lo stesso delle probabilità assegnate da un modello linguistico. Un modello linguistico ti offre la distribuzione delle probabilità su tutti i possibili token (non il tipo) che dice quale di essi è più probabile che accada successivamente.

Questo repository ha una documentazione piuttosto interessante sull'uso di BERT (un modello all'avanguardia) con pesi pre-allenati per la rete neurale,

Penso che le API non ti diano direttamente perplessità ma dovresti essere in grado di ottenere abbastanza facilmente i punteggi di probabilità per ogni token ( https://github.com/huggingface/pytorch-pretrained-BERT#usage ).


4

Penso anche che la prima risposta sia errata per le ragioni spiegate da @ noob333.

Ma anche Bert non può essere utilizzato come modello di linguaggio. Bert ti dà il p(word|context(both left and right) )e quello che vuoi è calcolare p(word|previous tokens(only left contex)). L'autore spiega qui: https://github.com/google-research/bert/issues/35 perché non puoi usarlo come lm.

Tuttavia puoi adattare Bert e usarlo come modello linguistico, come spiegato qui: https://arxiv.org/pdf/1902.04094.pdf

Tuttavia, è possibile utilizzare i modelli predefiniti open ai gpt o gpt-2 dallo stesso repository ( https://github.com/huggingface/pytorch-pretrained-BERT )

Ecco come calcolare la perplessità usando il modello 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.