Ein hochgenauiger Parser mit Modellen für 11 Sprachen, die in Python implementiert sind. Basierend auf dem Wahlkreis, der mit einem selbstansprechenden Encoder aus der ACL 2018 analysiert wird, wobei zusätzliche Änderungen beim mehrsprachigen Wahlkreis mit Selbstbekämpfung und Vorausbildung beschrieben werden.
Neue Februar 2021: Version 0.2.0 des Berkeley Neural Parser ist nun heraus und mit hochwertiger vorgebildeter Modelle für alle Sprachen. Inferenz verwendet nun Pytorch anstelle von Tensorflow (Training wurde schon immer nur Pytorch). Tropfen Unterstützung für Python 2.7 und 3.5. Enthält aktualisierte Unterstützung für das Training und die Verwendung Ihrer eigenen Parsers, basierend auf Ihrer Wahl des vorgebreiteten Modells.
Wenn Sie in erster Linie daran interessiert sind, Ihre eigenen Parsing -Modelle auszubilden, gehen Sie zum Trainingsbereich dieses Readme.
Führen Sie den Befehl aus, um den Parser zu installieren:
$ pip install beneparHINWEIS: Benepar 0.2.0 ist ein großes Upgrade der Vorgängerversion und verfügt über völlig neue und qualitativ hochwertige Parser-Modelle. Wenn Sie nicht bereit sind, ein Upgrade zu erzielen, können Sie Ihre Benepar -Version auf die vorherige Version (0.1.3) festhalten.
Python 3.6 (oder neuer) und Pytorch 1.6 (oder neuer) sind erforderlich. In der Pytorch-Website finden Sie Anweisungen zur Auswahl zwischen GPU-fähigen und nur CPU-Versionen von Pytorch. Benepar verwendet die GPU automatisch, wenn sie Pytorch zur Verfügung steht.
Die empfohlene Art, Benepar zu verwenden, ist die Integration mit Spacy. Wenn Sie Spacy verwenden, sollten Sie ein Spacy -Modell für Ihre Sprache installieren. Für Englisch lautet der Installationsbefehl:
$ python -m spacy download en_core_web_mdDas Spacy -Modell wird nur zur Tokenisierung und Satzsegmentierung verwendet. Wenn keine sprachspezifische Analyse über die Parsen hinaus erforderlich ist, können Sie auch auf ein sprachspezifisches Modell verzichten und stattdessen ein Multisprachel-Modell verwenden, das nur eine Tokenisierung und Segmentierung durchführt. Ein solches Modell, das in Spacy 3.0 neu hinzugefügt wurde, sollte für Englisch, Deutsch, Koreanisch, Polnisch und Schwedisch arbeiten (aber nicht Chinesen, da es die chinesische Wortsegmentierung nicht zu unterstützen scheint).
Parsing -Modelle müssen unter Verwendung der Befehle separat heruntergeladen werden:
>> > import benepar
>> > benepar . download ( 'benepar_en3' )Eine vollständige Liste von Modellen finden Sie im Abschnitt verfügbarer Modelle.
Die empfohlene Art, Benepar zu verwenden, ist die Integration mit Spacy:
>> > import benepar , spacy
>> > nlp = spacy . load ( 'en_core_web_md' )
>> > if spacy . __version__ . startswith ( '2' ):
nlp . add_pipe ( benepar . BeneparComponent ( "benepar_en3" ))
else :
nlp . add_pipe ( "benepar" , config = { "model" : "benepar_en3" })
>> > doc = nlp ( "The time for action is now. It's never too late to do something." )
>> > sent = list ( doc . sents )[ 0 ]
>> > print ( sent . _ . parse_string )
( S ( NP ( NP ( DT The ) ( NN time )) ( PP ( IN for ) ( NP ( NN action )))) ( VP ( VBZ is ) ( ADVP ( RB now ))) (. .))
>> > sent . _ . labels
( 'S' ,)
>> > list ( sent . _ . children )[ 0 ]
The time for action Da Spacy keinen offiziellen Wahlkreis -Parsing -API bietet, sind alle Methoden über die Span._ und Token._ zugänglich.
Die folgenden Erweiterungseigenschaften sind verfügbar:
Span._.labels : Ein Tupel von Etiketten für die angegebene Spanne. Eine Spannweite hat möglicherweise mehrere Etiketten, wenn im Parse Tree Unary Ketten befinden.Span._.parse_string : Eine String -Darstellung des Parse -Baumes für eine bestimmte Spanne.Span._.constituents : Ein Iterator über Span Objekte für Unterkonstituierende in einer Vorbestellung des Parse-Baumes.Span._.parent : Die übergeordnete Span im Parse -Baum.Span._.children : Ein Iterator über dem Span im Parse Tree.Token._.labels , Token._.parse_string , Token._.parent : Diese verhalten sich genauso wie die entsprechende Methode auf der Länge, die das Token enthält. Diese Methoden erhöhen eine Ausnahme, wenn sie eine Spannweite auffordert, die im Parse -Baum kein Bestandteil ist. Solche Fehler können vermieden werden, indem der Parse -Baum entweder auf Satzebene (durch Iterieren über doc.sents ) oder mit einem individuellen Token -Objekt durchquert werden.
Es gibt auch eine NLTK-Schnittstelle, die für die Verwendung mit vorgefängerten Datensätzen und Baumbanks oder bei der Integration des Parsers in eine NLP-Pipeline ausgelegt ist, die bereits (mindestens) Tokenisierung und Satzaufteilung ausführt. Für das Parsen mit Rohtext wird stark ermutigt , stattdessen Spacy und benepar.BeneparComponent zu verwenden.
Beispielverbrauch mit NLTK:
>> > import benepar
>> > parser = benepar . Parser ( "benepar_en3" )
>> > input_sentence = benepar . InputSentence (
words = [ '"' , 'Fly' , 'safely' , '.' , '"' ],
space_after = [ False , True , False , False , False ],
tags = [ '``' , 'VB' , 'RB' , '.' , "''" ],
escaped_words = [ '``' , 'Fly' , 'safely' , '.' , "''" ],
)
>> > tree = parser . parse ( input_sentence )
>> > print ( tree )
( TOP ( S ( `` `` ) ( VP ( VB Fly ) ( ADVP ( RB safely ))) (. .) ( '' '' ))) Nicht alle Felder von benepar.InputSentence sind erforderlich, aber mindestens eines von words und escaped_words müssen angegeben werden. Der Parser wird versuchen, den Wert für fehlende Felder beispielsweise zu erraten:
>> > input_sentence = benepar . InputSentence (
words = [ '"' , 'Fly' , 'safely' , '.' , '"' ],
)
>> > parser . parse ( input_sentence ) Verwenden Sie parse_sents , um mehrere Sätze zu analysieren.
>> > input_sentence1 = benepar . InputSentence (
words = [ 'The' , 'time' , 'for' , 'action' , 'is' , 'now' , '.' ],
)
>> > input_sentence2 = benepar . InputSentence (
words = [ 'It' , "'s" , 'never' , 'too' , 'late' , 'to' , 'do' , 'something' , '.' ],
)
>> > parser . parse_sents ([ input_sentence1 , input_sentence2 ])Einige Parser -Modelle ermöglichen auch die Unicode -Texteingabe für das Debuggen/interaktive Gebrauch, aber das Übergeben in Rohtext -Zeichenfolgen ist für jede Anwendung, bei der die Parsinggenauigkeit wichtig ist, stark entmutigt .
>> > parser . parse ( '"Fly safely."' ) # For debugging/interactive use only. Bei der Analyse von Rohtext empfehlen wir stattdessen mit Spacy und benepar.BeneparComponent . Der Grund dafür ist, dass Parser-Modelle nicht mit einem Tokenizer oder einem Satzsplitter versendet werden, und einige Modelle enthalten möglicherweise auch keinen Tagungs-Tagger. Ein Toolkit muss verwendet werden, um diese Pipeline -Komponenten auszufüllen, und Spacy übertrifft NLTK in all diesen Bereichen (manchmal mit einem großen Rand).
Die folgenden geschulten Parser -Modelle sind verfügbar. Um die Integration der Spaction -Integration zu verwenden, müssen Sie auch ein Spacy -Modell für die entsprechende Sprache installieren.
| Modell | Sprache | Info |
|---|---|---|
benepar_en3 | Englisch | 95.40 F1 beim überarbeiteten WSJ -Testsatz. Die Trainingsdaten verwenden überarbeitete Tokenisierung und syntaktische Annotation, die auf denselben Richtlinien wie die englische Webbaumbank und Ontonotes basieren, die besser moderne Tokenisierungspraktiken in Bibliotheken wie Spacy entspricht. Basierend auf T5-Small. |
benepar_en3_large | Englisch | 96.29 F1 auf überarbeiteten WSJ -Testsatz. Die Trainingsdaten verwenden überarbeitete Tokenisierung und syntaktische Annotation, die auf denselben Richtlinien wie die englische Webbaumbank und Ontonotes basieren, die besser moderne Tokenisierungspraktiken in Bibliotheken wie Spacy entspricht. Basierend auf T5-Large. |
benepar_zh2 | chinesisch | 92.56 F1 auf CTB 5.1 Testsatz. Die Verwendung mit Spacy ermöglicht Unterstützung von Parsen aus dem Rohtext, aber die NLTK -API unterstützt nur die Parsen zuvor tokenisierter Sätze. Basierend auf chinesischen Elektrik-180g-Large. |
benepar_ar2 | Arabisch | 90.52 F1 auf SPMRL2013/2014 Testsatz. Unterstützt nur die Verwendung der NLTK -API zum Analysen zuvor tokenisierter Sätze. Das Analysieren von Rohtext und Spacy -Integration werden nicht unterstützt. Basierend auf XLM-R. |
benepar_de2 | Deutsch | 92.10 F1 auf SPMRL2013/2014 Testsatz. Basierend auf XLM-R. |
benepar_eu2 | baskisch | 93.36 F1 auf SPMRL2013/2014 Testsatz. Die Verwendung mit Spacy erfordert zunächst die Implementierung der Baskenunterstützung in Spacy. Basierend auf XLM-R. |
benepar_fr2 | Französisch | 88.43 F1 auf SPMRL2013/2014 Testsatz. Basierend auf XLM-R. |
benepar_he2 | hebräisch | 93.98 F1 auf SPMRL2013/2014 Testsatz. Unterstützt nur die Verwendung der NLTK -API zum Analysen zuvor tokenisierter Sätze. Das Analysieren von Rohtext und Spacy -Integration werden nicht unterstützt. Basierend auf XLM-R. |
benepar_hu2 | ungarisch | 96.19 F1 auf SPMRL2013/2014 Testsatz. Die Verwendung mit Spaces erfordert ein ungarisches Modell für Spacy. Die NLTK -API unterstützt nur die Parsen zuvor tokenisierter Sätze. Basierend auf XLM-R. |
benepar_ko2 | Koreanisch | 91.72 F1 auf SPMRL2013/2014 Testsatz. Kann mit dem Multisprach-Segmentierungsmodell von Spacy verwendet werden (erfordert Spacy v3.0). Die NLTK -API unterstützt nur die Parsen zuvor tokenisierter Sätze. Basierend auf XLM-R. |
benepar_pl2 | Polieren | 97.15 F1 auf SPMRL2013/2014 Testsatz. Basierend auf XLM-R. |
benepar_sv2 | Schwedisch | 92.21 F1 auf SPMRL2013/2014 Testsatz. Kann mit dem Multisprach-Segmentierungsmodell von Spacy verwendet werden (erfordert Spacy v3.0). Basierend auf XLM-R. |
benepar_en3_wsj | Englisch | Erwägen Sie stattdessen benepar_en3 oder benepar_en3_large . 95.55 F1 zum kanonischen WSJ -Testsatz, der für Jahrzehnte des englischen Wahlkreises analysiert wird. Basierend auf Bert-Large-Unbekanntheit. Wir glauben, dass die überarbeiteten Annotationsrichtlinien, die für das Training benepar_en3 / benepar_en3_large verwendet werden, besser für die nachgeschaltete Verwendung geeignet sind, da sie die Sprachverwendung im Webtext besser verarbeiten und mit modernen Praktiken bei der Analyse von Abhängigkeiten und Bibliotheken wie Spaces besser übereinstimmen. Trotzdem stellen wir das Modell benepar_en3_wsj für Fälle zur Verfügung, in denen die Verwendung der überarbeiteten Baumbankkonventionen nicht angemessen ist, z. B. das Benchmarking verschiedener Modelle auf demselben Datensatz. |
Das Training erfordert das Klonen dieses Repositorys aus GitHub. Während der Modellcode in src/benepar im benepar -Paket auf PYPI verteilt ist, sind die Schulungs- und Bewertungsskripte direkt unter src/ nicht.
benepar Paket erforderlich sind, einschließlich: NLTK 3.2, Torch-Struct 0.4, Transformers 4.3.0 oder kompatibel.EVALB/ Verzeichnis Run make um eine ausführbare evalb -Datei zu erstellen. Dies wird von Python zur Bewertung aufgerufen. Wenn Sie in den SPMRL -Datensätzen trainieren, müssen Sie stattdessen im EVALB_SPMRL/ Verzeichnis make werden. Ein neues Modell kann mit dem Befehl python src/main.py train ... trainiert werden. Einige der verfügbaren Argumente sind:
| Argument | Beschreibung | Standard |
|---|---|---|
--model-path-base | Pfadbasis zum Speichern von Modellen | N / A |
--evalb-dir | Pfad zum Evalb -Verzeichnis | EVALB/ |
--train-path | Weg zum Training von Bäumen | data/wsj/train_02-21.LDC99T42 |
--train-path-text | Optionale nicht-zerstörerische Tokenisierung der Trainingsdaten | Raten Sie rohen Text; --text-processing |
--dev-path | Weg zu Entwicklungsbäumen | data/wsj/dev_22.LDC99T42 |
--dev-path-text | Optionale nicht-zerstörerische Tokenisierung der Entwicklungsdaten | Raten Sie rohen Text; --text-processing |
--text-processing | Heuristiken zum Erraten von Rohtext aus dem descructival tokenisierten Baumdateien. Siehe load_trees() in src/treebanks.py | Standardregeln für andere Sprachen als Arabisch, Chinesisch und Hebräisch |
--subbatch-max-tokens | Die maximale Anzahl von Token, die während des Trainings parallel verarbeiten müssen (eine vollständige Charge passt möglicherweise nicht in den GPU -Speicher) | 2000 |
--parallelize | Schichten vor dem ausgebildeten Modell (z. B. T5) auf mehrere GPUs verteilen. | Nutzen Sie höchstens eine GPU |
--batch-size | Anzahl der Beispiele pro Trainingsaktualisierung | 32 |
--checks-per-epoch | Anzahl der Entwicklungsbewertungen pro Epoche | 4 |
--numpy-seed | Numpy zufälliger Samen | Zufällig |
--use-pretrained | Verwenden Sie einen vorgeborenen Encoder | Verwenden Sie keinen vorgeborenen Encoder |
--pretrained-model | Das Modell, das verwendet werden kann, wenn --use-pretrained vorbeabsichtigt wird. Kann ein Pfad oder eine Modell -ID aus dem Huggingface -Modell -Hub sein | bert-base-uncased |
--predict-tags | Fügt dem Parser einen Teil der Speech-Tagging-Komponente und Hilfsverlust hinzu | Vorhersagen Sie keine Tags |
--use-chars-lstm | Verwenden Sie erlernte Charlstm Word Repräsentationen | Verwenden Sie Charlstm nicht |
--use-encoder | Verwenden Sie gelernte Transformatorschichten auf dem vorgeborenen Modell oder Charlstm | Verwenden Sie keine zusätzlichen Transformatorschichten |
--num-layers | Anzahl der zu verwendenden Transformatorenschichten, wenn --use-encoder übergeben wird | 8 |
--encoder-max-len | Maximale Satzlänge (in Wörtern) Ermöglichte zusätzliche Transformatorschichten | 512 |
Für andere Hyperparameter stehen zusätzliche Argumente zur Verfügung. Siehe make_hparams() in src/main.py . Diese können in --predict-tags Befehlszeile angegeben --no-XXX , z --num-layers 2 zu wahr).
Für jede Entwicklungsbewertung wird der F-Score im Entwicklungssatz berechnet und mit dem vorherigen Besten verglichen. Wenn das aktuelle Modell besser ist, wird das Vorgängermodell gelöscht und das aktuelle Modell wird gespeichert. Der neue Dateiname wird aus der bereitgestellten Modellpfadbasis und der Entwicklung F-Score abgeleitet.
Vor dem Training des Parsers müssen Sie zunächst entsprechende Schulungsdaten erhalten. Wir geben Anweisungen zur Verarbeitung von Standarddatensätzen wie PTB, CTB und den gemeinsam genutzten Aufgabendaten SMPRL 2013/2014. Nachdem Sie die Anweisungen für die englischen WSJ -Daten befolgt haben, können Sie den folgenden Befehl verwenden, um einen englischen Parser mithilfe der Standard -Hyperparameter zu trainieren:
python src/main.py train --use-pretrained --model-path-base models/en_bert_base
Weitere Beispiele für gute Hyperparameter -Auswahlmöglichkeiten finden Sie EXPERIMENTS.md .
Ein gespeichertes Modell kann auf einem Testkorpus unter Verwendung des Befehls python src/main.py test ... mit den folgenden Argumenten:
| Argument | Beschreibung | Standard |
|---|---|---|
--model-path | Pfad des gespeicherten Modells | N / A |
--evalb-dir | Pfad zum Evalb -Verzeichnis | EVALB/ |
--test-path | Weg zum Testen von Bäumen | data/23.auto.clean |
--test-path-text | Optionale nicht-zerstörerische Tokenisierung der Testdaten | Raten Sie rohen Text; --text-processing |
--text-processing | Heuristiken zum Erraten von Rohtext aus dem descructival tokenisierten Baumdateien. Siehe load_trees() in src/treebanks.py | Standardregeln für andere Sprachen als Arabisch, Chinesisch und Hebräisch |
--test-path-raw | Alternativer Weg zum Testen von Bäumen, die nur für EvalB verwendet werden (zum Doppelponieren, dass die Bewertung an vorverarbeiteten Bäumen keine Fehler enthält) | Vergleiche mit Bäumen von --test-path |
--subbatch-max-tokens | Die maximale Anzahl von Token, die parallel verarbeiten müssen (eine GPU hat nicht genügend Speicher, um den vollständigen Datensatz in einer Stapel zu verarbeiten) | 500 |
--parallelize | Schichten vor dem ausgebildeten Modell (z. B. T5) auf mehrere GPUs verteilen. | Nutzen Sie höchstens eine GPU |
--output-path | Pfad zum Schreiben von vorhergesagten Bäumen (Verwendung "-" für stdout). | Speichern Sie keine vorhergesagten Bäume |
--no-predict-tags | Verwenden Sie bei Ausführen von EvalB Gold-Teil-von-Speech-Tags. Dies ist der Standard für Veröffentlichungen, und das Auslassen dieser Flagge kann fälschlicherweise hohe F1 -Werte ergeben. | Verwenden Sie vorhanden |
Beispielsweise können Sie ein geschultes Modell mit dem folgenden Befehl bewerten:
python src/main.py test --model-path models/en_bert_base_dev=*.pt
Das benepar -Paket kann direkt gespeicherte Kontrollpunkte verwenden, indem ein Modellname wie benepar_en3 durch einen Pfad wie models/en_bert_base_dev_dev=95.67.pt ersetzt wird. Die Veröffentlichung der Einzelfilm-Checkpoints hat jedoch einige Mängel:
Verwenden Sie src/export.py , um eine Checkpoint -Datei in ein Verzeichnis zu konvertieren, das alles über ein geschultes Modell zusammenfasst. Zum Beispiel,
python src/export.py export
--model-path models/en_bert_base_dev=*.pt
--output-dir=models/en_bert_base
Beim Exportieren gibt es auch eine Option --compress , die die Modellgewichte leicht anpasst, sodass das Ausgangsverzeichnis in ein ZIP -Archiv mit einer viel kleineren Größe komprimiert werden kann. Wir verwenden dies für unsere offiziellen Modellveröffentlichungen, da es ein Problem ist, Modellgewichte zu verteilen, die eine Größe von 2 GB+ haben. Bei Verwendung der Option --compress wird empfohlen, einen Testsatz anzugeben, um zu überprüfen, ob die Komprimierung tatsächlich nur minimale Auswirkungen auf die Parsengenauigkeit hat. Die Verwendung der Entwicklungsdaten zur Überprüfung wird nicht empfohlen, da die Entwicklungsdaten bereits für das Modellauswahlkriterium während des Trainings verwendet wurden.
python src/export.py export
--model-path models/en_bert_base_dev=*.pt
--output-dir=models/en_bert_base
--test-path=data/wsj/test_23.LDC99T42
Das Skript src/export.py verfügt außerdem über einen test -Unterbefehl, der dem python src/main.py test ungefähr ähnlich ist, außer dass es exportierte Modelle unterstützt und leicht unterschiedliche Flags aufweist. Wir können den folgenden Befehl ausführen, um zu überprüfen, ob unser englischer Parser mit Bert-Large-Unbekannter tatsächlich 95,55 F1 am kanonischen WSJ-Testsatz erreicht:
python src/export.py test --model-path benepar_en3_wsj --test-path data/wsj/test_23.LDC99T42
Siehe EXPERIMENTS.md für Anweisungen zur Reproduktion von Experimenten, die in unseren Artikel der ACL 2018 und 2019 berichtet werden.
Wenn Sie diese Software für die Forschung verwenden, zitieren Sie bitte unsere Papiere wie folgt:
@inproceedings{kitaev-etal-2019-multilingual,
title = "Multilingual Constituency Parsing with Self-Attention and Pre-Training",
author = "Kitaev, Nikita and
Cao, Steven and
Klein, Dan",
booktitle = "Proceedings of the 57th Annual Meeting of the Association for Computational Linguistics",
month = jul,
year = "2019",
address = "Florence, Italy",
publisher = "Association for Computational Linguistics",
url = "https://www.aclweb.org/anthology/P19-1340",
doi = "10.18653/v1/P19-1340",
pages = "3499--3505",
}
@inproceedings{kitaev-klein-2018-constituency,
title = "Constituency Parsing with a Self-Attentive Encoder",
author = "Kitaev, Nikita and
Klein, Dan",
booktitle = "Proceedings of the 56th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)",
month = jul,
year = "2018",
address = "Melbourne, Australia",
publisher = "Association for Computational Linguistics",
url = "https://www.aclweb.org/anthology/P18-1249",
doi = "10.18653/v1/P18-1249",
pages = "2676--2686",
}
Der Code in diesem Repository und Teile dieses Readme basiert auf https://github.com/mitchellsern/minimalspan-parserer