opencorpora.org Python接口

opencorpora-tools的Python项目详细描述


这个包提供了python接口到http://opencorpora.org/

安装

pip install opencorpora-tools

用法

获取语料库

opencorpora工具可以处理来自http://opencorpora.org/的xml。

您可以手动(从“下载”页)下载并解压缩XML,或者 只需使用提供的命令行util:

$ opencorpora download

运行opencorpora download --help获取更多选项。

使用语料库

opencorpora tools包提供了两个完全不同的api 使用OpenCorpora XML文件:

  • opencorpora.load-使用lxml库在内存中加载xml并使用lxml 自定义元素类以提供良好的api。请注意 opencorpora xml语料库可以占用10gb的ram。
  • opencorpora.CorpusReader-速度较慢,可能不太方便, 但它允许避免将整个xml加载到内存中。它也没有 取决于lxml。

opencorpora.load api

首先,将语料库加载到内存:

>>> import opencorpora
>>> corpus = opencorpora.load('annot.opcorpora.xml')
>>> corpus
<Corpus revision=4213997 docs:3489 tokens:1740169>
>>> corpus.revision
'4213997'
>>> corpus.version
'0.12'

访问文档:

>>> len(corpus.docs)
3489
>>> corpus.docs[42]
<Doc id=44 tokens:2502 name='18801 Хитрость духа'>
>>> corpus[42]   # it is the same as corpus.docs[42]
<Doc id=44 tokens:2502 name='18801 Хитрость духа'>

句子、段落和标记可以直接访问:

>>> corpus.sentences[0]
<Sentence id=1 source='«Школа злословия» учит прикусить язык'>
>>> corpus.paragraphs[0]
<Paragraph id=1 source='«Школа злословия» учит прикусить язык  Сохранится ли градус дискуссии в новом сезоне?'>
>>> len(corpus.tokens)
1740169

使用文档对象:

>>> doc = corpus[42]
>>> doc
<Doc id=44 tokens:2502 name='18801 Хитрость духа'>
>>> doc.id
'44'
>>> doc.name
'18801 Хитрость духа'
>>> doc.source
'Хитрость духа  Почему князь Владимир крестил Русь\n\n28 июля православная ...'
>>> doc.tags
['Автор:Олег Давыдов', 'Год:2010', 'Дата:28/07', 'url:http://www.chaskor.ru/article/28_iyulyahitrost_duha_18801', 'Тема:ЧасКор:Общество']
>>> doc.paragraphs
[<Paragraph id=1176 source='Хитрость духа  Почему князь Владимир крестил Русь'>, ...]
>>> doc.sentences
[<Sentence id=3433 source='Хитрость духа'>,
 <Sentence id=3434 source='Почему князь Владимир крестил Русь'>,
 ...
]
>>> doc.tokens
[<Token id=64838 source='Хитрость'>, <Token id=64839 source='духа'>, ...]
>>> doc[0]  # the same as doc.tokens[0]
<Token id=64838 source='Хитрость'>

段落对象:

>>> para = doc.paragraphs[0]
>>> para.id
'1176'
>>> para.source
'Хитрость духа  Почему князь Владимир крестил Русь'
>>> para.sentences
[<Sentence id=3433 source='Хитрость духа'>, <Sentence id=3434 source='Почему князь Владимир крестил Русь'>]
>>> para.tokens
[<Token id=64838 source='Хитрость'>, <Token id=64839 source='духа'>, ...]
>>> para[0]  # the same as para.tokens[0]
<Token id=64838 source='Хитрость'>

句子对象:

>>> sent = doc.sentences[6]
>>> sent
<Sentence id=3439 source='У князя Святослава Игоревича было три сына: Ярополк, Олег и Владимир.'>
>>> sent.id
'3439'
>>> sent.source
'У князя Святослава Игоревича было три сына: Ярополк, Олег и Владимир.'
>>> sent.tokens
[<Token id=64912 source='У'>, <Token id=64913 source='князя'>, <Token id=64914 source='Святослава'>, ...]
>>> sent[1]  # the same as sent.tokens[1]
<Token id=64913 source='князя'>

令牌对象:

>>> token = sent[1]
>>> token
<Token id=64913 source='князя'>
>>> token.id
'64913'
>>> token.source
'князя'
>>> token.parses
[<Parse id=134923 lemma=князь grammemes=['NOUN', 'anim', 'masc', 'sing', 'gent']>,
 <Parse id=134923 lemma=князь grammemes=['NOUN', 'anim', 'masc', 'sing', 'accs']>]
>>> token.lemma  # lemma of a first parse, the same as token.parses[0].lemma
'князь'
>>> token.grammemes  # the same as token.parses[0].grammemes
['NOUN', 'anim', 'masc', 'sing', 'gent']
>>> token.parse  # the same as token.parses[0]
<Parse id=134923 lemma=князь grammemes=['NOUN', 'anim', 'masc', 'sing', 'gent']>

corpus、doc、paragraph、sentence、token和parse是自定义的etree元素 子类。您不仅限于上面描述的api-例如,它是可能的 使用xpath表达式处理语料库,lxml将返回 如果使用 opencorpora.load

opencorpora.corpusreader api

初始化:

>>> import opencorpora
>>> corpus = opencorpora.CorpusReader('annot.opcorpora.xml')

获取目录:

>>> corpus.catalog()
[('1', '"Частный корреспондент"'),
 ('2', '00021 Школа злословия'),
 ('3', '00022 Последнее восстание в Сеуле'),
 ('4', '00023 За кота - ответишь!'),
...

使用文档:

>>> seoul_words = corpus.words('3')
>>> seoul_words
['«', 'Последнее', 'восстание', '»', 'в', 'Сеуле', ...

>>> corpus.documents(categories='Тема:ЧасКор:Книги*')
[Document: 21759 2001-2010-й: книги, которые потрясали,
 Document: 12824 86 снов, вызванных полётом пчелы вокруг граната за секунду до пробуждения,
 Document: 10930 А бойтесь единственно только того, кто скажет: «Я знаю, как надо!»,
 ...

opencorpora.Corpora是在nltk的corpusreader接口之后建模的; 与http://nltk.googlecode.com/svn/trunk/doc/book/ch02.html协商 了解如何使用api。如果不完全一样, 但应该非常相似。

当前corposreader不提供访问原始opencorpora的方法 段落/句子/标记的ID。

性能

opencorpora xml很大(>;250mb),因此构建完整的dom树需要 大量内存(几GB,对于完整的语料库应该是10GB+)。 如果RAM不是问题opencorpora.load应该更快 更方便;否则opencorpora.CorpusReader应该工作得更好。

opencorpora.CorpusReader这样处理:

  1. corpus.get_document(doc_id)corpus.documents(doc_ids) 不要将原始XML加载到内存中,也不要解析整个XML。 它们使用预先计算的偏移量信息来分割XML。 偏移信息在第一次访问时计算,并且 已保存到“<;name>;~”文件。

    考虑文档加载o(1)的完整xml大小。 单个文档并不是很大,因此它们像往常一样加载和解析。

  2. 所有corpora api(corpus.iter_words等)都有迭代器方法。

开发

在github进行开发:https://github.com/kmike/opencorpora-tools 问题跟踪程序:https://github.com/kmike/opencorpora-tools/issues。 请随意提交想法、错误或请求。

运行测试

确保tox已安装并运行

$ tox

从源签出。测试应该在Python2.7和3.3+下通过。

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

推荐PyPI第三方库


热门话题
java正确使用setCellValueFactory   java当使用flavor维度时,设置Android applicationId的正确方法是什么?   java为了在测试用例中并发执行某些步骤,可以克隆WebDriver实例   JAVA中的If语句给出错误   java在kindle上使用JavaFX   java如何在屏幕上显示多个视图时提高性能?   java“重命名”文件项   使用kafka运行Spark流媒体示例时出现java NoSuchMethodError   java如何在查询视图时返回实体列表   java在条件表达式中使用equals方法   java实现了一种回调机制,用于通知插入/更新   java我想用动态的方式把这个json做成表格式,我怎样才能用安卓来制作呢?   java在另一个字符串的特定点输入字符串时遇到问题   java如何在SeleniumWebDriver中选择xpath中具有动态值的对象   JavaJooq生成一个静态方法来调用函数,但没有方法将其作为字段   scala文件名包含斜杠标点符号,并在线程“main”java中给出异常。木卫一。FileNotFoundException:foo/boo/en_en。json(没有这样的文件或目录)   java使用Saxon和XSLT转换JDOM XML文档   使用Java数组   java从smb文件夹读取文件   java在where in子句中没有值时如何执行查询