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