Введение
На данный момент PyMorphy2 - самая популярная библиотека для обработки слов в русском языке. Благодаря ей (как раньше, так и сейчас) строились и продолжают строиться различные NLP решения. Однако последний коммит в репозиторий этой библиотеки был сделан более 5 лет назад, а установка этой библиотеки на Python версии 3.11+ вызывает трудности, что делает использование данной библиотеки в нынешнее время максимально затруднительным.
Мы в Mind Simulation решили начать свой путь в Open Source, и решили начать его именно с того, чтобы представить миру разработчиков NLP свой аналог PyMorphy под названием SteosMorphy.
SteosMorphy - это высокопроизводительный морфологический анализатор и генератор словоформ, написанный на Go. Он представляет собой прямой аналог PyMorphy2, но с упором на максимальную скорость и эффективность, сохраняя при этом функционал и удобный API.
О проекте
Для начала хотелось бы показать некоторые сильные стороны проекта:
Язык разработки. Ядро проекта написано на языке Golang. Это позволяет достичь огромной скорости и по максимуму использовать преимущества компилируемых языков;
Качественный и обширный словарь. В основе SteosMorphy заложен огромный словарь, содержащий более 120000 лексем и ~5300000 словоформ. Все данные в словаре были проверены и выверены командой Mind Simulation, что гарантирует высокую точность разбора;
Полный морфологический разбор и генерация словоформ. SteosMorphy не просто находит нормальную форму слова (лемму), но и предоставляет исчерпывающую информацию о его грамматических характеристиках: часть речи, падеж, род, число и многое другое (всего 198 тегов). Кроме того, библиотека умеет генерировать все возможные словоформы для заданного слова, корректно обрабатывая даже сложные случаи супплетивизма (например, для лексемы "хороший" будут сгенерированы формы "лучше", "лучший");
Предсказание для несловарных слов (OOV). Современный язык постоянно пополняется неологизмами. SteosMorphy умеет работать со словами, которых нет в словаре, предсказывая их грамматические формы на основе наиболее длинных совпадающих суффиксов. Это позволяет успешно анализировать такие слова, как "нейросеть" или "программистка";
Гибридное использование: мощь Go в Python. Одна из главных фишек проекта - наличие CGo-обёртки, которая позволяет использовать всю мощь Go-библиотеки прямо в Python. Установка через pip и привычный API делают переход максимально простым для Python-разработчиков, которые хотят кардинально ускорить свои NLP-пайплайны;
Эффективная пакетная обработка. Для анализа больших текстовых массивов предусмотрены методы ParseList и InflectList. Они работают в конкурентном режиме, задействуя все доступные ядра процессора для достижения максимальной производительности (это стало доступно благодаря использованию Golang под капотом).
Кому подойдёт SteosMorphy?
Создателям высоконагруженных сервисов (поисковых систем, чат-ботов, аналитических платформ), где задержки на обработку текста критичны;
Go-разработчикам, которым нужен нативный, быстрый и надёжный инструмент для работы с русской морфологией;
Python-разработчикам и Data Scientist'ам, которые уперлись в потолок производительности PyMorphy2 и ищут способ ускорить обработку текстов без смены основного языка.
Как начать пользоваться (Golang)?
Начать работу с SteosMorphy очень просто. Для начала необходимо установить библиотеку
go get github.com/steosofficial/steosmorphy
Далее вызываем SteosMorphy внутри кода
package main
import (
"fmt"
SteosMorphy "github.com/steosofficial/steosmorphy"
)
func main() {
analyzer, err := SteosMorphy.LoadMorphAnalyzer()
if err != nil {
panic(err)
}
parses, _ := analyzer.Analyze("стали")
p := parses[0]
fmt.Printf("Лемма: %s, Часть речи: %s\n", p.Lemma, p.PartOfSpeech)
}
Как начать пользоваться (Python)?
Устанавливаем библиотеку привычным способом через pip
pip install steosmorphy
Далее вызываем в коде
from steosmorphy import MorphAnalyzer
analyzer = MorphAnalyzer()
result = analyzer.analyze("программистка")
p = result.first
print(f"Лемма: {p.lemma}, Падеж: {p.case}")
Больше примеров
Базовое использование:
package main
import (
"fmt"
SteosMorphy "github.com/steosofficial/steosmorphy/analyzer"
)
func main() {
// Инициализируем анализатор. Метод LoadMorphAnalyzer() автоматически найдет
// скомпилированный словарь в папке data/.
analyzer, err := SteosMorphy.LoadMorphAnalyzer()
if err != nil {
panic(err)
}
// 1. Анализируем слово
word := "стали"
parses, forms := analyzer.Analyze(word)
// 2. Печатаем варианты разбора
fmt.Printf("Варианты разбора для слова '%s':\n", word)
for _, p := range parses {
fmt.Printf(" - Лемма: %s Часть речи: %s Падеж: %s\n", p.Lemma, p.PartOfSpeech, p.Case)
}
// 3. Печатаем несколько словоформ
fmt.Printf("\nСловоформы для '%s':\n", word)
for i, p := range forms {
if i >= 5 { // Ограничим вывод для краткости
fmt.Println(" ...")
break
}
fmt.Printf("%s\n", p.Word)
}
}
Разбор неоднозначности:
parses, _ := analyzer.Analyze("стали")
// parses будет содержать 2 объекта *Parsed:
// 1. {Lemma: "стать", PartOfSpeech: "Глагол", ...}
// 2. {Lemma: "сталь", PartOfSpeech: "Существительное", Case: "Родительный", ...}
for _, p := range parses {
if p.PartOfSpeech == "Глагол" {
// ...
}
}
Генерация словоформ (Lexeme):
// Анализируем слово "хорошая"
_, forms := analyzer.Analyze("хорошая")
// `forms` будет содержать *полную* лексему, включая формы от корня "лучш-":
// - хороший
// - хорошая
// - лучше
// - лучший
// - лучшая
// ... и т.д.
Пакетная обработка:
texts := []string{"мама", "мыла", "раму", "стали", "программистка", "хороший"}
// Вызываем пакетную обработку
allParses := analyzer.ParseList(texts)
// Результат - один большой срез со всеми разборами
for _, p := range allParses {
fmt.Printf("Слово: %-15s Лемма: %-15s ЧР: %s\n", p.Word, p.Lemma, p.PartOfSpeech)
}
Работа с несловарными словами (OOV):
// "Нейросеть" - неологизм, его нет в словаре.
parses, forms := analyzer.Analyze("нейросети")
p := parses[0]
// p.Lemma -> "нейросеть"
// p.PartOfSpeech -> "Существительное"
// p.Gender -> "Женский"
// Будут также сгенерированы все предсказанные словоформы:
// "нейросетей", "нейросетью", "нейросетями" и т.д.
Аналогично данные примеры подходят для Python (наименование методов аналогично наименованию методов на Golang)
Сравнение производительности
Самым важным показателем для данного проекта является тестирование скорости выполнения. Важно отметить, что тестирование будет производиться отдельно Python версии библиотеки (как в режиме последовательной обработки, так и в режиме пакетной обработки данных), отдельно Golang версии (как в режиме последовательной обработки, так и в режиме пакетной обработки данных). Это разделение необходимо для того, чтобы вы могли выбрать для себя наилучший вариант и использовать именно его.
Производительность:
Кол-во слов |
PyMorphy2 |
Steosmorphy Python (последовательно) |
SteosMorphy Python (батчем) |
Steosmorphy (go) последовательно |
Steosmorphy (go) Батчем |
100 |
0.0081 сек |
0.0108 сек |
0.9337 сек |
0.001997 сек |
0.003353 сек |
1000 |
0.0498 сек |
1.2448 сек |
2.1368 сек |
0.94970 сек |
0.96020 сек |
10000 |
0.6420 сек |
2.4382 сек |
2.3044 сек |
1.137977 сек |
1.015793 сек |
100000 |
7.4897 сек |
12.4462 сек |
4.2254 сек |
2.65028 сек |
1.320670 сек |
1000000 |
73.9892 сек |
120.3686 сек |
24.7912 сек |
20.113258 сек |
4.820394 сек |
Память (ОЗУ):
Кол-во слов |
pymorphy2 |
steosmorphy |
steosmorphy (батчем) |
100 |
20.67 МБ |
125.01 МБ |
409.47 МБ |
1000 |
20.67 МБ |
125.01 МБ |
503.50 МБ |
10000 |
20.67 МБ |
125.01 МБ |
700.93 МБ |
100000 |
20.67 МБ |
125.01 МБ |
1546.57 МБ |
1000000 |
20.67 МБ |
125.01 МБ |
11482.59 МБ |
Задачи на развитие
Как и любой проект, SteosMorphy требует оптимизации и дальнейшего развития. Вот цели, которые мы ставим перед собой для дальнейшего развития
Ускорение реализации на Python
-
Оптимизация памяти (RAM)
Оптимизация RAM при загрузке SteosMorphy
Оптимизация RAM при выполнении генерации батчем
-
Улучшение словарям
Добавление новых слов в базовый словарь
Расширение уже существующего словаря новыми словоформами в недостающих тегах
Уменьшение веса проекта (сейчас проект на Python весит около 100МБ)
Заключение
SteosMorphy - новая библиотека для генерации словоформ и анализа слов, которая способна полноценно заменить PyMorphy2, и имеет поддержку команды Mind Simulation. Благодаря тому, что под капотом находится Golang, достигается огромная скорость обработки большого количества данных. Проект распространяется под свободной лицензией Apache 2.0 и активно приветствует вклад сообщества.
Поддержать проект звездочкой, внести изменения или просто ознакомиться с проектом можно на официальном гитхабе проекта SteosMorphy.
SeveR31
Почему эта библиотека сравниваеся с PyMorphy2, когда есть PyMorphy3?