Gibt es gute Out-of-the-Box-Sprachmodelle für Python?


11

Ich erstelle Prototypen für eine Anwendung und benötige ein Sprachmodell, um die Ratlosigkeit einiger generierter Sätze zu berechnen.

Gibt es ein geschultes Sprachmodell in Python, das ich problemlos verwenden kann? So etwas Einfaches wie

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

Ich habe mir einige Frameworks angesehen, konnte aber nicht finden, was ich will. Ich weiß, dass ich so etwas verwenden kann:

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

Dies verwendet eine gute Turing-Wahrscheinlichkeitsverteilung für Brown Corpus, aber ich suchte nach einem gut ausgearbeiteten Modell für einen großen Datensatz, wie den 1b-Wörter-Datensatz. Etwas, dem ich die Ergebnisse für eine allgemeine Domain wirklich vertrauen kann (nicht nur Nachrichten)

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 


Nun, das ist überhaupt nicht leicht zu verwenden, aber es ist etwas. Danke :)
Fred

Das ist ein
vorgeübtes

Ich denke, Sie und ich haben sehr unterschiedliche Definitionen dessen, was "leicht verwendbar" bedeutet ... Ich müsste herausfinden, wie ich die gewünschten Tensorflow-Operationen (Eingabe und Ausgabe) erhalte und wie sie sich verhalten, und herausfinden, ob eine Vorverarbeitung erforderlich ist dies und dann alles in eine Verwirrungsfunktion einwickeln. Ich sage nicht, dass ich es nicht kann, ich sage nur, dass es überhaupt nicht die "leicht verwendbare" Funktion ist, die ich gezeigt habe. Aber nochmals, danke für den Hinweis
Fred

Haben Sie versucht, Google? Ich höre, dass sie eine ganze Menge Daten erhalten :) Ich bin mir nicht sicher, ob sie genau die Metriken haben, nach denen Sie suchen. cloud.google.com/natural-language/docs
FlyingMeatball

Antworten:


6

Das spaCy- Paket enthält viele Sprachmodelle , einschließlich solcher , die in Common Crawl geschult wurden .

Das Sprachmodell hat eine spezifische Bedeutung in der Verarbeitung natürlicher Sprache (Natural Language Processing, NlP). Ein Sprachmodell ist eine Wahrscheinlichkeitsverteilung über Folgen von Token. Bei einer bestimmten Folge von Token kann das Modell eine Wahrscheinlichkeit für das Auftreten dieser Folge zuweisen. Die Sprachmodelle von SpaCy umfassen mehr als nur eine Wahrscheinlichkeitsverteilung.

Das spaCy-Paket muss installiert sein und die Sprachmodelle müssen heruntergeladen werden:

$ pip install spacy 
$ python -m spacy download en

Dann können die Sprachmodelle mit ein paar Zeilen Python verwendet werden:

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

Für ein bestimmtes Modell und Token gibt es eine geglättete Protokollwahrscheinlichkeitsschätzung des Worttyps eines Tokens, die mit dem token.probAttribut : gefunden werden kann.


Meine vorherigen Kommentare wurden gelöscht ... Anscheinend enthält spacy ein geeignetes Sprachmodell (unter Verwendung des token.probAttributs), das jedoch nur in der großen Modellversion erstellt wurde. Wenn Sie Ihre Antwort so bearbeiten, dass sie diese Informationen enthält, kann ich Ihnen das Kopfgeld geben. Komischerweise benutze ich Spacy seit Monaten und nirgends habe ich gesehen, dass es diese Funktion hat
Fred

👍 Schön, dass Sie etwas gefunden haben, das für Sie funktioniert.
Brian Spiering

Wieder .. Dies funktioniert nur, wenn Sie das große englische Modell herunterladen
Fred

4

Ich denke, die akzeptierte Antwort ist falsch.

token.prob ist das log-prob des Tokens, das ein bestimmter Typ ist. Ich vermute, 'Typ' bezieht sich auf etwas wie POS-Tag oder Typ einer benannten Entität (dies ist aus der Dokumentation von spacy nicht ersichtlich) und die Punktzahl ist ein Konfidenzmaß über den Raum aller Typen.

Dies ist nicht dasselbe wie die Wahrscheinlichkeiten, die von einem Sprachmodell zugewiesen werden. Ein Sprachmodell gibt Ihnen die Wahrscheinlichkeitsverteilung über alle möglichen Token (nicht den Typ), aus der hervorgeht, welcher von ihnen am wahrscheinlichsten als nächstes auftritt.

Dieses Repo enthält eine hübsche Dokumentation zur Verwendung von BERT (einem hochmodernen Modell) mit vorab trainierten Gewichten für das neuronale Netzwerk.

Ich denke, die APIs geben Ihnen nicht direkt Verwirrung, aber Sie sollten in der Lage sein, Wahrscheinlichkeitswerte für jedes Token ganz einfach zu erhalten ( https://github.com/huggingface/pytorch-pretrained-BERT#usage ).


2

Ich denke auch, dass die erste Antwort aus den Gründen, die @ noob333 erklärt hat, falsch ist.

Aber auch Bert kann nicht sofort als Sprachmodell verwendet werden. Bert gibt dir das p(word|context(both left and right) )und was du willst ist zu berechnen p(word|previous tokens(only left contex)). Der Autor erklärt hier: https://github.com/google-research/bert/issues/35 warum Sie es nicht als lm verwenden können.

Sie können Bert jedoch anpassen und als Sprachmodell verwenden, wie hier erläutert: https://arxiv.org/pdf/1902.04094.pdf

Sie können jedoch die Open Ai Gpt- oder Gpt-2-Modelle aus demselben Repo verwenden ( https://github.com/huggingface/pytorch-pretrained-BERT ).

Hier erfahren Sie, wie Sie die Ratlosigkeit mithilfe des gpt-Modells berechnen können ( 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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.