Um analisador de alta precisão com modelos para 11 idiomas, implementado em Python. Com base na análise do círculo eleitoral com um codificador auto-atento da ACL 2018, com alterações adicionais descritas na análise multilíngue do círculo eleitoral com auto-distribuição e pré-treinamento.
Novo fevereiro de 2021: versão 0.2.0 do analisador neural de Berkeley está agora fora, com modelos pré-treinados de alta qualidade para todos os idiomas. A inferência agora usa pytorch em vez de tensorflow (o treinamento sempre foi apenas Pytorch). Droga o suporte para Python 2.7 e 3.5. Inclui suporte atualizado para treinamento e uso de seus próprios analisadores, com base na sua escolha de modelo pré-treinado.
Se você estiver interessado principalmente em treinar seus próprios modelos de análise, pule para a seção de treinamento deste Readme.
Para instalar o analisador, execute o comando:
$ pip install beneparNOTA: Benepar 0.2.0 é uma grande atualização sobre a versão anterior e vem com modelos de analisador totalmente novos e de alta qualidade. Se você não estiver pronto para atualizar, poderá fixar sua versão BenePar na versão anterior (0.1.3).
Python 3.6 (ou mais recente) e Pytorch 1.6 (ou mais recentes) são necessários. Consulte o site da Pytorch para obter instruções sobre como selecionar entre versões de Pytorch, ativadas por GPU e apenas CPU; BenePar usará automaticamente a GPU se estiver disponível para Pytorch.
A maneira recomendada de usar Benepar é através da integração com o Spacy. Se estiver usando o Spacy, você deve instalar um modelo Spacy para o seu idioma. Para o inglês, o comando de instalação é:
$ python -m spacy download en_core_web_mdO modelo Spacy é usado apenas para segmentação de tokenização e frase. Se a análise específica do idioma além da análise não for necessária, você também poderá renunciar a um modelo específico do idioma e, em vez disso, usar um modelo de múltiplas línguas que executa apenas tokenização e segmentação. Um desses modelo, recém -adicionado no Spacy 3.0, deve funcionar para inglês, alemão, coreano, polonês e sueco (mas não chinês, pois parece não apoiar a segmentação de palavras chinesa).
Os modelos de análise precisam ser baixados separadamente, usando os comandos:
>> > import benepar
>> > benepar . download ( 'benepar_en3' )Consulte a seção Modelos disponíveis abaixo para obter uma lista completa de modelos.
A maneira recomendada de usar Benepar é através de sua integração com 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 Como o Spacy não fornece uma API oficial do distrito eleitoral, todos os métodos são acessíveis através dos namespaces de extensão Span._ e Token._ .
As seguintes propriedades de extensão estão disponíveis:
Span._.labels : Uma tupla de rótulos para o span dado. Uma extensão pode ter vários rótulos quando houver correntes unárias na árvore de análise.Span._.parse_string : uma representação de string da árvore de análise para um determinado período.Span._.constituents : um iterador sobre objetos Span para subconstituentes em uma travessia de pré-encomenda da árvore de análise.Span._.parent : o pai Span na árvore de análise.Span._.children : Um iterador sobre a criança Span s na árvore de análise.Token._.labels , Token._.parse_string , Token._.parent : estes se comportam da mesma forma que chamar o método correspondente na extensão do comprimento que contém o token. Esses métodos aumentarão uma exceção quando chamados em um período que não é um constituinte na árvore de análise. Tais erros podem ser evitados atravessando a árvore de análise começando no nível da frase (iterando doc.sents ) ou com um objeto individual Token .
Há também uma interface NLTK, projetada para uso com conjuntos de dados e bancos de árvores pré-tocados, ou ao integrar o analisador em um pipeline de NLP que já executa a tokenização e a divisão de frases mínimas. Para analisar com o início do texto bruto, é fortemente encorajado que você use Spacy e benepar.BeneparComponent .
Uso de amostra com 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 ))) (. .) ( '' '' ))) Nem todos os campos de benepar.InputSentence são necessários, mas pelo menos uma das words e escaped_words devem ser especificados. O analisador tentará adivinhar o valor da falta de campos, por exemplo:
>> > input_sentence = benepar . InputSentence (
words = [ '"' , 'Fly' , 'safely' , '.' , '"' ],
)
>> > parser . parse ( input_sentence ) Use parse_sents para analisar várias frases.
>> > 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 ])Alguns modelos de analisador também permitem a entrada de texto Unicode para depuração/uso interativo, mas a transmissão em seqüências de texto bruto é fortemente desencorajada para qualquer aplicação em que a precisão da análise seja importante.
>> > parser . parse ( '"Fly safely."' ) # For debugging/interactive use only. Ao analisar o texto bruto, recomendamos o uso do Spacy e benepar.BeneparComponent . O motivo é que os modelos de analisador não são enviados com um splitter de tokenizador ou frase, e alguns modelos também não podem incluir um tagger de parte da fala. Um kit de ferramentas deve ser usado para preencher esses componentes do pipeline, e o Spacy supera o NLTK em todas essas áreas (às vezes por uma margem grande).
Os seguintes modelos de analisador treinado estão disponíveis. Para usar a integração do Spacy, você também precisará instalar um modelo Spacy para o idioma apropriado.
| Modelo | Linguagem | Informações |
|---|---|---|
benepar_en3 | Inglês | 95.40 F1 no conjunto de testes WSJ revisado. Os dados de treinamento usam tokenização revisada e anotação sintática com base nas mesmas diretrizes que o Web Treebank e ontonotes ingleses, que melhor correspondem às práticas modernas de tokenização em bibliotecas como o Spacy. Com base no T5-Small. |
benepar_en3_large | Inglês | 96.29 F1 no conjunto de testes WSJ revisado. Os dados de treinamento usam tokenização revisada e anotação sintática com base nas mesmas diretrizes que o Web Treebank e ontonotes ingleses, que melhor correspondem às práticas modernas de tokenização em bibliotecas como o Spacy. Baseado em T5-Large. |
benepar_zh2 | chinês | 92.56 F1 no conjunto de testes CTB 5.1. O uso com Spacy permite suportar a análise de texto bruto, mas a API NLTK suporta apenas frases tokenizadas anteriormente. Baseado no electra-180g chinês. |
benepar_ar2 | árabe | 90.52 F1 no conjunto de testes SPMRL2013/2014. Somente suporta o uso da API NLTK para analisar frases tokenizadas anteriormente. A análise da integração bruta de texto e spacy não é suportada. Com base no XLM-R. |
benepar_de2 | Alemão | 92.10 F1 no conjunto de testes SPMRL2013/2014. Com base no XLM-R. |
benepar_eu2 | Basco | 93.36 F1 no conjunto de testes SPMRL2013/2014. O uso da Spacy requer primeiro a implementação do suporte basco no Spacy. Com base no XLM-R. |
benepar_fr2 | Francês | 88.43 F1 no conjunto de testes SPMRL2013/2014. Com base no XLM-R. |
benepar_he2 | hebraico | 93.98 F1 no conjunto de testes SPMRL2013/2014. Somente suporta o uso da API NLTK para analisar frases tokenizadas anteriormente. A análise da integração bruta de texto e spacy não é suportada. Com base no XLM-R. |
benepar_hu2 | húngaro | 96.19 F1 no conjunto de testes SPMRL2013/2014. O uso da Spacy requer um modelo húngaro para Spacy. A API NLTK suporta apenas frases tokenizadas anteriormente. Com base no XLM-R. |
benepar_ko2 | coreano | 91.72 F1 no conjunto de testes SPMRL2013/2014. Pode ser usado com o modelo de segmentação de frases em várias línguas da Spacy (requer Spacy v3.0). A API NLTK suporta apenas frases tokenizadas anteriormente. Com base no XLM-R. |
benepar_pl2 | polonês | 97.15 F1 no conjunto de testes SPMRL2013/2014. Com base no XLM-R. |
benepar_sv2 | sueco | 92.21 F1 no conjunto de testes SPMRL2013/2014. Pode ser usado com o modelo de segmentação de frases em várias línguas da Spacy (requer Spacy v3.0). Com base no XLM-R. |
benepar_en3_wsj | Inglês | Considere usar benepar_en3 ou benepar_en3_large . 95.55 F1 no conjunto de testes canônicos de WSJ usado por décadas de publicações de análise de constituintes ingleses. Baseado em Bert-Large-ANSed. Acreditamos que as diretrizes de anotação revisadas usadas para treinar benepar_en3 / benepar_en3_large são mais adequadas para o uso a jusante porque lidam melhor com o uso de idiomas no texto da Web e são mais consistentes com as práticas modernas na análise de dependência e nas bibliotecas como o Spacy. No entanto, fornecemos o modelo benepar_en3_wsj para casos em que o uso das convenções revisadas da manutenção da árvore não é apropriado, como benchmarking diferentes modelos no mesmo conjunto de dados. |
O treinamento requer a clonagem deste repositório do Github. Enquanto o código do modelo no src/benepar é distribuído no pacote benepar no PYPI, os scripts de treinamento e avaliação diretamente em src/ não são.
benepar , incluindo: NLTK 3.2, estrutura de tocha 0.4, Transformers 4.3.0 ou compatível.make dentro do EVALB/ Diretório para compilar um executável evalb . Isso será chamado de Python para avaliação. Se o treinamento nos conjuntos de dados do SPMRL, você precisará make o Diretório EVALB_SPMRL/ . Um novo modelo pode ser treinado usando o python src/main.py train ... Alguns dos argumentos disponíveis são:
| Argumento | Descrição | Padrão |
|---|---|---|
--model-path-base | Base de caminho a ser usada para salvar modelos | N / D |
--evalb-dir | Caminho para avaliar o diretório | EVALB/ |
--train-path | Caminho para treinar árvores | data/wsj/train_02-21.LDC99T42 |
--train-path-text | Tokenização não destrutiva opcional dos dados de treinamento | Adivinhe texto bruto; Veja --text-processing |
--dev-path | Caminho para o desenvolvimento de árvores | data/wsj/dev_22.LDC99T42 |
--dev-path-text | Tokenização não destrutiva opcional dos dados de desenvolvimento | Adivinhe texto bruto; Veja --text-processing |
--text-processing | Heurísticas para adivinhar o texto bruto de arquivos de árvores descomcrutivamente tokenizados. Veja load_trees() em src/treebanks.py | Regras padrão para outros idiomas que não o árabe, chinês e hebraico |
--subbatch-max-tokens | Número máximo de tokens para processar em paralelo durante o treinamento (um lote completo pode não se encaixar na memória da GPU) | 2000 |
--parallelize | Distribua camadas de modelo pré-treinado (por exemplo, T5) em várias GPUs. | Use no máximo uma GPU |
--batch-size | Número de exemplos por atualização de treinamento | 32 |
--checks-per-epoch | Número de avaliações de desenvolvimento por época | 4 |
--numpy-seed | Semente aleatória numpy | Aleatório |
--use-pretrained | Use o codificador pré-treinado | Não use o codificador pré-treinado |
--pretrained-model | O modelo a ser usado se --use-pretrained for aprovado. Pode ser um caminho ou um ID de modelo do hub de modelo Huggingface | bert-base-uncased |
--predict-tags | Adiciona um componente de marcação de parte de fala e perda auxiliar ao analisador | Não preveja tags |
--use-chars-lstm | Use representações de palavras Charlstm aprendidas | Não use charlstm |
--use-encoder | Use camadas de transformador aprendidas em cima do modelo pré-treinado ou charlstm | Não use camadas de transformador extras |
--num-layers | Número de camadas de transformador a serem usadas se --use-encoder for passado | 8 |
--encoder-max-len | Comprimento máximo da frase (em palavras) permitiu camadas de transformador extras | 512 |
Argumentos adicionais estão disponíveis para outros hiperparâmetros; Veja make_hparams() em src/main.py . Eles podem ser especificados na linha de comando, como --num-layers 2 (para parâmetros numéricos), --predict-tags (para parâmetros booleanos que padrão para false) ou --no-XXX (para parâmetros booleanos que padrão que padrão para verdade).
Para cada avaliação de desenvolvimento, o Score F no conjunto de desenvolvimento é calculado e comparado ao melhor anterior. Se o modelo atual for melhor, o modelo anterior será excluído e o modelo atual será salvo. O novo nome do arquivo será derivado da base do caminho do modelo fornecido e do desenvolvimento F.
Antes de treinar o analisador, você precisará primeiro obter dados de treinamento apropriados. Fornecemos instruções sobre como processar conjuntos de dados padrão como PTB, CTB e SMPRL 2013/2014 Dados de tarefas compartilhados. Depois de seguir as instruções para os dados do WSJ em inglês, você pode usar o seguinte comando para treinar um analisador inglês usando os hiperparameters padrão:
python src/main.py train --use-pretrained --model-path-base models/en_bert_base
Consulte EXPERIMENTS.md para obter mais exemplos de boas opções de hiperparâmetro.
Um modelo salvo pode ser avaliado em um corpus de teste usando o python src/main.py test ... com os seguintes argumentos:
| Argumento | Descrição | Padrão |
|---|---|---|
--model-path | Caminho do modelo salvo | N / D |
--evalb-dir | Caminho para avaliar o diretório | EVALB/ |
--test-path | Caminho para testar árvores | data/23.auto.clean |
--test-path-text | Tokenização não destrutiva opcional dos dados de teste | Adivinhe texto bruto; Veja --text-processing |
--text-processing | Heurísticas para adivinhar o texto bruto de arquivos de árvores descomcrutivamente tokenizados. Veja load_trees() em src/treebanks.py | Regras padrão para outros idiomas que não o árabe, chinês e hebraico |
--test-path-raw | Caminho alternativo para testar árvores usadas apenas para avaliar (usado para verificar se a avaliação contra árvores pré-processadas não contém nenhum erro) | Compare com as árvores de --test-path |
--subbatch-max-tokens | Número máximo de tokens para processar em paralelo (uma GPU não tem memória suficiente para processar o conjunto de dados completo em um lote) | 500 |
--parallelize | Distribua camadas de modelo pré-treinado (por exemplo, T5) em várias GPUs. | Use no máximo uma GPU |
--output-path | Caminho para escrever árvores previstas para (usar "-" para stdout). | Não salve árvores previstas |
--no-predict-tags | Use tags de parte de ouro de ouro ao executar o Evalb. Esse é o padrão para publicações, e omitir esse sinalizador pode fornecer pontuações de F1 errônea. | Use tags de parte de fala previstas para avaliação, se disponível |
Como exemplo, você pode avaliar um modelo treinado usando o seguinte comando:
python src/main.py test --model-path models/en_bert_base_dev=*.pt
O pacote benepar pode usar diretamente pontos de verificação salvados substituindo um nome de modelo como benepar_en3 por um caminho como models/en_bert_base_dev_dev=95.67.pt No entanto, a liberação dos pontos de verificação de um único arquivo tem algumas deficiências:
Use src/export.py para converter um arquivo de ponto de verificação em um diretório que encapsula tudo sobre um modelo treinado. Por exemplo,
python src/export.py export
--model-path models/en_bert_base_dev=*.pt
--output-dir=models/en_bert_base
Ao exportar, também existe uma opção --compress que ajusta ligeiramente os pesos do modelo, para que o diretório de saída possa ser compactado em um arquivo zip de tamanho muito menor. Usamos isso para nossos lançamentos oficiais de modelo, porque é um aborrecimento distribuir pesos do modelo de 2 GB+ de tamanho. Ao usar a opção --compress , recomenda -se especificar um conjunto de testes para verificar se a compactação realmente tem um impacto mínimo na precisão da análise. O uso dos dados de desenvolvimento para verificação não é recomendado, pois os dados de desenvolvimento já foram usados para o critério de seleção do modelo durante o treinamento.
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
O script src/export.py também possui um subcomando test que é aproximadamente semelhante ao python src/main.py test , exceto que ele suporta modelos exportados e possui sinalizadores ligeiramente diferentes. Podemos executar o seguinte comando para verificar se nosso analisador em inglês usando o Bert-Large-Inced de fato alcança 95.55 F1 no conjunto de testes canônicos do WSJ:
python src/export.py test --model-path benepar_en3_wsj --test-path data/wsj/test_23.LDC99T42
Consulte EXPERIMENTS.md para obter instruções sobre como reproduzir experimentos relatados em nossos artigos da ACL 2018 e 2019.
Se você usar este software para pesquisa, cite nossos trabalhos da seguinte forma:
@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",
}
O código neste repositório e partes deste readme são baseados em https://github.com/mitchellstern/minimal-spa-parsser