Parser akurasi tinggi dengan model untuk 11 bahasa, diimplementasikan dalam Python. Berdasarkan penguraian konstituensi dengan enkoder perhatian mandiri dari ACL 2018, dengan perubahan tambahan yang dijelaskan dalam konstituensi multibahasa yang dikurangi dengan perhatian dan pra-pelatihan.
Baru Februari 2021: Versi 0.2.0 dari Berkeley Neural Parser sekarang keluar, dengan model pra-terlatih berkualitas lebih tinggi untuk semua bahasa. Inference sekarang menggunakan pytorch bukan tensorflow (pelatihan selalu hanya Pytorch). Menurunkan dukungan untuk Python 2.7 dan 3.5. Termasuk dukungan yang diperbarui untuk pelatihan dan menggunakan parser Anda sendiri, berdasarkan pilihan model pra-terlatih Anda.
Jika Anda terutama tertarik untuk melatih model penguraian Anda sendiri, lewati bagian pelatihan Readme ini.
Untuk menginstal parser, jalankan perintah:
$ pip install beneparCatatan: Benepar 0.2.0 adalah peningkatan besar dari versi sebelumnya, dan dilengkapi dengan model parser yang sama sekali baru dan berkualitas lebih tinggi. Jika Anda belum siap untuk meningkatkan, Anda dapat menyematkan versi Benepar Anda ke rilis sebelumnya (0,1.3).
Python 3.6 (atau lebih baru) dan Pytorch 1.6 (atau lebih baru) diperlukan. Lihat situs web Pytorch untuk instruksi tentang cara memilih antara versi yang diaktifkan GPU dan CPU-khusus dari Pytorch; Benepar akan secara otomatis menggunakan GPU jika tersedia untuk Pytorch.
Cara yang disarankan untuk menggunakan Benepar adalah melalui integrasi dengan spacy. Jika menggunakan Spacy, Anda harus menginstal model spacy untuk bahasa Anda. Untuk bahasa Inggris, perintah instalasi adalah:
$ python -m spacy download en_core_web_mdModel spacy hanya digunakan untuk segmentasi tokenisasi dan kalimat. Jika analisis spesifik bahasa di luar parsing tidak diperlukan, Anda juga dapat melepaskan model spesifik bahasa dan sebaliknya menggunakan model multi-bahasa yang hanya melakukan tokenisasi dan segmentasi. Salah satu model tersebut, yang baru ditambahkan dalam Spacy 3.0, harus bekerja untuk bahasa Inggris, Jerman, Korea, Polandia, dan Swedia (tetapi bukan Cina, karena tampaknya tidak mendukung segmentasi kata Cina).
Model parsing perlu diunduh secara terpisah, menggunakan perintah:
>> > import benepar
>> > benepar . download ( 'benepar_en3' )Lihat bagian model yang tersedia di bawah ini untuk daftar lengkap model.
Cara yang disarankan untuk menggunakan Benepar adalah melalui integrasi dengan 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 Karena Spacy tidak memberikan API parsing konstituensi resmi, semua metode dapat diakses melalui extension namespaces Span._ dan Token._ .
Properti ekstensi berikut tersedia:
Span._.labels : Tupel label untuk rentang yang diberikan. Rentang mungkin memiliki banyak label ketika ada rantai unary di pohon parse.Span._.parse_string : representasi string dari pohon parse untuk rentang yang diberikan.Span._.constituents : Iterator atas objek Span untuk sub-konstituen dalam traversal pre-order pohon parse.Span._.parent : Span induk di pohon parse.Span._.children : Iterator atas Span anak di pohon parse.Token._.labels , Token._.parse_string , Token._.parent : ini berperilaku sama dengan memanggil metode yang sesuai pada rentang panjang yang berisi token. Metode -metode ini akan meningkatkan pengecualian ketika dipanggil pada rentang yang bukan konstituen di pohon parse. Kesalahan semacam itu dapat dihindari dengan melintasi pohon parse mulai dari kedua tingkat kalimat (dengan mengulangi doc.sents ) atau dengan objek Token individu.
Ada juga antarmuka NLTK, yang dirancang untuk digunakan dengan kumpulan data yang telah diwariskan dan bank pohon, atau ketika mengintegrasikan parser ke dalam pipa NLP yang sudah melakukan (minimum) tokenisasi dan pemisahan kalimat. Untuk penguraian dimulai dengan teks mentah, sangat dianjurkan agar Anda menggunakan Spacy dan benepar.BeneparComponent sebagai gantinya.
Penggunaan sampel dengan 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 ))) (. .) ( '' '' ))) Tidak semua bidang benepar.InputSentence diperlukan, tetapi setidaknya satu words dan escaped_words harus ditentukan. Parser akan mencoba menebak nilai untuk bidang yang hilang, misalnya:
>> > input_sentence = benepar . InputSentence (
words = [ '"' , 'Fly' , 'safely' , '.' , '"' ],
)
>> > parser . parse ( input_sentence ) Gunakan parse_sents untuk menguraikan beberapa kalimat.
>> > 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 ])Beberapa model parser juga memungkinkan input teks Unicode untuk debugging/penggunaan interaktif, tetapi lulus dalam string teks mentah sangat tidak dianjurkan untuk aplikasi apa pun di mana akurasi parsing penting.
>> > parser . parse ( '"Fly safely."' ) # For debugging/interactive use only. Saat mem -parsing dari teks mentah, kami sarankan menggunakan Spacy dan benepar.BeneparComponent sebagai gantinya. Alasannya adalah bahwa model parser tidak mengirim dengan tokenizer atau splitter kalimat, dan beberapa model mungkin tidak termasuk tagger bagian-dari-pidato juga. Toolkit harus digunakan untuk mengisi komponen pipa ini, dan spacy mengungguli NLTK di semua area ini (kadang -kadang dengan margin besar).
Model parser terlatih berikut tersedia. Untuk menggunakan integrasi spacy, Anda juga perlu menginstal model spacy untuk bahasa yang sesuai.
| Model | Bahasa | Info |
|---|---|---|
benepar_en3 | Bahasa inggris | 95.40 F1 pada set tes WSJ yang direvisi. Data pelatihan menggunakan tokenisasi yang direvisi dan anotasi sintaksis berdasarkan pedoman yang sama dengan Web Treebank dan Ontonotes bahasa Inggris, yang lebih cocok dengan praktik tokenisasi modern di perpustakaan seperti Spacy. Berdasarkan T5-Small. |
benepar_en3_large | Bahasa inggris | 96.29 F1 pada set tes WSJ yang direvisi. Data pelatihan menggunakan tokenisasi yang direvisi dan anotasi sintaksis berdasarkan pedoman yang sama dengan Web Treebank dan Ontonotes bahasa Inggris, yang lebih cocok dengan praktik tokenisasi modern di perpustakaan seperti Spacy. Berdasarkan T5-Large. |
benepar_zh2 | Cina | 92.56 F1 pada set tes CTB 5.1. Penggunaan dengan Spacy memungkinkan dukungan parsing dari teks mentah, tetapi API NLTK hanya mendukung parsing kalimat yang sebelumnya tokenisasi. Berdasarkan China Electra-180G-Large. |
benepar_ar2 | Arab | 90.52 F1 pada set tes SPMRL2013/2014. Hanya mendukung menggunakan API NLTK untuk parsing kalimat yang sebelumnya tokenisasi. Parsing dari teks mentah dan integrasi spacy tidak didukung. Berdasarkan XLM-R. |
benepar_de2 | Jerman | 92.10 F1 pada set tes SPMRL2013/2014. Berdasarkan XLM-R. |
benepar_eu2 | Basque | 93.36 F1 pada set tes SPMRL2013/2014. Penggunaan dengan Spacy First membutuhkan penerapan dukungan Basque dalam spacy. Berdasarkan XLM-R. |
benepar_fr2 | Perancis | 88.43 F1 pada set tes SPMRL2013/2014. Berdasarkan XLM-R. |
benepar_he2 | Ibrani | 93.98 F1 pada set tes SPMRL2013/2014. Hanya mendukung menggunakan API NLTK untuk parsing kalimat yang sebelumnya tokenisasi. Parsing dari teks mentah dan integrasi spacy tidak didukung. Berdasarkan XLM-R. |
benepar_hu2 | Hongaria | 96.19 F1 pada set tes SPMRL2013/2014. Penggunaan dengan spacy membutuhkan model Hongaria untuk spacy. API NLTK hanya mendukung parsing kalimat yang sebelumnya tokenisasi. Berdasarkan XLM-R. |
benepar_ko2 | Korea | 91.72 F1 pada set tes SPMRL2013/2014. Dapat digunakan dengan model segmentasi kalimat multi-bahasa Spacy (membutuhkan Spacy v3.0). API NLTK hanya mendukung parsing kalimat yang sebelumnya tokenisasi. Berdasarkan XLM-R. |
benepar_pl2 | Polandia | 97.15 F1 pada set tes SPMRL2013/2014. Berdasarkan XLM-R. |
benepar_sv2 | Swedia | 92.21 F1 pada set tes SPMRL2013/2014. Dapat digunakan dengan model segmentasi kalimat multi-bahasa Spacy (membutuhkan Spacy v3.0). Berdasarkan XLM-R. |
benepar_en3_wsj | Bahasa inggris | Pertimbangkan untuk menggunakan benepar_en3 atau benepar_en3_large sebagai gantinya . 95.55 F1 pada set tes WSJ kanonik yang digunakan selama beberapa dekade publikasi penguraian konstituensi bahasa Inggris. Berdasarkan Bert-Large-Incased. Kami percaya bahwa pedoman anotasi yang direvisi yang digunakan untuk pelatihan benepar_en3 / benepar_en3_large lebih cocok untuk penggunaan hilir karena lebih baik menangani penggunaan bahasa dalam teks web, dan lebih konsisten dengan praktik modern dalam parsing ketergantungan dan perpustakaan seperti spacy. Namun demikian, kami menyediakan model benepar_en3_wsj untuk kasus -kasus di mana menggunakan konvensi treebanking yang direvisi tidak tepat, seperti membandingkan model yang berbeda pada dataset yang sama. |
Pelatihan membutuhkan kloning repositori ini dari GitHub. Sementara kode model dalam src/benepar didistribusikan dalam paket benepar di PYPI, skrip pelatihan dan evaluasi langsung di bawah src/ tidak.
benepar , termasuk: NLTK 3.2, obor-struktur 0,4, Transformers 4.3.0, atau kompatibel.make Inside the EVALB/ Directory untuk mengkompilasi evalb Executable. Ini akan dipanggil dari Python untuk evaluasi. Jika pelatihan pada dataset SPMRL, Anda harus menjalankan make di dalam EVALB_SPMRL/ direktori sebagai gantinya. Model baru dapat dilatih menggunakan perintah python src/main.py train ... Beberapa argumen yang tersedia adalah:
| Argumen | Keterangan | Bawaan |
|---|---|---|
--model-path-base | Basis jalur untuk digunakan untuk menabung model | N/a |
--evalb-dir | Jalur ke Direktori Evalb | EVALB/ |
--train-path | Jalan menuju pelatihan pohon | data/wsj/train_02-21.LDC99T42 |
--train-path-text | Tokenisasi non-destruktif opsional dari data pelatihan | Tebak teks mentah; Lihat --text-processing |
--dev-path | Jalan menuju Pohon Pembangunan | data/wsj/dev_22.LDC99T42 |
--dev-path-text | Tokenisasi non-destruktif opsional dari data pengembangan | Tebak teks mentah; Lihat --text-processing |
--text-processing | Heuristik untuk menebak teks mentah dari file pohon yang secara deskruktif. Lihat load_trees() di src/treebanks.py | Aturan default untuk bahasa selain bahasa Arab, Cina, dan Ibrani |
--subbatch-max-tokens | Jumlah maksimum token untuk diproses secara paralel saat pelatihan (batch penuh mungkin tidak sesuai dengan memori GPU) | 2000 |
--parallelize | Mendistribusikan lapisan model pra-terlatih (misalnya T5) di beberapa GPU. | Gunakan paling banyak satu GPU |
--batch-size | Jumlah contoh per pembaruan pelatihan | 32 |
--checks-per-epoch | Jumlah evaluasi pengembangan per zaman | 4 |
--numpy-seed | Biji acak numpy | Acak |
--use-pretrained | Gunakan encoder pra-terlatih | Jangan gunakan encoder pra-terlatih |
--pretrained-model | Model untuk digunakan jika --use-pretrained disahkan. Mungkin jalur atau id model dari hub model huggingface | bert-base-uncased |
--predict-tags | Menambahkan komponen penandaan sebagian dan kerugian tambahan ke parser | Jangan memprediksi tag |
--use-chars-lstm | Gunakan representasi kata charlstm terpelajar | Jangan gunakan charlstm |
--use-encoder | Gunakan lapisan transformator yang dipelajari di atas model pra-terlatih atau charlstm | Jangan gunakan lapisan transformator ekstra |
--num-layers | Jumlah lapisan transformator untuk digunakan jika --use-encoder dilewatkan | 8 |
--encoder-max-len | Panjang kalimat maksimum (dengan kata -kata) diizinkan untuk lapisan transformator ekstra | 512 |
Argumen tambahan tersedia untuk hiperparameter lainnya; Lihat make_hparams() di src/main.py . Ini dapat ditentukan pada baris perintah, seperti --num-layers 2 (untuk parameter numerik), --predict-tags (untuk parameter boolean yang default ke false), atau --no-XXX (untuk parameter boolean yang default yang default yang default) benar).
Untuk setiap evaluasi pengembangan, f-score pada set pengembangan dihitung dan dibandingkan dengan yang terbaik sebelumnya. Jika model saat ini lebih baik, model sebelumnya akan dihapus dan model saat ini akan disimpan. Nama file baru akan berasal dari basis jalur model yang disediakan dan pengembangan F-Score.
Sebelum melatih parser, Anda pertama -tama perlu mendapatkan data pelatihan yang sesuai. Kami memberikan instruksi tentang cara memproses kumpulan data standar seperti PTB, CTB, dan data tugas bersama SMPRL 2013/2014. Setelah mengikuti instruksi untuk data WSJ bahasa Inggris, Anda dapat menggunakan perintah berikut untuk melatih parser bahasa Inggris menggunakan hyperparameter default:
python src/main.py train --use-pretrained --model-path-base models/en_bert_base
Lihat EXPERIMENTS.md Untuk lebih banyak contoh pilihan hiperparameter yang baik.
Model yang disimpan dapat dievaluasi pada corpus uji menggunakan perintah python src/main.py test ... dengan argumen berikut:
| Argumen | Keterangan | Bawaan |
|---|---|---|
--model-path | Jalur model yang disimpan | N/a |
--evalb-dir | Jalur ke Direktori Evalb | EVALB/ |
--test-path | Jalur untuk menguji pohon | data/23.auto.clean |
--test-path-text | Tokenisasi non-destruktif opsional dari data uji | Tebak teks mentah; Lihat --text-processing |
--text-processing | Heuristik untuk menebak teks mentah dari file pohon yang secara deskruktif. Lihat load_trees() di src/treebanks.py | Aturan default untuk bahasa selain bahasa Arab, Cina, dan Ibrani |
--test-path-raw | Jalur alternatif untuk menguji pohon yang hanya digunakan untuk evalb (digunakan untuk memeriksa ulang evaluasi terhadap pohon yang telah diproses tidak mengandung bug apa pun) | Bandingkan dengan pohon dari --test-path |
--subbatch-max-tokens | Jumlah maksimum token untuk diproses secara paralel (GPU tidak memiliki cukup memori untuk memproses dataset penuh dalam satu batch) | 500 |
--parallelize | Mendistribusikan lapisan model pra-terlatih (misalnya T5) di beberapa GPU. | Gunakan paling banyak satu GPU |
--output-path | Jalur untuk menulis pohon yang diprediksi untuk (menggunakan "-" untuk stdout). | Jangan Menyimpan Pohon yang Diprediksi |
--no-predict-tags | Gunakan tag sebagian emas saat menjalankan evalb. Ini adalah standar untuk publikasi, dan menghilangkan bendera ini dapat memberikan skor F1 yang sangat tinggi. | Gunakan tag bagian yang diprediksi untuk eval, jika tersedia |
Sebagai contoh, Anda dapat mengevaluasi model terlatih menggunakan perintah berikut:
python src/main.py test --model-path models/en_bert_base_dev=*.pt
Paket benepar dapat secara langsung menggunakan pos pemeriksaan yang disimpan dengan mengganti nama model seperti benepar_en3 dengan jalur seperti models/en_bert_base_dev_dev=95.67.pt Namun, merilis pos pemeriksaan file tunggal memiliki beberapa kekurangan:
Gunakan src/export.py untuk mengonversi file pos pemeriksaan menjadi direktori yang merangkum segala sesuatu tentang model yang terlatih. Misalnya,
python src/export.py export
--model-path models/en_bert_base_dev=*.pt
--output-dir=models/en_bert_base
Saat mengekspor, ada juga opsi --compress yang sedikit menyesuaikan bobot model, sehingga direktori output dapat dikompresi menjadi arsip zip dengan ukuran yang jauh lebih kecil. Kami menggunakan ini untuk rilis model resmi kami, karena ini adalah kerumitan untuk mendistribusikan bobot model yang berukuran 2GB+. Saat menggunakan opsi --compress , disarankan untuk menentukan set tes untuk memverifikasi bahwa kompresi memang memiliki dampak minimal pada akurasi penguraian. Menggunakan data pengembangan untuk verifikasi tidak disarankan, karena data pengembangan sudah digunakan untuk kriteria pemilihan model selama pelatihan.
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
Script src/export.py juga memiliki subkomand test yang kira -kira mirip dengan python src/main.py test , kecuali bahwa ia mendukung model yang diekspor dan memiliki bendera yang sedikit berbeda. Kami dapat menjalankan perintah berikut untuk memverifikasi bahwa parser bahasa Inggris kami menggunakan Bert-Large-Incased memang mencapai 95,55 F1 pada set tes WSJ kanonik:
python src/export.py test --model-path benepar_en3_wsj --test-path data/wsj/test_23.LDC99T42
Lihat EXPERIMENTS.md untuk instruksi tentang cara mereproduksi eksperimen yang dilaporkan dalam makalah ACL 2018 dan 2019 kami.
Jika Anda menggunakan perangkat lunak ini untuk penelitian, silakan mengutip makalah kami sebagai berikut:
@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",
}
Kode dalam repositori ini dan bagian-bagian readme ini didasarkan pada https://github.com/mitchellstern/minimal-pan-parser