伯克利神经解析器
项目描述
伯克利神经解析器
一个具有11种语言模型的Python实现的高精度解析器。基于ACL 2018的《基于自注意力编码的成分句法解析》Constituency Parsing with a Self-Attentive Encoder,以及Multilingual Constituency Parsing with Self-Attention and Pre-Training中描述的附加更改。
内容
如果您主要关注训练自己的解析模型,请跳转到本README的训练部分。
安装
要安装解析器,运行以下命令
$ pip install cython numpy
$ pip install benepar[cpu]
Cython和numpy应在安装benepar之前单独安装。请注意,pip install benepar[cpu]
依赖于tensorflow
pip包,这是一个仅CPU版本的tensorflow。使用pip install benepar[gpu]
来引入对tensorflow-gpu
的依赖。安装支持GPU的TensorFlow版本可能需要额外的步骤;有关详细信息,请参阅官方TensorFlow安装说明。
Benepar与两个Python NLP库之一集成: NLTK 或 spaCy。
如果使用NLTK,应安装NLTK句子和单词分词器
>>> import nltk
>>> nltk.download('punkt')
如果使用spaCy,应安装您语言的spaCy模型。对于英语,安装命令是
$ python -m spacy download en
解析模型需要单独下载,使用以下命令
>>> import benepar
>>> benepar.download('benepar_en2')
有关模型的全列表,请参阅下面的可用模型部分。
使用
与NLTK一起使用
>>> import benepar
>>> parser = benepar.Parser("benepar_en2")
>>> tree = parser.parse("Short cuts make long delays.")
>>> print(tree)
(S
(NP (JJ Short) (NNS cuts))
(VP (VBP make) (NP (JJ long) (NNS delays)))
(. .))
速度提示:第一次调用parse
将比后续调用花费更长的时间,因为正在预热缓存。
解析器还可以解析预标记化的文本。对于某些语言(包括中文),由于缺少内置的分词器,这通常是必需的。
>>> parser.parse(['Short', 'cuts', 'make', 'long', 'delays', '.'])
使用 parse_sents
解析多个句子。它接受整个文档作为字符串,或句子列表。
>>> parser.parse_sents("The time for action is now. It's never too late to do something.")
>>> parser.parse_sents(["The time for action is now.", "It's never too late to do something."])
>>> parser.parse_sents([['The', 'time', 'for', 'action', 'is', 'now', '.'], ['It', "'s", 'never', 'too', 'late', 'to', 'do', 'something', '.']])
所有返回的解析树都使用 nltk.Tree
对象表示。
与 spaCy 一起使用
Benepar 还提供与 spaCy 集成的组件
>>> import spacy
>>> from benepar.spacy_plugin import BeneparComponent
>>> nlp = spacy.load('en')
>>> nlp.add_pipe(BeneparComponent("benepar_en2"))
>>> doc = nlp(u"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
对象开始遍历解析树来避免此类错误。
可用模型
以下训练好的解析器模型可用
模型 | 语言 | 信息 |
---|---|---|
benepar_en2 |
英语 | 在 WSJ 测试集上 95.17 F1,磁盘上 94 MB。 |
benepar_en2_large |
英语 | 在 WSJ 测试集上 95.52 F1,磁盘上 274 MB。当在 CPU 上运行时,此模型比 benepar_en2 慢 3 倍;我们建议在 GPU 上运行它。 |
benepar_zh |
中文 | 在 CTB 5.1 测试集上 91.69 F1。与 NLTK 一起使用时需要标记化句子(不支持未标记的原始文本。)使用如 jieba 这样的包进行标记化。与 spaCy 一起使用首先需要在 spaCy 中实现中文支持。撰写本文时,spaCy 没有官方的中文支持,但如 这个 这样的非官方包可能工作。 |
benepar_ar |
阿拉伯语 | 与 NLTK 一起使用时需要标记化句子(不支持未标记的原始文本。)与 spaCy 一起使用首先需要在 spaCy 中实现阿拉伯语支持。接受 Unicode 输入,但训练在转写文本上进行(请参阅 src/transliterate.py );如果有任何错误,请告知我们。 |
benepar_de |
德语 | 完全支持 NLTK 和 spaCy;使用 python -m spacy download de 下载 spaCy 的德语模型。 |
benepar_eu |
巴斯克语 | 与 NLTK 一起使用时需要标记化句子(不支持未标记的原始文本。)与 spaCy 一起使用首先需要在 spaCy 中实现巴斯克语支持。 |
benepar_fr |
法语 | 完全支持 NLTK 和 spaCy;使用 python -m spacy download fr 下载 spaCy 的法语模型。 |
benepar_he |
希伯来语 | 与 NLTK 一起使用时需要标记化句子(不支持未标记的原始文本。)与 spaCy 一起使用首先需要在 spaCy 中实现希伯来语支持。接受 Unicode 输入,但训练在转写文本上进行(请参阅 src/transliterate.py );如果有任何错误,请告知我们。 |
benepar_hu |
匈牙利语 | 与 NLTK 一起使用时需要标记化句子(不支持未标记的原始文本。)与 spaCy 一起使用需要 spaCy 的匈牙利语模型。 |
benepar_ko |
韩语 | 与 NLTK 一起使用时需要标记化句子(不支持未标记的原始文本。)与 spaCy 一起使用首先需要在 spaCy 中实现韩语支持。 |
benepar_pl |
波兰语 | 完全支持 NLTK(包括从原始文本进行解析。)与 spaCy 一起使用首先需要在 spaCy 中实现波兰语支持。 |
benepar_sv |
瑞典语 | 完全支持NLTK(包括从原始文本中进行解析。)使用spaCy首先需要在spaCy中实现瑞典语支持。 |
benepar_en |
英语 | 没有词性标注功能:我们建议使用benepar_en2 代替。使用此模型时,词性标注将从NLTK(需要nltk.download('averaged_perceptron_tagger') )或spaCy继承;然而,我们发现我们自己的标记器,如benepar_en2 中的标记器,给出了更好的结果。此模型发布是为了配合我们的ACL 2018论文,并保留以保持兼容性。在WSJ测试集上达到95.07 F1。 |
benepar_en_small |
英语 | 没有词性标注功能:我们建议使用benepar_en2 代替。此模型发布是为了配合我们的ACL 2018论文,并保留以保持兼容性。一个更小的模型,在CPU上运行时比benepar_en 快3-4倍,因为它使用了更小的ELMo版本。在WSJ测试集上达到94.65 F1。 |
benepar_en_ensemble |
英语 | 没有词性标注功能:我们建议使用benepar_en2_large 代替。此模型发布是为了配合我们的ACL 2018论文,并保留以保持兼容性。两个解析器的集成:一个使用原始ELMo嵌入,另一个使用5.5B ELMo嵌入。强烈推荐使用GPU来运行集成。在WSJ测试集上达到95.43 F1。 |
训练
用于训练解析模型的代码目前与上述发布版本中用于解析句子的代码不同,尽管两者都存储在本存储库中。训练代码使用PyTorch,可以通过从GitHub克隆此存储库来获取。发布版本使用TensorFlow,因为它允许将解析模型序列化到磁盘上的单个文件中,从而最小化软件依赖性并减少磁盘上的文件大小。
训练软件要求
- Python 3.6或更高版本。
- Cython 0.25.2或任何兼容版本。
- PyTorch 0.4.1,1.0/1.1或任何兼容版本。
- EVALB。开始之前,在
EVALB/
目录中运行make
以编译evalb
可执行文件。这将从Python用于评估。如果在对SPMRL数据集进行训练,请改在EVALB_SPMRL/
目录中运行make
。 - AllenNLP 0.7.0或任何兼容版本(仅在使用ELMo词表示时需要)
- pytorch-pretrained-bert 0.4.0或任何兼容版本(仅在使用BERT词表示时需要)
预训练模型(PyTorch)
以下预训练解析模型可供下载
en_charlstm_dev.93.61.pt
:我们最佳的、不依赖外部词表示的英语单系统解析器en_elmo_dev.95.21.pt
:我们从ACL 2018论文中获得的最佳英语单系统解析器。使用此解析器需要ELMo权重,这些权重必须单独下载。
要使用ELMo嵌入,请将以下文件下载到data/
文件夹中(保留其名称)
目前没有命令行选项来配置ELMo文件的位置/名称。
预训练BERT权重将根据需要由pytorch-pretrained-bert
包自动下载。
训练说明
可以使用命令python src/main.py train ...
训练一个新的模型。其中一些可用参数是
参数 | 描述 | 默认值 |
---|---|---|
--model-path-base |
用于保存模型的路径基础 | N/A |
--evalb-dir |
EVALB目录的路径 | EVALB/ |
--train-path |
训练树路径 | data/02-21.10way.clean |
--dev-path |
开发树路径 | data/22.auto.clean |
--batch-size |
每次训练更新的示例数量 | 250 |
--checks-per-epoch |
每个epoch的开发评估次数 | 4 |
–subbatch-max-tokens |
训练时并行处理的最大单词数(一个完整批次可能不适合GPU内存) | 2000 |
–eval-batch-size |
在开发集上进行评估时并行处理的示例数量 | 100 |
–numpy-seed |
NumPy随机种子 | 随机 |
–use-words |
使用学习到的词嵌入 | 不使用词嵌入 |
–use-tags |
使用预测的词性标签作为输入 | 不使用预测的标签 |
–use-chars-lstm |
使用学习到的CharLSTM词表示 | 不使用CharLSTM |
–use-elmo |
使用预训练的ELMo词表示 | 不使用ELMo |
–use-bert |
使用预训练的BERT词表示 | 不使用BERT |
–bert-model |
如果传递了 --use-bert ,则要使用的预训练BERT模型 |
bert-base-uncased |
–no-bert-do-lower-case |
指示BERT分词器保留大小写信息(设置应与使用的BERT模型匹配) | 执行小写化 |
–predict-tags |
向解析器添加词性标注组件和辅助损失 | 不预测标签 |
其他超参数也有可用参数;请参阅 src/main.py
中的 make_hparams()
。这些可以在命令行中指定,例如 --num-layers 2
(用于数值参数),--use-tags
(用于默认为False的布尔参数),或 --no-partitioned
(用于默认为True的布尔参数)。
如果传递了 --use-tags
,则假定训练和开发树具有预测的词性标签。如果传递了 --predict-tags
,则假定数据具有真实标签。因此,这两个选项不能同时使用。请注意,我们提供的 data/
文件夹中的文件具有预测标签,并且必须单独获取具有金标签的数据。
对于每次开发评估,计算开发集上的F分数并与之前最佳值进行比较。如果当前模型更好,则删除前一个模型并将当前模型保存。新文件名将根据提供的模型路径基础和开发F分数推导。
例如,要使用默认超参数训练一个英语解析器,可以使用以下命令
python src/main.py train --use-words --use-chars-lstm --model-path-base models/en_charlstm --d-char-emb 64
要训练一个使用ELMo嵌入的英语解析器,命令是
python src/main.py train --use-elmo --model-path-base models/en_elmo --num-layers 4
要训练一个使用BERT的英语解析器,命令是
python src/main.py train --use-bert --model-path-base models/en_bert --bert-model "bert-large-uncased" --num-layers 2 --learning-rate 0.00005 --batch-size 32 --eval-batch-size 16 --subbatch-max-tokens 500
评估说明
可以使用命令 python src/main.py test ...
使用以下参数在测试语料库上评估保存的模型
参数 | 描述 | 默认值 |
---|---|---|
--model-path-base |
保存模型的路径基础 | N/A |
--evalb-dir |
EVALB目录的路径 | EVALB/ |
–test-path |
测试树的路径 | data/23.auto.clean |
–test-path-raw |
仅用于evalb的替代测试树路径(用于验证对预处理的树的评估是否包含任何错误) | 与 --test-path 的树进行比较 |
–eval-batch-size |
在测试集上评估时并行处理的示例数量 | 100 |
如果解析器经过训练,需要将预测的词性标签作为输入(通过 --use-tags
标志),则假定测试树具有预测的词性标签。否则,不将测试树中的标签用作解析器的输入。
例如,提取预训练模型后,可以使用以下命令在测试集上评估它
python src/main.py test --model-path-base models/nk_base6_lstm_dev.93.61.pt
具有CharLSTM嵌入的预训练模型在开发集上获得93.61的F分数,在测试集上获得93.55。具有ELMo嵌入的预训练模型在开发集上获得95.21的F分数,在测试集上获得95.13。
使用训练模型
请参阅 src/main.py
中的 run_parse
函数,以了解如何从磁盘加载解析器并使用PyTorch代码库对句子进行解析的示例。
《export/export.py》文件包含了我们将基于ELMo的解析器转换为TensorFlow图的代码(用于解析器的发布版本)。对于基于BERT的解析器,请查阅《export/export_bert.py》。此导出代码硬编码了某些超参数选择,因此您可能需要对其进行调整以导出您自己的模型。将模型导出为TensorFlow格式允许将其存储在一个文件中,包括所有ELMo/BERT权重。我们还使用TensorFlow的图转换来减小模型在磁盘上的大小,同时对解析精度的影响微乎其微:压缩后的ELMo模型在测试集上的F1分数为95.07,与未压缩模型的95.13相比。
重现实验
我们用于ACL 2018论文的代码在git中标记为acl2018
。该版本的代码中的《EXPERIMENTS.md》文件包含了我们用于ACL 2018论文中报告的实验的命令行参数的附加说明。
当前存储库中的代码版本增加了新功能(如BERT支持和词性标注预测),消除了一些表现较差的解析器变体(例如CharConcat词表示),并更新到了PyTorch的新版本。《EXPERIMENTS.md》文件现在描述了用于训练我们针对评估的每种语言的最高性能单系统解析器的命令。
引用
如果您使用此软件进行研究,请按照以下方式引用我们的论文
@InProceedings{Kitaev-2018-SelfAttentive,
author = {Kitaev, Nikita and Klein, Dan},
title = {Constituency Parsing with a Self-Attentive Encoder},
booktitle = {Proceedings of the 56th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)},
month = {July},
year = {2018},
address = {Melbourne, Australia},
publisher = {Association for Computational Linguistics},
}
鸣谢
此存储库中的代码和本README的部分内容基于https://github.com/mitchellstern/minimal-span-parser
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码发行版
构建发行版
buzzepar-0.1.2.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 583be3291450ec98c07a7e4ca58987e56a7e9b62d6935df109ddd13fd644f67e |
|
MD5 | 27d88960b9319a22740240c5e9aae713 |
|
BLAKE2b-256 | ef8a16479c5121c91cbbe4717ec48f2f21251231f2dd7801ca74d47728bc876b |
buzzepar-0.1.2-py3.7-linux-x86_64.egg的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | f44f0cb912df2f656cbc725e78b7d3af37b26b86b09a2d9164a2383168ad7a14 |
|
MD5 | 429bae06b1dd04906a6399d31caf35b5 |
|
BLAKE2b-256 | ec582c193b1ba5317b0cef247e46a0ee5ebd24b1b74a2cff51d64f59ffa0e8fe |