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是这样处理的
corpus.get_document(doc_id)或corpus.documents(doc_ids)不会将原始XML加载到内存中,也不会解析整个XML。它们使用预先计算的偏移信息来切割XML。偏移信息在第一次访问时计算并保存到“<name>.~”文件中。
将文档加载视为O(1)相对于完整XML的大小。单个文档不是很大,所以它们和通常一样被加载和解析。
所有语料库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+下应该通过测试。
opencorpora-tools-0.6.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 89f373fc259920e6e0517c21fca07ee29f54af7befaa4938fb39eb7da30fca91 |
|
MD5 | 880f01919d377c664bb06315c620b009 |
|
BLAKE2b-256 | 27681117ff7456ee7ca9affdf0c3231367d2780ba36723502ac08cb7ae15d364 |
opencorpora_tools-0.6-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e12c166f22992066edced468dd81d6a7cb48c5dddbbfbb0eb71ebafa380cc635 |
|
MD5 | 553091acf70988ca268cd115257e448f |
|
BLAKE2b-256 | 0750f268e0f1a1961dab7aa7f0d3f286c7b492c4f3b901211298758ff986772a |