MyStem от Яндекса — морфология русского языка
Тыкаюсь в разные инструменты для придумывания новых идей, и наткнулся на MyStem.
Это бинарник от Яндекса, который умеет одну вещь: разбирать русские слова по морфологии. Подаёшь на вход «бежал» — он отвечает «бежать, глагол, прошедшее время, единственное число, мужской род». Использовался внутри Яндекс.Поиска для нормализации запросов, потом выложили в публичный доступ.
Версия 3.1, под Linux/Mac/Windows.
Что умеет конкретно
Лемматизация — сводит любую форму к начальной.
«Бежал», «бежим», «бежавший» → «бежать». «Цветам», «цветов» → «цветок».
На практике: поисковик понимает, что «куплю кроссовки» и «купить кроссовок» — одно и то же.
POS-теггинг — часть речи.
Метки: S существительное, A прилагательное, V глагол, ADV наречие, PR предлог, NUM числительное, плюс местоимения и служебные.
Грамматические признаки — падежи, числа, роды.
MyStem отдаёт признаки одной строкой через запятые, в поле gr. Лемма — в поле lex.
Подаём фразу доставка цветов на дом:
echo "доставка цветов на дом" | mystem -ni --format json
Реальный вывод MyStem 3.1:
{"analysis":[{"lex":"доставка","gr":"S,жен,неод=им,ед"}],"text":"доставка"}
{"analysis":[{"lex":"цветок","gr":"S,муж,неод=род,мн"},{"lex":"цвет","gr":"S,муж,неод=род,мн"}],"text":"цветов"}
{"analysis":[{"lex":"на","gr":"PR="},{"lex":"на","gr":"PART="}],"text":"на"}
{"analysis":[{"lex":"дом","gr":"S,муж,неод=вин,ед"},{"lex":"дом","gr":"S,муж,неод=им,ед"}],"text":"дом"}
Расшифровка gr-строки для слова доставка (S,жен,неод=им,ед):
- S — существительное
- жен — женский род
- неод — неодушевлённое
- = — разделитель постоянных и изменяемых признаков
- им — именительный падеж
- ед — единственное число
Если у слова несколько возможных разборов, MyStem отдаёт все. «Цветов» — родительный мн. от «цветок» (растение) или от «цвет» (расцветка). «На» — предлог или частица (как в «На, держи»). Самый вероятный вариант стоит первым.
Снятие омонимии.
«Стекло» — глагол или существительное? «Печь» — готовить или мебель? MyStem смотрит соседние слова и выбирает наиболее вероятный вариант.
Где это применяют
- Поиск по сайту с пониманием форм — человек ищет «бежать», находит статьи со словами «бегу», «бежал», «бежавший»
- Кластеризация семантики — собрал кучу запросов, привёл к леммам, объединил похожие
- Анализ отзывов — выделить существительные и прилагательные, увидеть на чём акцентируют клиенты
- Чат-боты — понимать ввод в любых формах
- Генерация заголовков с правильным склонением — шаблон «купить X в Y» работает для любых X и Y
Альтернативы
P. S. Но всё это нельзя делать на MyStem от Яндекса по лицензионному соглашению. Поэтому есть альтернативы:
- pymorphy3 — на Python
- phpMorphy — нативно на PHP
- spaCy с ru-моделью — на Python