Un analizador de alta precisión con modelos para 11 idiomas, implementado en Python. Basado en el análisis de la circunscripción con un codificador de autoefición de ACL 2018, con cambios adicionales descritos en el análisis de la circunscripción multilingüe con autoeficiencia y pre-entrenamiento.
Nuevo febrero de 2021: Versión 0.2.0 del analizador neuronal de Berkeley ya está fuera, con modelos previamente capacitados de mayor calidad para todos los idiomas. La inferencia ahora usa Pytorch en lugar de TensorFlow (el entrenamiento siempre ha sido solo de Pytorch). Soporte de caída para Python 2.7 y 3.5. Incluye soporte actualizado para la capacitación y el uso de sus propios analizadores, según su elección de modelo previamente capacitado.
Si está interesado principalmente en capacitar a sus propios modelos de análisis, salte a la sección de capacitación de este readme.
Para instalar el analizador, ejecute el comando:
$ pip install beneparNota: Benparar 0.2.0 es una actualización importante sobre la versión anterior, y viene con modelos analizadores completamente nuevos y de mayor calidad. Si no está listo para actualizar, puede fijar su versión de Beneparar a la versión anterior (0.1.3).
Se requieren Python 3.6 (o más nuevo) y Pytorch 1.6 (o más nuevo). Consulte el sitio web de Pytorch para obtener instrucciones sobre cómo seleccionar entre versiones habilitadas para GPU y solo CPU de Pytorch; Benepar usará automáticamente la GPU si está disponible para Pytorch.
La forma recomendada de usar Benepar es a través de la integración con Spacy. Si usa Spacy, debe instalar un modelo de Spacy para su idioma. Para inglés, el comando de instalación es:
$ python -m spacy download en_core_web_mdEl modelo SPACY solo se usa para la tokenización y la segmentación de oraciones. Si no se requiere un análisis específico del lenguaje más allá del análisis, también puede renunciar a un modelo específico del lenguaje y, en su lugar, usar un modelo de varios idiomas que solo realiza la tokenización y la segmentación. Uno de esos modelos, recientemente agregado en Spacy 3.0, debería trabajar para inglés, alemán, coreano, polaco y sueco (pero no chino, ya que no parece apoyar la segmentación de palabras chinas).
Los modelos de análisis deben descargarse por separado, utilizando los comandos:
>> > import benepar
>> > benepar . download ( 'benepar_en3' )Consulte la sección Modelos disponibles a continuación para obtener una lista completa de modelos.
La forma recomendada de usar Benepar es a través de su integración con 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 Dado que Spacy no proporciona una API oficial de análisis de la circunscripción, se pueden acceder a todos los métodos a través de los espacios de nombres de extensión Span._ y Token._ .
Las siguientes propiedades de extensión están disponibles:
Span._.labels : una tupla de etiquetas para el tramo dado. Un tramo puede tener múltiples etiquetas cuando hay cadenas unaras en el árbol de análisis.Span._.parse_string : una representación de cadena del árbol de análisis para un tramo dado.Span._.constituents : un iterador sobre los objetos Span para los sub-contredituyentes en un recorrido por adelantado del árbol de análisis.Span._.parent : el Span principal en el árbol de análisis.Span._.children : un iterador sobre los Span en el árbol de análisis.Token._.labels , Token._.parse_string , Token._.parent : estos se comportan de lo mismo que llamar al método correspondiente en el tramo de longitud que contiene el token. Estos métodos aumentarán una excepción cuando se solicite en un lapso que no es un constituyente en el árbol de análisis. Tales errores se pueden evitar atravesando el árbol de análisis que comienza a nivel de oración (iterando sobre doc.sents ) o con un objeto Token individual.
También hay una interfaz NLTK, que está diseñada para su uso con conjuntos de datos y bancos de árboles pre-contados, o al integrar el analizador en una tubería NLP que ya realiza (como mínimo) tokenización y división de oraciones. Para el análisis que comienza con el texto sin procesar, se recomienda encarecidamente que use Spacy y benepar.BeneparComponent .
Uso de muestra con 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 ))) (. .) ( '' '' ))) No se requieren todos los campos de benepar.InputSentence , pero se deben especificar al menos una de words y escaped_words . El analizador intentará adivinar el valor para los campos faltantes, por ejemplo:
>> > input_sentence = benepar . InputSentence (
words = [ '"' , 'Fly' , 'safely' , '.' , '"' ],
)
>> > parser . parse ( input_sentence ) Use parse_sents para analizar múltiples oraciones.
>> > 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 ])Algunos modelos analizadores también permiten la entrada de texto Unicode para la depuración/uso interactivo, pero la transmisión en cadenas de texto sin procesar se desaconseja para cualquier aplicación donde sea la precisión de análisis.
>> > parser . parse ( '"Fly safely."' ) # For debugging/interactive use only. Al analizar el texto sin procesar, recomendamos usar Spacy y benepar.BeneparComponent . La razón es que los modelos de analizador no se envían con un tokenizador o divisor de oraciones, y algunos modelos tampoco pueden incluir un etiquetador de parte de voz. Se debe utilizar un conjunto de herramientas para completar estos componentes de la tubería, y Spacy supera a NLTK en todas estas áreas (a veces por un gran margen).
Los siguientes modelos de analizador capacitados están disponibles. Para utilizar la integración de Spacy, también deberá instalar un modelo de Spacy para el idioma apropiado.
| Modelo | Idioma | Información |
|---|---|---|
benepar_en3 | Inglés | 95.40 F1 en el conjunto de pruebas WSJ revisado. Los datos de capacitación utilizan tokenización revisada y anotación sintáctica basada en las mismas pautas que el Web Treebank y las Ontonotes inglesas, que coincide mejor con las prácticas de tokenización modernas en bibliotecas como Spacy. Basado en T5-Small. |
benepar_en3_large | Inglés | 96.29 F1 en el conjunto de pruebas WSJ revisado. Los datos de capacitación utilizan tokenización revisada y anotación sintáctica basada en las mismas pautas que el Web Treebank y las Ontonotes inglesas, que coincide mejor con las prácticas de tokenización modernas en bibliotecas como Spacy. Basado en T5-Large. |
benepar_zh2 | Chino | 92.56 F1 en el conjunto de pruebas CTB 5.1. El uso con Spacy permite admitir el análisis del texto sin procesar, pero la API NLTK solo admite oraciones previamente tokenizadas. Basado en el electra-180G-Large chino. |
benepar_ar2 | árabe | 90.52 F1 en el conjunto de pruebas SPMRL2013/2014. Solo admite el uso de la API NLTK para analizar oraciones tokenizadas previamente. El análisis del texto sin procesar y la integración de la espacios no son compatibles. Basado en XLM-R. |
benepar_de2 | Alemán | 92.10 F1 en SPMRL2013/2014 Test Set. Basado en XLM-R. |
benepar_eu2 | vasco | 93.36 F1 en el conjunto de pruebas SPMRL2013/2014. El uso con Spacy primero requiere implementar soporte vasco en Spacy. Basado en XLM-R. |
benepar_fr2 | Francés | 88.43 F1 en el conjunto de pruebas SPMRL2013/2014. Basado en XLM-R. |
benepar_he2 | hebreo | 93.98 F1 en el conjunto de pruebas SPMRL2013/2014. Solo admite el uso de la API NLTK para analizar oraciones tokenizadas previamente. El análisis del texto sin procesar y la integración de la espacios no son compatibles. Basado en XLM-R. |
benepar_hu2 | húngaro | 96.19 F1 en el conjunto de pruebas SPMRL2013/2014. El uso con Spacy requiere un modelo húngaro para Spacy. La API NLTK solo admite oraciones previamente tokenizadas. Basado en XLM-R. |
benepar_ko2 | coreano | 91.72 F1 en el conjunto de pruebas SPMRL2013/2014. Se puede usar con el modelo de segmentación de oraciones de varios idiomas de Spacy (requiere Spacy v3.0). La API NLTK solo admite oraciones previamente tokenizadas. Basado en XLM-R. |
benepar_pl2 | Polaco | 97.15 F1 en el conjunto de pruebas SPMRL2013/2014. Basado en XLM-R. |
benepar_sv2 | sueco | 92.21 F1 en el conjunto de pruebas SPMRL2013/2014. Se puede usar con el modelo de segmentación de oraciones de varios idiomas de Spacy (requiere Spacy v3.0). Basado en XLM-R. |
benepar_en3_wsj | Inglés | Considere usar benepar_en3 o benepar_en3_large en su lugar . 95.55 F1 en el conjunto de pruebas WSJ canónicas utilizadas para décadas de publicaciones de análisis de la circunscripción inglesa. Basado en Bert-Large-Oncoed. Creemos que las pautas de anotación revisadas utilizadas para capacitar benepar_en3 / benepar_en3_large son más adecuadas para el uso posterior porque manejan mejor el uso del lenguaje en el texto web y son más consistentes con las prácticas modernas en el análisis de dependencia y las bibliotecas como Spacy. Sin embargo, proporcionamos el modelo benepar_en3_wsj para casos en los que el uso de las convenciones revisadas de los banebanos no es apropiado, como la evaluación comparativa de diferentes modelos en el mismo conjunto de datos. |
La capacitación requiere clonación de este repositorio de GitHub. Mientras que el código modelo en src/benepar se distribuye en el paquete benepar en PYPI, los scripts de capacitación y evaluación directamente bajo src/ no lo están.
benepar , incluyendo: NLTK 3.2, Estructura de antorcha 0.4, Transformers 4.3.0 o compatible.make dentro del Directorio EVALB/ para compilar un ejecutable evalb . Esto se llamará desde Python para su evaluación. Si se capacita en los conjuntos de datos SPMRL, deberá ejecutar make dentro del Directorio EVALB_SPMRL/ . Un nuevo modelo puede ser entrenado utilizando el comando python src/main.py train ... Algunos de los argumentos disponibles son:
| Argumento | Descripción | Por defecto |
|---|---|---|
--model-path-base | Base de ruta para usar para guardar modelos | N / A |
--evalb-dir | Directorio de ruta a evalB | EVALB/ |
--train-path | Camino hacia los árboles de entrenamiento | data/wsj/train_02-21.LDC99T42 |
--train-path-text | Tokenización no destructiva opcional de los datos de entrenamiento | Adivina texto crudo; Ver --text-processing |
--dev-path | Camino hacia los árboles de desarrollo | data/wsj/dev_22.LDC99T42 |
--dev-path-text | Tokenización no destructiva opcional de los datos de desarrollo | Adivina texto crudo; Ver --text-processing |
--text-processing | Heurística para adivinar el texto sin procesar de los archivos de árbol tokenizados descructivamente. Ver load_trees() en src/treebanks.py | Reglas predeterminadas para idiomas distintos de árabe, chino y hebreo |
--subbatch-max-tokens | Número máximo de tokens para procesar en paralelo mientras el entrenamiento (un lote completo puede no caber en la memoria de GPU) | 2000 |
--parallelize | Distribuya capas del modelo previamente capacitado (por ejemplo, T5) en múltiples GPU. | Usar como máximo una GPU |
--batch-size | Número de ejemplos por actualización de capacitación | 32 |
--checks-per-epoch | Número de evaluaciones de desarrollo por época | 4 |
--numpy-seed | Semilla aleatoria numpy | Aleatorio |
--use-pretrained | Use el codificador previamente capacitado | No use el codificador previamente capacitado |
--pretrained-model | Se pasa el modelo para usar si --use-pretrained . Puede ser una ruta o una identificación del modelo del Hub Model Hub de Huggingface | bert-base-uncased |
--predict-tags | Agrega un componente de etiquetado de parte de voz y pérdida auxiliar al analizador | No predecir etiquetas |
--use-chars-lstm | Use representaciones de palabras de Charlstm aprendidas | No use Charlstm |
--use-encoder | Use capas de transformador aprendidas sobre el modelo previamente capacitado o CharlstM | No use capas de transformador adicionales |
--num-layers | Número de capas de transformador para usar si --use-encoder pasa | 8 |
--encoder-max-len | Longitud máxima de la oración (en palabras) permitido para capas de transformador adicionales | 512 |
Hay argumentos adicionales disponibles para otros hiperparámetros; ver make_hparams() en src/main.py . Estos se pueden especificar en la línea de comando, como --num-layers 2 (para parámetros numéricos), --predict-tags (para parámetros booleanos que predeterminados a falso) o --no-XXX (para parámetros booleanos que predeterminados a verdad).
Para cada evaluación de desarrollo, el puntaje F en el conjunto de desarrollo se calcula y se compara con el mejor anterior. Si el modelo actual es mejor, se eliminará el modelo anterior y se guardará el modelo actual. El nuevo nombre de archivo se derivará de la base de ruta del modelo proporcionado y el desarrollo F-Score.
Antes de capacitar al analizador, primero deberá obtener los datos de capacitación apropiados. Proporcionamos instrucciones sobre cómo procesar conjuntos de datos estándar como PTB, CTB y los datos de tareas compartidas SMPRL 2013/2014. Después de seguir las instrucciones de los datos de WSJ en inglés, puede usar el siguiente comando para entrenar un analizador inglés utilizando los hiperparámetros predeterminados:
python src/main.py train --use-pretrained --model-path-base models/en_bert_base
Ver EXPERIMENTS.md para obtener más ejemplos de buenas opciones de hiperparameter.
Se puede evaluar un modelo guardado en un corpus de prueba utilizando el comando python src/main.py test ... con los siguientes argumentos:
| Argumento | Descripción | Por defecto |
|---|---|---|
--model-path | Camino del modelo guardado | N / A |
--evalb-dir | Directorio de ruta a evalB | EVALB/ |
--test-path | Camino para probar árboles | data/23.auto.clean |
--test-path-text | Tokenización no destructiva opcional de los datos de prueba | Adivina texto crudo; Ver --text-processing |
--text-processing | Heurística para adivinar el texto sin procesar de los archivos de árbol tokenizados descructivamente. Ver load_trees() en src/treebanks.py | Reglas predeterminadas para idiomas distintos de árabe, chino y hebreo |
--test-path-raw | Ruta alternativa a los árboles de prueba que se usa solo para evalB (se usa para verificar que la evaluación contra árboles preprocesados no contiene ningún error) | Compare con los árboles de --test-path |
--subbatch-max-tokens | Número máximo de tokens para procesar en paralelo (una GPU no tiene suficiente memoria para procesar el conjunto de datos completo en un lote) | 500 |
--parallelize | Distribuya capas del modelo previamente capacitado (por ejemplo, T5) en múltiples GPU. | Usar como máximo una GPU |
--output-path | Camino para escribir árboles predichos para (usar "-" para stdout). | No guarde árboles predichos |
--no-predict-tags | Use etiquetas doradas de parte de voz cuando ejecute evalB. Este es el estándar para las publicaciones, y omitir esta bandera puede dar puntajes F1 erróneamente altos. | Utilice etiquetas de parte del discurso previstas para EVALB, si está disponible |
Como ejemplo, puede evaluar un modelo capacitado utilizando el siguiente comando:
python src/main.py test --model-path models/en_bert_base_dev=*.pt
El paquete benepar puede usar directamente los puntos de control guardados reemplazando un nombre de modelo como benepar_en3 con una ruta como models/en_bert_base_dev_dev=95.67.pt Sin embargo, liberar los puntos de control de un solo archivo tiene algunas deficiencias:
Use src/export.py para convertir un archivo de punto de control en un directorio que encapsula todo sobre un modelo capacitado. Por ejemplo,
python src/export.py export
--model-path models/en_bert_base_dev=*.pt
--output-dir=models/en_bert_base
Al exportar, también hay una opción --compress que ajusta ligeramente los pesos del modelo, de modo que el directorio de salida se pueda comprimir en un archivo zip de tamaño mucho más pequeño. Usamos esto para nuestros lanzamientos de modelos oficiales, porque es una molestia distribuir pesos de modelo que tengan un tamaño de 2 GB+. Al usar la opción --compress , se recomienda especificar un conjunto de pruebas para verificar que la compresión tiene un impacto mínimo en la precisión de análisis. No se recomienda usar los datos de desarrollo para la verificación, ya que los datos de desarrollo ya se usaron para el criterio de selección del modelo durante la capacitación.
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
El script src/export.py también tiene un subcomando test que es aproximadamente similar a python src/main.py test , excepto que admite modelos exportados y tiene banderas ligeramente diferentes. Podemos ejecutar el siguiente comando para verificar que nuestro analizador inglés que use Bert-Large-Insciase logre 95.55 F1 en el conjunto de pruebas WSJ canónicas:
python src/export.py test --model-path benepar_en3_wsj --test-path data/wsj/test_23.LDC99T42
Consulte EXPERIMENTS.md para obtener instrucciones sobre cómo reproducir los experimentos informados en nuestros documentos de ACL 2018 y 2019.
Si usa este software para la investigación, cite nuestros documentos de la siguiente manera:
@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",
}
El código en este repositorio y las partes de este ReadMe se basan en https://github.com/mitchellstern/minimal-span-parser