Un analyseur de haute précision avec des modèles pour 11 langues, implémentés dans Python. Basé sur l'analyse des circonscriptions avec un encodeur auto-attentif de l'ACL 2018, avec des changements supplémentaires décrits dans l'analyse de la circonscription multilingue avec l'auto-atténuer et la pré-formation.
Nouveau février 2021: la version 0.2.0 de l'analyseur neuronal de Berkeley est maintenant absent, avec des modèles pré-formés de meilleure qualité pour toutes les langues. L'inférence utilise désormais Pytorch au lieu de TensorFlow (la formation a toujours été uniquement Pytorch). Support de la prise en charge de Python 2.7 et 3.5. Comprend un support mis à jour pour la formation et l'utilisation de vos propres analyseurs, en fonction de votre choix de modèle pré-formé.
Si vous êtes principalement intéressé à former vos propres modèles d'analyse, passez à la section Formation de cette lecture.
Pour installer l'analyseur, exécutez la commande:
$ pip install beneparRemarque: Beepar 0.2.0 est une mise à niveau majeure par rapport à la version précédente et est livrée avec des modèles d'analyseurs entièrement nouveaux et de meilleure qualité. Si vous n'êtes pas prêt à mettre à niveau, vous pouvez épingler votre version Beepar à la version précédente (0.1.3).
Python 3.6 (ou plus récent) et pytorch 1.6 (ou plus récent) sont nécessaires. Voir le site Web de Pytorch pour instruction sur la façon de sélectionner entre les versions compatibles GPU et CPU uniquement de Pytorch; Beepar utilisera automatiquement le GPU s'il est disponible pour Pytorch.
La façon recommandée d'utiliser Beepar est par l'intégration avec Spacy. Si vous utilisez Spacy, vous devez installer un modèle Spacy pour votre langue. Pour l'anglais, la commande d'installation est:
$ python -m spacy download en_core_web_mdLe modèle spacy n'est utilisé que pour la tokenisation et la segmentation des phrases. Si une analyse spécifique à la langue au-delà de l'analyse n'est pas requise, vous pouvez également renoncer à un modèle spécifique à la langue et utiliser plutôt un modèle multi-language qui ne fait que la tokenisation et la segmentation. Un tel modèle, nouvellement ajouté dans Spacy 3.0, devrait fonctionner pour l'anglais, l'allemand, la coréenne, le polonais et le suédois (mais pas le chinois, car il ne semble pas soutenir la segmentation des mots chinois).
Les modèles d'analyse doivent être téléchargés séparément, en utilisant les commandes:
>> > import benepar
>> > benepar . download ( 'benepar_en3' )Voir la section des modèles disponibles ci-dessous pour une liste complète de modèles.
La façon recommandée d'utiliser Beepar est par son intégration avec 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 Étant donné que Spacy ne fournit pas une API d'analyse officielle de circonscription, toutes les méthodes sont accessibles via les espaces de noms d'extension Span._ et Token._ .
Les propriétés d'extension suivantes sont disponibles:
Span._.labels : un tuple d'étiquettes pour la portée donnée. Une portée peut avoir plusieurs étiquettes lorsqu'il y a des chaînes unares dans l'arbre de l'analyse.Span._.parse_string : une représentation de chaîne de l'arborescence d'analyse pour une portée donnée.Span._.constituents : un itérateur sur les objets Span pour les sous-constituants dans une traversée de précommande de l'arbre d'analyse.Span._.parent : le parent Span dans l'arbre d'analyse.Span._.children : un itérateur sur l'enfant Span S dans l'arbre de l'analyse.Token._.labels , Token._.parse_string , Token._.parent : Ceux-ci se comportent de la même manière que d'appeler la méthode correspondante sur la longueur de longueur contenant le jeton. Ces méthodes soulèveront une exception lorsqu'ils sont appelés sur une durée qui n'est pas un constituant dans l'arbre d'analyse. Ces erreurs peuvent être évitées en traversant l'arbre de l'analyse à partir de l'une ou l'autre des phrases (en itérant sur doc.sents ) ou avec un objet Token individuel.
Il existe également une interface NLTK, qui est conçue pour une utilisation avec des ensembles de données et des banques d'arbres pré-tendues, ou lors de l'intégration de l'analyseur dans un pipeline NLP qui fonctionne déjà (au minimum) la tokenisation et le fractionnement des phrases. Pour l'analyse en commençant par du texte brut, il est fortement encouragé que vous utilisiez à la place Spacy et benepar.BeneparComponent .
Exemple d'utilisation avec 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 ))) (. .) ( '' '' ))) Tous les champs de benepar.InputSentence ne sont pas nécessaires, mais au moins un des words et escaped_words doit être spécifié. L'analyseur tentera de deviner la valeur des champs manquants, par exemple:
>> > input_sentence = benepar . InputSentence (
words = [ '"' , 'Fly' , 'safely' , '.' , '"' ],
)
>> > parser . parse ( input_sentence ) Utilisez parse_sents pour analyser plusieurs phrases.
>> > 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 ])Certains modèles d'analyse permettent également une entrée de texte Unicode pour le débogage / l'utilisation interactive, mais le passage des chaînes de texte brutes est fortement découragée pour toute application où la précision de l'analyse est importante.
>> > parser . parse ( '"Fly safely."' ) # For debugging/interactive use only. Lors de l'analyse du texte brut, nous vous recommandons d'utiliser à la place Spacy et benepar.BeneparComponent . La raison en est que les modèles d'analyse ne sont pas expédiés avec un tokenizer ou un séparateur de phrase, et certains modèles peuvent ne pas inclure non plus de tagueur de discours. Une boîte à outils doit être utilisée pour remplir ces composants de pipeline, et Spacy surpasse le NLTK dans toutes ces zones (parfois par une grande marge).
Les modèles d'analyseurs formés suivants sont disponibles. Pour utiliser l'intégration Spacy, vous devrez également installer un modèle Spacy pour la langue appropriée.
| Modèle | Langue | Info |
|---|---|---|
benepar_en3 | Anglais | 95.40 F1 sur l'ensemble de test WSJ révisé. Les données de formation utilisent des tokenisation révisée et une annotation syntaxique basée sur les mêmes directives que le web arbrebank anglais et les ontonotes, qui correspond mieux aux pratiques de tokenisation modernes dans des bibliothèques comme Spacy. Basé sur T5-Small. |
benepar_en3_large | Anglais | 96.29 F1 sur l'ensemble de test WSJ révisé. Les données de formation utilisent des tokenisation révisée et une annotation syntaxique basée sur les mêmes directives que le web arbrebank anglais et les ontonotes, qui correspond mieux aux pratiques de tokenisation modernes dans des bibliothèques comme Spacy. Basé sur T5-Large. |
benepar_zh2 | Chinois | 92.56 F1 sur le jeu de test CTB 5.1. L'utilisation avec Spacy permet de prendre en charge l'analyse du texte brut, mais l'API NLTK ne prend en charge que l'analyse précédemment des phrases tokenisées. Basé sur l'électra-180g chinois-180. |
benepar_ar2 | arabe | 90,52 F1 sur SPMRL2013 / 2014 Test Set. Prend en charge l'utilisation de l'API NLTK pour l'analyse des phrases tokenisées précédemment. L'analyse du texte brut et de l'intégration de l'espace ne sont pas prises en charge. Basé sur xlm-r. |
benepar_de2 | Allemand | 92.10 F1 sur SPMRL2013 / 2014 Test Set. Basé sur xlm-r. |
benepar_eu2 | Basque | 93.36 F1 sur SPMRL2013 / 2014 Test Set. L'utilisation avec Spacy nécessite d'abord la mise en œuvre du support basque dans Spacy. Basé sur xlm-r. |
benepar_fr2 | Français | 88.43 F1 sur SPMRL2013 / 2014 Test Set. Basé sur xlm-r. |
benepar_he2 | hébreu | 93,98 F1 sur SPMRL2013 / 2014 Test Set. Prend en charge l'utilisation de l'API NLTK pour l'analyse des phrases tokenisées précédemment. L'analyse du texte brut et de l'intégration de l'espace ne sont pas prises en charge. Basé sur xlm-r. |
benepar_hu2 | hongrois | 96.19 F1 sur le jeu de test SPMRL2013 / 2014. L'utilisation avec Spacy nécessite un modèle hongrois pour Spacy. L'API NLTK ne prend en charge que l'analyse précédemment des phrases tokenisées. Basé sur xlm-r. |
benepar_ko2 | coréen | 91.72 F1 sur le jeu de test SPMRL2013 / 2014. Peut être utilisé avec le modèle de segmentation des phrases multi-langues de Spacy (nécessite Spacy v3.0). L'API NLTK ne prend en charge que l'analyse précédemment des phrases tokenisées. Basé sur xlm-r. |
benepar_pl2 | polonais | 97.15 F1 sur le jeu de test SPMRL2013 / 2014. Basé sur xlm-r. |
benepar_sv2 | suédois | 92.21 F1 sur SPMRL2013 / 2014 Test Set. Peut être utilisé avec le modèle de segmentation des phrases multi-langues de Spacy (nécessite Spacy v3.0). Basé sur xlm-r. |
benepar_en3_wsj | Anglais | Envisagez d'utiliser à la place benepar_en3 ou benepar_en3_large . 95,55 F1 sur l'ensemble de tests canoniques WSJ utilisé pour des décennies de publications d'analyse de circonscription anglaise. Basé sur Bert-Large-Snecald. Nous pensons que les directives d'annotation révisées utilisées pour la formation benepar_en3 / benepar_en3_large sont plus adaptées à une utilisation en aval car elles gèrent mieux l'utilisation du langage dans le texte Web, et sont plus cohérentes avec les pratiques modernes dans l'analyse de dépendance et les bibliothèques comme Spacy. Néanmoins, nous fournissons le modèle benepar_en3_wsj pour les cas où l'utilisation des conventions révisées de banque d'arbres n'est pas appropriée, comme l'analyse comparative des différents modèles sur le même ensemble de données. |
La formation nécessite de cloner ce référentiel de GitHub. Bien que le code modèle dans src/benepar soit distribué dans le package benepar sur PYPI, les scripts de formation et d'évaluation directement sous src/ ne le sont pas.
benepar , y compris: NLTK 3.2, Torch-Stuct 0.4, Transformers 4.3.0 ou compatible.make à l'intérieur de l' EVALB/ répertoire pour compiler un exécutable evalb . Cela sera appelé de Python pour l'évaluation. Si une formation sur les ensembles de données SPMRL, vous devrez à la make dans le répertoire EVALB_SPMRL/ . Un nouveau modèle peut être formé à l'aide de la commande python src/main.py train ... Certains des arguments disponibles sont:
| Argument | Description | Défaut |
|---|---|---|
--model-path-base | Base de chemin à utiliser pour enregistrer les modèles | N / A |
--evalb-dir | Path to evalb Directory | EVALB/ |
--train-path | Path vers les arbres d'entraînement | data/wsj/train_02-21.LDC99T42 |
--train-path-text | Tokenisation non destructive facultative des données de formation | Devinez le texte brut; Voir --text-processing |
--dev-path | Chemin vers les arbres de développement | data/wsj/dev_22.LDC99T42 |
--dev-path-text | Tokenisation non destructive facultative des données de développement | Devinez le texte brut; Voir --text-processing |
--text-processing | Heuristique pour deviner le texte brut à partir de fichiers d'arborescence tokenisés de manière décroissante. Voir load_trees() dans src/treebanks.py | Règles par défaut pour les langues autres que l'arabe, le chinois et l'hébreu |
--subbatch-max-tokens | Nombre maximum de jetons à traiter en parallèle pendant l'entraînement (un lot complet peut ne pas tenir dans la mémoire GPU) | 2000 |
--parallelize | Distribuez les couches du modèle pré-formé (par exemple T5) sur plusieurs GPU. | Utiliser au plus un GPU |
--batch-size | Nombre d'exemples par mise à jour de formation | 32 |
--checks-per-epoch | Nombre d'évaluations de développement par époque | 4 |
--numpy-seed | Graines aléatoires numpy | Aléatoire |
--use-pretrained | Utiliser l'encodeur pré-formé | N'utilisez pas d'encodeur pré-formé |
--pretrained-model | Modèle à utiliser si --use-pretrained est passé. Peut être un chemin ou un ID de modèle à partir du HuggingFace Model Hub | bert-base-uncased |
--predict-tags | Ajoute un composant de marquage de disposition et une perte auxiliaire à l'analyseur | Ne prédisez pas les balises |
--use-chars-lstm | Utiliser des représentations de mots charlstm apprises | N'utilisez pas Charlstm |
--use-encoder | Utilisez des couches transformateurs apprises au-dessus du modèle pré-formé ou de Charlstm | N'utilisez pas de couches de transformateur supplémentaires |
--num-layers | Nombre de couches de transformateur à utiliser si --use-encoder est passé | 8 |
--encoder-max-len | La longueur maximale de la phrase (en mots) a permis des couches de transformateur supplémentaires | 512 |
Des arguments supplémentaires sont disponibles pour d'autres hyperparamètres; Voir make_hparams() dans src/main.py Ceux-ci peuvent être spécifiés sur la ligne de commande, tels que --num-layers 2 (pour les paramètres numériques), --predict-tags (pour les paramètres booléens qui par défaut sont faux), ou --no-XXX (pour les paramètres booléens qui par défaut par défaut par défaut à vrai).
Pour chaque évaluation de développement, le score F de l'ensemble de développement est calculé et comparé au meilleur précédent. Si le modèle actuel est meilleur, le modèle précédent sera supprimé et le modèle actuel sera enregistré. Le nouveau nom de fichier sera dérivé de la base de chemin du modèle fournie et du développement F-Score.
Avant de former l'analyseur, vous devrez d'abord obtenir des données de formation appropriées. Nous fournissons des instructions sur la façon de traiter les ensembles de données standard comme PTB, CTB et les données de tâche partagées SMPRL 2013/2014. Après avoir suivi les instructions pour les données WSJ anglaises, vous pouvez utiliser la commande suivante pour former un analyseur anglais en utilisant les hyperparamètres par défaut:
python src/main.py train --use-pretrained --model-path-base models/en_bert_base
Voir EXPERIMENTS.md pour plus d'exemples de bons choix d'hyperparamètre.
Un modèle enregistré peut être évalué sur un corpus de test en utilisant la commande python src/main.py test ... avec les arguments suivants:
| Argument | Description | Défaut |
|---|---|---|
--model-path | Chemin du modèle enregistré | N / A |
--evalb-dir | Path to evalb Directory | EVALB/ |
--test-path | Path pour tester les arbres | data/23.auto.clean |
--test-path-text | Tokenisation non destructive facultative des données de test | Devinez le texte brut; Voir --text-processing |
--text-processing | Heuristique pour deviner le texte brut à partir de fichiers d'arborescence tokenisés de manière décroissante. Voir load_trees() dans src/treebanks.py | Règles par défaut pour les langues autres que l'arabe, le chinois et l'hébreu |
--test-path-raw | Path alternatif pour tester les arbres utilisés pour l'évaluation uniquement (utilisé pour revérifier cette évaluation contre les arbres pré-traités ne contient aucun bogue) | Comparez aux arbres de --test-path |
--subbatch-max-tokens | Nombre maximum de jetons à traiter en parallèle (un GPU n'a pas assez de mémoire pour traiter l'ensemble de données complet en un seul lot) | 500 |
--parallelize | Distribuez les couches du modèle pré-formé (par exemple T5) sur plusieurs GPU. | Utiliser au plus un GPU |
--output-path | Path pour écrire des arbres prévus (utiliser "-" pour stdout). | Ne sauve pas les arbres prévus |
--no-predict-tags | Utilisez des étiquettes d'or de disposition en or lors de l'exécution d'évaluation. Il s'agit de la norme pour les publications, et l'omission de ce drapeau peut donner des scores F1 à tort. | Utilisez des étiquettes de partie de disposition prévues pour EVALB, si disponible |
Par exemple, vous pouvez évaluer un modèle formé en utilisant la commande suivante:
python src/main.py test --model-path models/en_bert_base_dev=*.pt
Le package benepar peut utiliser directement les points de contrôle enregistrés en remplaçant un nom de modèle comme benepar_en3 par un chemin tel que models/en_bert_base_dev_dev=95.67.pt Cependant, la libération des points de contrôle unique a quelques lacunes:
Utilisez src/export.py pour convertir un fichier de point de contrôle en un répertoire qui résume tout sur un modèle formé. Par exemple,
python src/export.py export
--model-path models/en_bert_base_dev=*.pt
--output-dir=models/en_bert_base
Lors de l'exportation, il existe également une option --compress qui ajuste légèrement les poids du modèle, afin que le répertoire de sortie puisse être comprimé en une archive zip de taille beaucoup plus petite. Nous l'utilisons pour nos versions officielles de modèle, car c'est un problème pour distribuer des poids de modèle de 2 Go +. Lorsque vous utilisez l'option --compress , il est recommandé de spécifier un test de test afin de vérifier que la compression a en effet un impact minimal sur la précision de l'analyse. L'utilisation des données de développement pour la vérification n'est pas recommandée, car les données de développement ont déjà été utilisées pour le critère de sélection du modèle pendant la formation.
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
Le script src/export.py a également une sous-commande test qui est à peu près similaire au python src/main.py test , sauf qu'il prend en charge les modèles exportés et a des drapeaux légèrement différents. Nous pouvons exécuter la commande suivante pour vérifier que notre analyseur anglais à l'aide de Bert-Large-ScombaCed atteint en effet 95,55 F1 sur l'ensemble de tests canonicaux WSJ:
python src/export.py test --model-path benepar_en3_wsj --test-path data/wsj/test_23.LDC99T42
Voir EXPERIMENTS.md pour des instructions sur la façon de reproduire des expériences rapportées dans nos articles ACL 2018 et 2019.
Si vous utilisez ce logiciel pour la recherche, veuillez citer nos articles comme suit:
@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",
}
Le code de ce référentiel et des parties de ce lecture sont basés sur https://github.com/mitchellstern/minimal-span-parser