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这样处理:
corpus.get_document(doc_id)或corpus.documents(doc_ids) 不要将原始XML加载到内存中,也不要解析整个XML。 它们使用预先计算的偏移量信息来分割XML。 偏移信息在第一次访问时计算,并且 已保存到“<;name>;~”文件。
考虑文档加载o(1)的完整xml大小。 单个文档并不是很大,因此它们像往常一样加载和解析。
所有corpora api(corpus.iter_words等)都有迭代器方法。
开发
在github进行开发:https://github.com/kmike/opencorpora-tools 问题跟踪程序:https://github.com/kmike/opencorpora-tools/issues。 请随意提交想法、错误或请求。