跳转到主要内容

opencorpora.org Python接口

项目描述

此软件包为http://opencorpora.org/提供了Python接口

安装

pip install opencorpora-tools

使用

获取语料库

Opencorpora-tools与http://opencorpora.org/的XML文件兼容。

您可以手动下载并解压缩XML(从“下载”页面)或使用提供的命令行工具

$ opencorpora download

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

使用语料库

opencorpora-tools软件包提供了两种完全不同的API,用于处理OpenCorpora XML文件

  • opencorpora.load - 使用lxml库在内存中加载XML,并使用lxml自定义Element类提供良好的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对象

>>> 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']>

语料库、文档、段落、句子、标记和解析是自定义的etree元素子类。您不仅限于上述API - 例如,可以使用XPath表达式处理语料库,如果使用opencorpora.load加载树,lxml将返回这些自定义元素类。

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。它不完全相同,但应该非常相似。

目前CorpusReader没有提供访问段落/句子/标记原始OpenCorpora ID的方法。

性能

OpenCorpora XML非常大(>250MB),构建完整的DOM树需要大量内存(几个GB,对于完整的语料库可能是10GB+)。如果内存不是问题,那么opencorpora.load应该更快、更方便;否则opencorpora.CorpusReader应该表现更好。

opencorpora.CorpusReader是这样处理的

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

    将文档加载视为O(1)相对于完整XML的大小。单个文档不是很大,所以它们和通常一样被加载和解析。

  2. 所有语料库API都有迭代方法(如corpus.iter_words等)。

开发

开发发生在github:https://github.com/kmike/opencorpora-tools问题跟踪器:https://github.com/kmike/opencorpora-tools/issues。您可以自由提交想法、错误或拉取请求。

运行测试

确保已安装tox并运行

$ tox

从源代码检出。在Python 2.7和3.5+下应该通过测试。

由以下支持