伯克利神经分析器

benepar的Python项目详细描述


伯克利神经分析器

一个高精度的解析器,有11种语言的模型,用python实现。基于2018年美国公民自由联盟(ACL)中使用自我关注编码器进行的选区分析,以及在自我关注和培训前进行的多语种选区分析。IN/< A/P>

内容

  1. 安装
  2. 用法
  3. 可用型号
  4. 培训
  5. 再现实验
  6. 引文
  7. 学分

如果您主要对培训自己的解析模型感兴趣,请跳到本自述文件中的培训部分。

安装

要安装解析器,请运行以下命令:

$ pip install cython numpy
$ pip install benepar[cpu]

Cython和Numpy应在安装Benepar之前单独安装。注意,pip install benepar[cpu]依赖于tensorflowpip包,它是tensorflow的一个只有cpu的版本。使用pip install benepar[gpu]来引入对tensorflow gpu的依赖性。安装启用GPU的TensorFlow版本可能需要其他步骤;有关详细信息,请参见TensorFlow官方安装说明。

BenePar与两个用于Python的NLP库之一集成:NLTKSPAcy

如果使用nltk,则应安装nltk语句和单词标记器:

>>>importnltk>>>nltk.download('punkt')

如果使用spacy,则应为您的语言安装spacy模型。对于英语,安装命令是:

$ python -m spacy download en

解析模型需要单独下载,使用以下命令:

>>>importbenepar>>>benepar.download('benepar_en2')

请参见下面的"可用型号"部分,以获取完整的型号列表。

用法

与NLTK一起使用

>>>importbenepar>>>parser=benepar.Parser("benepar_en2")>>>tree=parser.parse("Short cuts make long delays.")>>>print(tree)(S(NP(JJShort)(NNScuts))(VP(VBPmake)(NP(JJlong)(NNSdelays)))(..))

速度说明:第一次调用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集成的组件:

>>>importspacy>>>frombenepar.spacy_pluginimportBeneparComponent>>>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(DTThe)(NNtime))(PP(INfor)(NP(NNaction))))(VP(VBZis)(ADVP(RBnow)))(..))>>>sent._.labels('S',)>>>list(sent._.children)[0]Thetimeforaction

由于spacy不提供正式的选区解析api,因此可以通过扩展名称空间span.\u令牌访问所有方法。

以下扩展属性可用:

  • span."标签":给定范围的一组标签。当分析树中有一元链时,跨度可能有多个标签。
  • span.\uParse\u字符串:给定范围的分析树的字符串表示形式。
  • span."components":在解析树的预先顺序遍历中,对子components的span对象进行迭代器。
  • span.。parent:解析树中的parentspan
  • span."children":解析树中childspans上的迭代器。
  • 令牌。令牌。令牌。:它们的行为与在包含代币。

当对不是解析树的组成部分的跨度调用时,这些方法将引发异常。这种错误可以通过遍历从语句级别开始的解析树(通过遍历doc.sents)或使用单独的token对象来避免。

可用型号

提供以下经过培训的解析器模型:

<表><广告>型号 语言 信息< /广告><正文>benepar_en2英语华尔街日报测试集95.17 F1,磁盘94 MB。benepar_en2_large英语华尔街日报测试集95.52 F1,磁盘274 MB。当在CPU上运行时,此模型比benepar en2慢3倍;我们建议在GPU上运行它。benepar_zh中文91.69 F1,在CTB 5.1测试装置上。与nltk一起使用需要标记化的句子(不支持未标记的原始文本)。请使用一个包,例如jieba进行标记化。使用spacy首先需要在spacy中实现中文支持。在撰写本文时,Spacy没有中国官方的支持,但是非官方的软件包,比如这个软件包可能可以工作。benepar_ar阿拉伯语使用nltk需要标记化的句子(不支持未标记的原始文本)。使用spacy首先需要在spacy中实现阿拉伯语支持。接受Unicode作为输入,但受过音译文本方面的培训(请参见src/transliterate.py);如果有任何错误,请告诉我们。效益德语完全支持nltk和spacy;使用python-m spacy download de下载德语spacy模型。benepar_eu巴斯克语使用nltk需要标记化的句子(不支持未标记的原始文本)。首先使用spacy需要在spacy中实现巴斯克支持。benepar_fr法语完全支持nltk和spacy;使用python-m spacy download fr下载法语的spacy模型。好处希伯来语使用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_en2。使用此模型时,部分语音标记将继承自nltk(需要nltk.download('average_perceptron_tagger'))或spacy;但是,我们发现在benepar_ EN2给出了更好的结果。该模型是随我们的acl 2018论文发布的,为了兼容而保留。华尔街日报测试集95.07 F1。小收益英语无词性标记功能:建议改用benepar_en2。该模型是随我们的acl 2018论文发布的,为了兼容而保留。在CPU上运行时比benepar_en快3-4倍的更小型号,因为它使用的是更小版本的elmo。华尔街日报测试集94.65 F1。benepar_en_集成英语无词性标记功能:建议改用benepar_en2_large。该模型是随我们的acl 2018论文发布的,为了兼容而保留。两个解析器的集合:一个使用原始elmo嵌入,另一个使用5.5b elmo嵌入。强烈建议使用GPU来运行集成。华尔街日报测试集95.43 F1。

培训

用于训练解析模型的代码目前与上述发行版中用于解析句子的代码不同,尽管它们都存储在这个存储库中。培训代码使用pytorch,可以通过从github克隆此存储库获得。发行版改用tensorflow,因为它允许将解析模型序列化为磁盘上的单个文件,从而最小化软件依赖性并减小磁盘上的文件大小。

培训的软件要求

预先培训的模型(pytorch)

以下预训练的解析器模型可供下载:

要使用elmo嵌入,请将以下文件下载到data/文件夹(保留其名称):

当前没有用于配置elmo文件的位置/名称的命令行选项。

预训练的伯特权重将根据需要由pytorch pre trained bert包自动下载。

培训说明

可以使用命令python src/main.py train…训练新模型。一些可用参数是:

<表><广告>参数 说明 默认值 < /广告><正文>--模型路径库用于保存模型的路径库 n/a--evalb direvalb目录的路径evalb/--列车路径训练树路径数据/02-21.10路。清洁 --开发路径发展路径树数据/22.自动清洗--批量大小 每次培训更新的示例数--按历元检查 每个历元的开发评估次数--子批次最大标记训练时要并行处理的最大字数(GPU内存中可能不适合整批处理)2000年--评估批量大小在开发集上进行评估时要并行处理的示例数--numpy seednumpy随机种子随机--使用单词使用所学的单词嵌入不要使用单词嵌入--使用标记使用语音标签的预测部分作为输入不要使用预测标记--使用字符lstm使用学习过的charlstm单词表示法不要使用charlstm--使用elmo 使用预先训练过的elmo单词表示法不要使用elmo--使用伯特使用预先训练过的bert单词表示法不要使用伯特--bert模型 如果--use bert通过,则使用预先训练的bert模型 bert base未加保护--没有bert do小写指示bert标记器保留案例信息(设置应与使用中的bert模型匹配)执行小写--预测标记将词性标记组件的一部分和辅助丢失添加到解析器中不要预测标记

其他超参数可以使用其他参数;请参见src/main.py中的make_hparams()。这些可以在命令行中指定,例如--num layers 2(对于数值参数)、--use tags(对于默认为false的布尔参数)或--no partitioned(对于默认为true的布尔参数)。

如果通过了--use tags,则假定训练树和开发树预测了部分语音标记。如果传递了predict tags,则假定数据具有ground truth标记。因此,这两个选项不能同时使用。请注意,我们在data/文件夹中提供的文件具有预测标记,必须单独获取带有金标记的数据。

对于每个开发评估,计算开发集上的F分数,并与以前的最佳值进行比较。如果当前模型更好,将删除以前的模型并保存当前模型。新文件名将从提供的模型路径库和开发F-score中派生出来。

例如,要使用默认超参数训练英语解析器,可以使用以下命令:

python src/main.py train --use-words --use-chars-lstm --model-path-base models/en_charlstm --d-char-emb 64

要训练使用elmo嵌入的英语解析器,命令是:

$ pip install cython numpy
$ pip install benepar[cpu]
0

要训练使用bert的英语解析器,命令是:

$ pip install cython numpy
$ pip install benepar[cpu]
1

评估说明

使用命令python src/main.py test…可以在测试语料库上对保存的模型进行求值,参数如下:

<表><广告>参数 说明 默认值 < /广告><正文>--模型路径库保存模型的路径基 n/a--evalb direvalb目录的路径evalb/--测试路径测试树路径数据/23.自动清洗--原始测试路径测试仅用于evalb的树的替代路径(用于检查针对预处理树的求值是否不包含任何错误)与--测试路径中的树进行比较 --评估批量大小在测试集上进行评估时要并行处理的示例数

如果解析器被训练为将预测的部分语音标记作为输入(通过--use tags标志),则假设测试树具有预测的部分语音标记。否则,测试树中的标记不会用作解析器的输入。

例如,提取预训练模型后,可以使用以下命令在测试集中对其进行评估:

$ pip install cython numpy
$ pip install benepar[cpu]
2

使用charlstm嵌入的预训练模型在开发集上获得了93.61的f分数,在测试集上获得了93.55的f分数。带有elmo嵌入的预训练模型在开发集上的f得分为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,而未压缩的模型的F1分数为95.13。

再现实验

我们的acl 2018论文使用的代码在git中标记为acl2018。该版本的代码中的experiments.md文件包含有关我们用于执行acl 2018论文中报告的实验的命令行参数的附加说明。

此存储库中当前的代码版本增加了新功能(如bert支持和部分语音标记预测),消除了一些性能较差的解析器变体(如charconcat单词表示),并已更新为pytorch的新版本。experiments.md文件现在描述了用于为我们评估的每种语言训练性能最佳的单系统解析器的命令。

引文

如果您使用本软件进行研究,请引用我们的论文如下:

$ pip install cython numpy
$ pip install benepar[cpu]
3

学分

此存储库中的代码和本自述文件的某些部分基于https://github.com/mitchellstern/minimal-span-parser" rel="nofollow">https://github.com/mitchellstern/minimal-span-parser

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java文件分块,获取长度字节   java嵌入式Tomcat不执行jsf页面   java我的数据库中有2个实体,但hibernate返回其中6个。   java如何基于逗号拆分字符串   java取消已经运行的CompletableFutures的预期模式是什么   java如何在informix中从另一个数据库复制表ddl和数据   为什么图片是黑色的?   java根据字符串数组中的单词筛选列表   Java8的集合。平行流有效吗?   Kotlin中的java静态内部类   java如何在GUI中生成一列字符串   javafx如何正确使用高对比度主题?   带空格的javascript Httpurlconnection参数   java如何设置GridBagLayout的约束   java如何在一个线程可能尚未初始化时关闭另一个线程   java将简单时间格式转换为特殊时间格式(hhmmt)   安卓/java阵列重复过滤器的问题   java在队列的链接实现下,入队和出队是如何工作的   java更新sql外键约束