pyrnc

Third-party tool to work with ruscorpora.ru


License
MIT
Install
pip install pyrnc==0.0.3

Documentation

PyRNC (Python for Russian National Corpus) -- сторонний инструмент для работы с данными ruscorpora.ru.

Установка

pip3 install pyrnc

Пример использования

from pyrnc.builder import *
from pyrnc.query import *
import pyrnc.load as load
from pyrnc.filters import YearQuotaSampling
import pyrnc.editor

# Создаём корпусный запрос
q = CorpusQuery("[lex:на]{1}[lex:кабан|лось|олень]")
mc = MainCorpusLexGram()
mc.lexemes_linear_adding(q.to_lexeme_tuples())
# Задаём параметры сортировки и выдачи на стороне сервера
# Получаем seed_id, он позволит вернуться к сортировке, созданной на сервере НКРЯ
seed_id = mc.add_seed(SeedParams(out="kwic", sort="random"))
# Скачиваем первые 100 страниц (примерно 15000 вхождений)
load.full_load_until(range(100), "hunting", mc)
# Объединяем страницы в один файл
load.join_by_load_id("hunting")

# Извлечём квотную выборку по векам
years = [range(1800, 1900), range(1900, 2000), range(2000, 2022)]
load.filter_joint("hunting.joint.p", YearQuotaSampling.function(years), "By Centuries")
# Графический интерфейс для ручного отсеивания корпусного шума
pyrnc.editor.show("hunting.joint - By Centuries.p")

Подкорпусы и сборка URL

Выдача данных из НКРЯ происходит по GET-запросам, у URL этих запросов сложная структура. Поэтому есть наследуемые объекты от QueryBuilder, которые делают всё сами, но нужно выбрать соответствующий подкорпус. Пока что есть только один:

  • MainCorpusLexGram -- для лексико-грамматического поиска в основном корпусе НКРЯ

Как писать запросы

Довольно просто. В тексте запроса есть два типа элементов -- токены и расстояния. Расстояния указываются между токенами.

  • Токены
    • Общая структура [параметр1:значение][параметр2:значение][параметр3:значение][параметрN:значение]
    • Параметры
      • lex -- какую лексему представляет искомый токен ([lex:дуб])
      • gr -- грамматические признаки, разделитель -- запятая, допустима скобочная группировка и дизъюнкция ([gr:S,(gen|gen2)])
      • sem -- семантические признаки, допустима конъюнкция, дизъюнкция и скобочная группировка ([sem: r:concr & (pt:part | pt:partb & pc:hum)])
      • add -- дополнительные признаки (флаги), например запрет на пунктуация после токена и пр., разделитель запятая ([add:-bmark,mw:speed:max])
  • Расстояние
    • Если расстояние выражено одним числом -- {n}. Если расстояние выражается отрезком: {a, b}. Кроме того, можно использовать _ вместо числового значения, как в нотации НКРЯ.

Пример

S (gen|gen2) -bmark
на расстоянии 1 от без
на расстоянии 1 от (NUM|ANUM) (gen|gen2)

Так отображается запрос в НКРЯ. Переведём его в наш формат:

[gr:S,(gen|gen2)][add:-bmark] {1} [lex:без] {1} [gr:(NUM|ANUM),(gen|gen2)]

Как найти под дубом и под большим дубом? [lex:под] {1,2} [lex:дуб]