conll-u解析器将conll-u格式的字符串解析为嵌套的python字典

conllu的Python项目详细描述


conll-u分析器

conll-u解析器CoNLL-U formatted字符串解析为嵌套的python字典。conll-u通常是自然语言处理任务的输出。

你为什么要用康露?

  • 很简单。大约300行代码。
  • 与Python2和Python3一起使用
  • 它没有依赖关系
  • 使用ci设置的一组不错的测试:Build status on Travis
  • 它有100%的测试覆盖率
  • 它有lots of downloads

安装

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提供了两种方法,parseparse_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格式。

在本地开发并运行测试

  1. 将存储库的分叉设置为您自己的github帐户。

  2. 克隆存储库位置你电脑上的Ally:

    git clone git@github.com:YOURUSERNAME/conllu.git conllu
    cd conllu
    
  3. 安装用于运行测试的库:

    pip install tox
    
  4. 现在您可以运行测试:

    tox
    

    这将在所有受支持的python版本中运行tox,还将检查代码覆盖率、语法错误以及导入的排序方式。

  5. (可选)如果您只安装了一个版本的python,并且不想经历安装多个版本python的麻烦(提示:install pyenv and pyenv tox),只使用一个版本的python运行tox是可以的

    tox -e py36
    
  6. 提出请求。这是一张good guide on PRs from GitHub

感谢你帮助康洛成为一个更好的图书馆!

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

推荐PyPI第三方库


热门话题
java如何将cassandra中的行数据转换为与列相关的嵌套json   java如何使用jcr XPath在jcr:content/@jcr:data中搜索?   java在使用openCV进行安卓开发时如何利用手机的广角镜头   java解析扩展了接口,结束了一个潜在的无限循环   位置服务的@Override方法中存在java Android应用程序错误   java本地线程的用途和需求是什么   具有左右子访问的java节点树遍历   java验证JsonWebToken签名   JUL日志处理程序中的java日志记录   嵌入式Java读取给定时间段的串行数据。   java有没有办法从多个URL获取多个图像?   java线程通过等待intent阻止自己发送intent   java Spring MVC解析多部分内容请求   java JPA/Hibernate静态元模型属性未填充NullPointerException   java格式错误的字符(需要引号,得到I)~正在处理   java为什么PrintWriter对象抛出FileNotFoundException?   java Neo4j未正确保存标签   java IE不加载图像