Python實施的11種語言模型的高準確解析器。基於ACL 2018的自動編碼器的選區解析,並在多語言選區解析中描述了自我注意力和預訓練中的其他更改。
2021年2月的新版本:伯克利神經解析器的0.2.0版現已發布,所有語言都具有較高質量的預培訓模型。現在推論使用pytorch而不是tensorflow(訓練始終僅是pytorch的)。對Python 2.7和3.5的支持。根據您選擇的預培訓模型,包括對培訓和使用自己的解析器的更新支持。
如果您主要有興趣培訓自己的解析模型,請跳到此讀數的培訓部分。
要安裝解析器,請運行命令:
$ pip install benepar注意:Benepar 0.2.0是對先前版本的重大升級,並配備了全新和高質量的解析器模型。如果您還沒有準備好升級,則可以將Benepar版本固定到上一版本(0.1.3)。
需要Python 3.6(或更新)和Pytorch 1.6(或更新)。有關如何在Pytorch的啟用GPU和僅CPU版本之間進行選擇的說明,請參見Pytorch網站;如果可用於Pytorch,Benepar將自動使用GPU。
使用Benepar的推薦方法是通過與Spacy集成。如果使用Spacy,則應為您的語言安裝Spacy模型。對於英語,安裝命令是:
$ python -m spacy download en_core_web_mdSpacy模型僅用於令牌化和句子分割。如果不需要解析語言的特定分析,則您也可以放棄一種特定於語言的模型,而是使用僅執行令牌化和分割的多語言模型。新近添加的3.0中添加的一種模型應該適用於英語,德語,韓語,波蘭語和瑞典語(但不是中文,因為它似乎不支持中文單詞細分)。
使用命令需要單獨下載解析模型:
>> > import benepar
>> > benepar . download ( 'benepar_en3' )有關模型的完整列表,請參見下面的可用模型部分。
使用Benepar的推薦方法是通過與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由於SPACY不提供官方選區解析API,因此所有方法均可通過擴展名稱空間Span._和Token._訪問。
可用以下擴展屬性:
Span._.labels :給定跨度的標籤元組。當解析樹中有一單鏈時,跨度可能具有多個標籤。Span._.parse_string :給定跨度的解析樹的字符串表示。Span._.constituents : Span對象的迭代器,用於在解析樹的預購遍歷中。Span._.parent :分析樹中的父Span 。Span._.children :在解析樹上的兒童Span上的迭代器。Token._.labels , Token._.parse_string , Token._.parent :這些行為與在包含令牌的長度跨度上調用相應方法相同。當在解析樹中不構成的跨度時,這些方法將引起例外。可以通過以句子級別(通過doc.sents的迭代)或單個Token對像開始穿越解析樹來避免這種錯誤。
還有一個NLTK接口,該接口旨在與預識別的數據集和樹庫一起使用,或者將解析器集成到已經執行(最少)標記和句子拆分的NLP管道中時。為了從原始文本開始解析,強烈鼓勵您使用spacy和benepar.BeneparComponent 。
用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 ))) (. .) ( '' '' )))並非所有benepar.InputSentence的字段都需要輸入,但是必須指定至少一個words和escaped_words 。解析器將嘗試猜測缺少字段的值,例如:
>> > input_sentence = benepar . InputSentence (
words = [ '"' , 'Fly' , 'safely' , '.' , '"' ],
)
>> > parser . parse ( input_sentence )使用parse_sents解析多個句子。
>> > 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 ])一些解析器模型還允許Unicode文本輸入進行調試/交互式使用,但是對於任何解析精度重要的應用程序,強烈勸阻RAW TEXT字符串。
>> > parser . parse ( '"Fly safely."' ) # For debugging/interactive use only.從原始文本解析時,我們建議使用Spacy和benepar.BeneparComponent 。原因是解析器模型沒有使用令牌或句子分離器運輸,並且某些型號也可能不包括言論的標記器。必須使用工具包來填充這些管道組件,並且Spacy在所有這些區域中的表現都超過了NLTK(有時略有邊距)。
可用以下訓練有素的解析器模型。要使用Spacy集成,您還需要為適當語言安裝Spacy模型。
| 模型 | 語言 | 資訊 |
|---|---|---|
benepar_en3 | 英語 | 在修訂的WSJ測試集上的95.40 F1。培訓數據使用與英語Web Treebank和Ontonotes相同的指南進行修訂的令牌化和句法註釋,該準則可以更好地匹配Spacy等庫中的現代令牌化實踐。基於T5-Mall。 |
benepar_en3_large | 英語 | 在修訂的WSJ測試集上的96.29 F1。培訓數據使用與英語Web Treebank和Ontonotes相同的指南進行修訂的令牌化和句法註釋,該準則可以更好地匹配Spacy等庫中的現代令牌化實踐。基於T5大。 |
benepar_zh2 | 中國人 | CTB 5.1測試集的92.56 F1。使用Spacy的使用允許支持原始文本解析,但是NLTK API僅支持先前的標記句子解析。基於中國電子180G大。 |
benepar_ar2 | 阿拉伯 | SPMRL2013/2014測試集的90.52 F1。僅支持使用NLTK API來解析先前令牌化句子。不支持從原始文本和Spacy集成中解析。基於XLM-R。 |
benepar_de2 | 德語 | SPMRL2013/2014測試集的92.10 F1。基於XLM-R。 |
benepar_eu2 | 巴斯克 | SPMRL2013/2014測試集的93.36 F1。首先使用Spacy的用法需要在Spacy中實施巴斯克的支持。基於XLM-R。 |
benepar_fr2 | 法語 | SPMRL2013/2014測試集的88.43 F1。基於XLM-R。 |
benepar_he2 | 希伯來語 | SPMRL2013/2014測試集的93.98 F1。僅支持使用NLTK API來解析先前令牌化句子。不支持從原始文本和Spacy集成中解析。基於XLM-R。 |
benepar_hu2 | 匈牙利 | SPMRL2013/2014測試集的96.19 F1。用Spacy使用使用匈牙利模型。 NLTK API僅支持以前的標記句子解析。基於XLM-R。 |
benepar_ko2 | 韓國人 | SPMRL2013/2014測試集的91.72 F1。可以與Spacy的多語言句子分割模型一起使用(需要Spacy v3.0)。 NLTK API僅支持以前的標記句子解析。基於XLM-R。 |
benepar_pl2 | 拋光 | SPMRL2013/2014測試集的97.15 F1。基於XLM-R。 |
benepar_sv2 | 瑞典 | SPMRL2013/2014測試集的92.21 F1。可以與Spacy的多語言句子分割模型一起使用(需要Spacy v3.0)。基於XLM-R。 |
benepar_en3_wsj | 英語 | 考慮使用benepar_en3或benepar_en3_large 。 95.55 F1在規範WSJ測試集上使用了數十年的英語選區解析出版物。基於Bert-large-uncand。我們認為,用於培訓benepar_en3 / benepar_en3_large的修訂的註釋指南更適合於下游使用,因為它們可以更好地處理Web文本中的語言用法,並且與依賴性解析和圖書館(如Spacy)中的現代實踐更一致。儘管如此,我們為使用修訂的Treebank公約不合適的情況提供了benepar_en3_wsj模型,例如對同一數據集上的不同模型進行基準測試。 |
培訓需要從GitHub克隆此存儲庫。雖然src/benepar中的模型代碼分佈在PYPI的benepar軟件包中,但直接在src/下的培訓和評估腳本不是。
benepar軟件包所需的所有依賴項,包括:NLTK 3.2,火炬結構0.4,變壓器4.3.0或兼容。EVALB/目錄中make以編譯evalb文件。這將從Python召集進行評估。如果在SPMRL數據集中進行培訓,則需要在EVALB_SPMRL/目錄中運行make 。可以使用命令python src/main.py train ...一些可用的論點是:
| 爭論 | 描述 | 預設 |
|---|---|---|
--model-path-base | 用於保存模型的路徑基礎 | N/A。 |
--evalb-dir | 通往目錄的路徑 | EVALB/ |
--train-path | 訓練樹的途徑 | data/wsj/train_02-21.LDC99T42 |
--train-path-text | 訓練數據的可選非破壞性令牌化 | 猜猜原始文字;參見--text-processing |
--dev-path | 開發樹的道路 | data/wsj/dev_22.LDC99T42 |
--dev-path-text | 開發數據的可選非破壞性令牌化 | 猜猜原始文字;參見--text-processing |
--text-processing | 從描述性象徵性樹文件中猜測原始文本的啟發式方法。請參閱src/treebanks.py中的load_trees() | 阿拉伯語,中文和希伯來語以外的其他語言規則 |
--subbatch-max-tokens | 訓練時(完整批量可能不適合GPU內存),並行處理的最大代幣數量 | 2000 |
--parallelize | 在多個GPU上分佈預訓練的模型(例如T5)層。 | 最多使用一個GPU |
--batch-size | 每個培訓更新的示例數量 | 32 |
--checks-per-epoch | 每個時期的開發評估數量 | 4 |
--numpy-seed | Numpy隨機種子 | 隨機的 |
--use-pretrained | 使用預訓練的編碼器 | 請勿使用預訓練的編碼器 |
--pretrained-model | 如果--use-pretrained使用的模型將傳遞。可能是HuggingFace模型中心的路徑或模型ID | bert-base-uncased |
--predict-tags | 在解析器中添加了言論的標記組件和輔助損失 | 不預測標籤 |
--use-chars-lstm | 使用學習的charlstm單詞表示 | 不要使用charlstm |
--use-encoder | 在預先訓練的模型或CharlstM之上使用學習的變壓器層 | 不要使用額外的變壓器層 |
--num-layers | 如果傳遞--use-encoder則要使用的變壓器層數 | 8 |
--encoder-max-len | 最大句子長度(用單詞)允許額外的變壓器層 | 512 |
其他參數可用於其他超參數;請參閱src/main.py中的make_hparams() 。這些可以在命令行上指定,例如--num-layers 2 (對於數值參數), --predict-tags (對於默認為false的boolean參數)或--no-XXX (對於默認的默認參數真實)。
對於每項開發評估,計算開發集的F評分並將其與以前的最佳成績進行了比較。如果當前模型更好,則將刪除先前的模型,並保存當前模型。新的文件名將來自提供的模型路徑基礎和開發F-評分。
在培訓解析器之前,您將首先需要獲取適當的培訓數據。我們提供有關如何處理如何處理PTB,CTB和SMPRL 2013/2014共享任務數據等標準數據集的說明。按照英語WSJ數據的說明後,您可以使用以下命令使用默認的超參數訓練英語解析器:
python src/main.py train --use-pretrained --model-path-base models/en_bert_base
有關良好的超參數選擇的更多示例,請參見EXPERIMENTS.md 。
可以使用命令python src/main.py test ...帶有以下參數:
| 爭論 | 描述 | 預設 |
|---|---|---|
--model-path | 保存模型的路徑 | N/A。 |
--evalb-dir | 通往目錄的路徑 | EVALB/ |
--test-path | 測試樹的途徑 | data/23.auto.clean |
--test-path-text | 測試數據的可選非破壞性令牌化 | 猜猜原始文字;參見--text-processing |
--text-processing | 從描述性象徵性樹文件中猜測原始文本的啟發式方法。請參閱src/treebanks.py中的load_trees() | 阿拉伯語,中文和希伯來語以外的其他語言規則 |
--test-path-raw | 僅用於伊斯特布的測試樹的替代路徑(用於對預處理樹的評估進行仔細檢查不包含任何錯誤) | 比較--test-path的樹木 |
--subbatch-max-tokens | 並行處理的最大代幣數(GPU沒有足夠的內存來處理一批的完整數據集) | 500 |
--parallelize | 在多個GPU上分佈預訓練的模型(例如T5)層。 | 最多使用一個GPU |
--output-path | 寫入預測樹的路徑(使用"-"用於Stdout)。 | 不要保存預測的樹 |
--no-predict-tags | 運行iSTAB時,請使用金色的言論部分。這是出版物的標準,省略此標誌可能會給出錯誤的F1分數。 | 如果可用 |
例如,您可以使用以下命令評估訓練有素的模型:
python src/main.py test --model-path models/en_bert_base_dev=*.pt
benepar軟件包可以通過使用諸如models/en_bert_base_dev_dev=95.67.pt之類的路徑替換諸如benepar_en3之類的型號來直接使用保存的檢查點。但是,釋放單文件檢查站有一些缺點:
使用src/export.py將檢查點文件轉換為目錄,該目錄封裝了有關訓練有素的模型的所有內容。例如,
python src/export.py export
--model-path models/en_bert_base_dev=*.pt
--output-dir=models/en_bert_base
導出時,還有一個--compress選項可稍微調整模型權重,因此可以將輸出目錄壓縮到尺寸較小的郵政編碼中。我們將其用於我們的官方模型發布,因為這是分發尺寸為2GB+的模型權重的麻煩。使用--compress選項時,建議指定測試集,以驗證壓縮確實對解析精度的影響最小。不建議使用開發數據進行驗證,因為開發數據已用於訓練過程中的模型選擇標準。
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
src/export.py腳本還具有一個test子命令,該子命令與python src/main.py test大致相似,只是它支持導出的模型並且具有略有不同的標誌。我們可以運行以下命令,以驗證我們的英語解析器使用Bert-large-uncunge確實在規範WSJ測試集上實現了95.55 F1:
python src/export.py test --model-path benepar_en3_wsj --test-path data/wsj/test_23.LDC99T42
有關如何在我們的ACL 2018和2019論文中重現實驗的說明,請參見EXPERIMENTS.md 。
如果您使用此軟件進行研究,請引用我們的論文如下:
@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",
}
此存儲庫中的代碼和此讀數的部分基於https://github.com/mitchellstern/minimal-pan-parser