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)

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

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

noob333
quelle
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
Jungs
quelle
0

@lads, haben Sie eine aktualisierte Version des Ratgeber-Berechnungscodes für die Transformatoren? Ich habe Code wie https://gist.github.com/huikang/83b7674e3fd36895f69b5c8f9b8bcc4d erstellt . Aber es funktioniert nicht.

Nachdem ich die Migration vom Pytorch-Pretrained-Modell gelesen hatte, fand ich das Problem heraus. Vielen Dank.

Hui Kang
quelle