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:дуб]