conll-u解析器将conll-u格式的字符串解析为嵌套的python字典
conllu的Python项目详细描述
conll-u分析器
conll-u解析器将CoNLL-U formatted字符串解析为嵌套的python字典。conll-u通常是自然语言处理任务的输出。
你为什么要用康露?
安装
pip install conllu
或者,如果您使用conda:
conda install -c conda-forge conllu
关于从0.1更新到1.0的说明
我不喜欢打破向后兼容,但能够添加新功能,我觉得我不得不。这意味着从0.1更新到1.0可能需要更改代码。这是关于how to upgrade to 1.0 的指南。
示例用法
在顶层,conllu提供了两种方法,parse
和parse_tree
。第一个函数解析句子并返回一个简单的列表。另一个返回嵌套树结构。让我们一个一个地看。
使用parse()解析成一个句子列表
>>>fromconlluimportparse>>>>>>data="""# text = The quick brown fox jumps over the lazy dog.1 The the DET DT Definite=Def|PronType=Art 4 det _ _2 quick quick ADJ JJ Degree=Pos 4 amod _ _3 brown brown ADJ JJ Degree=Pos 4 amod _ _4 fox fox NOUN NN Number=Sing 5 nsubj _ _5 jumps jump VERB VBZ Mood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin 0 root _ _6 over over ADP IN _ 9 case _ _7 the the DET DT Definite=Def|PronType=Art 9 det _ _8 lazy lazy ADJ JJ Degree=Pos 9 amod _ _9 dog dog NOUN NN Number=Sing 5 nmod _ SpaceAfter=No10 . . PUNCT . _ 5 punct _ _"""
现在您在一个名为data
的变量中拥有数据。让我们分析一下:
>>>sentences=parse(data)>>>sentences[TokenList<The,quick,brown,fox,...>]
高级用法:如果要同时解析多个句子(比如超过1兆字节),可以使用parse_incr()
而不是parse
来避免将它们同时加载到内存中。它接受一个打开的文件,并返回一个生成器而不是直接返回列表,因此您需要遍历它,或者调用list()来获取令牌列表。您将如何使用它:
fromioimportopenfromconlluimportparse_incrdata_file=open("huge_file.conllu","r",encoding="utf-8")fortokenlistinparse_incr(data_file):print(tokenlist)
对于大多数文件,parse
工作正常。
由于一个conll-u文件通常包含多个句子,parse()
总是返回一个句子列表。每个句子都由一个标记列表表示。
>>>sentence=sentences[0]TokenList<The,quick,brown,fox,...>该索引器支持索引,因此您可以得到一个由一个有序字典表示的第一个令牌,如:
>>> token = sentence[0]
>>> token
OrderedDict([
('id', 1),
('form', 'The'),
('lemma', 'the'),
...
])
>>> token["form"]
'The'
每个句子也可以在句子开始前以注释的形式包含元数据。这在名为metadata
的令牌列表的属性中可用。
>>>sentence.metadataOrderedDict([("text","The quick brown fox jumps over the lazy dog."),...])
如果你想找回你的conll-u格式的文本(也许是在改变一些东西之后?),使用serialize()
方法:
>>>sentence.serialize()# text = The quick brown fox jumps over the lazy dog.1ThetheDETDTDefinite=Def|PronType=Art4det__2quickquickADJJJDegree=Pos4amod__...
还可以使用to_tree
:
>>>sentence.to_tree()TokenTree<token={id=5,form=jumps},children=[...]>
就这样!
使用parse_tree()解析为依赖树列表
有时您对隐藏在conll-u文件的head
列中的树结构感兴趣。在这种情况下,使用parse_tree
获取表示句子的嵌套结构。
>>>fromconlluimportparse_tree>>>sentences=parse_tree(data)>>>sentences[TokenTree<...>]
高级用法:如果有许多语句(比如超过1兆字节)要同时解析,可以使用parse_tree_incr()
而不是parse_tree
来避免一次将它们加载到内存中。它接受一个打开的文件,并直接返回一个生成器而不是列表,因此您需要遍历它,或者调用list()来获取标记树。您将如何使用它:
fromioimportopenfromconlluimportparse_tree_incrdata_file=open("huge_file.conllu","r",encoding="utf-8")fortokentreeinparse_tree_incr(data_file):print(tokentree)
由于一个conll-u文件通常包含多个句子,parse_tree()
总是返回一个句子列表。每个句子都用记号树表示。
>>>root=sentences[0]>>>rootTokenTree<token={id=5,form=jumps,...},children=...>
要快速可视化树结构,可以在令牌树上调用print_tree
。
>>>root.print_tree()(deprel:root)form:jumpslemma:jumpupostag:VERB[5](deprel:nsubj)form:foxlemma:foxupostag:NOUN[4](deprel:det)form:Thelemma:theupostag:DET[1](deprel:amod)form:quicklemma:quickupostag:ADJ[2](deprel:amod)form:brownlemma:brownupostag:ADJ[3](deprel:nmod)form:doglemma:dogupostag:NOUN[9](deprel:case)form:overlemma:overupostag:ADP[6](deprel:det)form:thelemma:theupostag:DET[7](deprel:amod)form:lazylemma:lazyupostag:ADJ[8](deprel:punct)form:.lemma:.upostag:PUNCT[10]
要访问树中当前节点对应的令牌,请使用token
:
>>>root.tokenOrderedDict([('id',5),('form','jumps'),('lemma','jump'),...])
要开始遍历当前节点的子节点,请使用children属性:
>>>children=root.children>>>children[TokenTree<token={id=4,form=fox,...},children=...>,TokenTree<token={id=9,form=dog,...},children=...>,TokenTree<token={id=10,form=.,...},children=...>,]
就像使用parse()
一样,如果一个句子有元数据,那么它可以在名为metadata
的标记树根上的属性中使用。
>>>root.metadataOrderedDict([("text","The quick brown fox jumps over the lazy dog."),...])
如果你想找回你的conll-u格式的文本(也许是在改变一些东西之后?),使用serialize()
方法:
>>>root.serialize()# text = The quick brown fox jumps over the lazy dog.1ThetheDETDTDefinite=Def|PronType=Art4det__2quickquickADJJJDegree=Pos4amod__...
您可以在Universial Dependencies project上阅读conll-u格式。
在本地开发并运行测试
将存储库的分叉设置为您自己的github帐户。
克隆存储库位置你电脑上的Ally:
git clone git@github.com:YOURUSERNAME/conllu.git conllu cd conllu
安装用于运行测试的库:
pip install tox
现在您可以运行测试:
tox
这将在所有受支持的python版本中运行tox,还将检查代码覆盖率、语法错误以及导入的排序方式。
(可选)如果您只安装了一个版本的python,并且不想经历安装多个版本python的麻烦(提示:install pyenv and pyenv tox),只使用一个版本的python运行tox是可以的
tox -e py36
提出请求。这是一张good guide on PRs from GitHub。
感谢你帮助康洛成为一个更好的图书馆!