-
Notifications
You must be signed in to change notification settings - Fork 2
Сравнение средств для поиска орфографических ошибок
Есть несколько хороших библиотек, которые могут проверять орфографию:
- Уже представленный LanguageTool (https://github.com/languagetool-org/languagetool) - существует хорошая библиотека под Python, которая запускает локальный сервер библиотеки на Java и обращается к ней через Python (https://pypi.org/project/language-tool-python/#description). Показывает отличный результат по поиску орфографических ошибок. Может легко использоваться для поиска их количества и возможных исправлений. Из минусов - необходима установки Java в контейнере и первичное скачивание 220 Мб приложения LanguageTool на Java при первом использовании библиотеки. Однако по возможности внедрения и результатам поиска русских орфографических ошибок превосходит конкурентов.
- Pyenchant (https://pyenchant.github.io/pyenchant/) - изначально нет проверки русской орфографии, но есть возможность использования пакета русского языка из Libre office (или можно воспользоваться другими словарями русского, например: https://code.google.com/archive/p/hunspell-ru/). Может проверять слова и целые предложения, использовать фильтры на email, ссылки и т.д.
- JamSpell (https://github.com/bakwc/JamSpell) - проверка орфографии на основе языковых моделей довольно быстрая и точная в поиске исправлений. Существует предобученный русский вариант, можно обучить свой. Но функциональность крайне ограниченная.
- TextBlob (https://textblob.readthedocs.io/en/dev/) - построена на библиотеке nltk, но может решать не совсем нужную задачу - коррекция текста. Для русского языка придется обучить на русских текстах (пример обучения: https://stackabuse.com/spelling-correction-in-python-with-textblob/). Встроенных в библиотеку решений для русского нет.
- PySpellChecker (https://pyspellchecker.readthedocs.io/en/latest/index.html) - довольно простая библиотека, специализирующаяся на проверке орфографии. Имеет русский язык по умолчанию. Работает только со словами, либо списками слов (нужна правильная токенизация перед запуском).
Для сравнения представленных средств был использован фрагмент "Преступления и наказания" Ф. М. Достоевского на английском языке (так как не все средства поддерживают русский). Была удалена вся пунктуация и текст был разделен на отдельные слова. В общем получилось 52919 слов. В 10% из них (5290) были намеренно занесены ошибки (перестановка символов, удаление символа, добавление нового символа, замена на символ близкий на клавиатуре). Каждое средство определяло есть ошибка в слове или нет. В результате были получены следующие результаты:
Имя библиотеки | True negative | False positive | True positive | False negative | Время (сек) | Доступность русского |
---|---|---|---|---|---|---|
LanguageTool | 4090 | 1201 | 46410 | 1218 | 931.7 | Да |
Pyenchant | 4091 | 1200 | 46162 | 1466 | 2.4 | Нет |
JamSpell | 2694 | 2597 | 47263 | 365 | 7.7 | Да |
TextBlob | 3892 | 1399 | 46286 | 1342 | 171.3 | Нет |
PySpellChecker | 3815 | 1476 | 43663 | 3965 | 127.2 | Да |
Здесь:
True negative - количество верно определенных ошибок в словах.
False positive - количество слов с ошибками, которые были определены, как слова без ошибок.
True positive - количество верно определенных слов без ошибок.
False negative - количество слов без ошибок, которые были определены, как слова с ошибками.
Доступность русского - возможность находить орфографические ошибки в русском тексте из коробки.
- Некоторые средства (например, LanguageTool) поддерживают нахождение ошибок сразу в большом блоке текста, так что при реальном применении они могут оказаться гораздо быстрее (а языковые модули натренерованные на связи слов в предложении могут быть и лучше).
- Сравнение происходило на английском тексте (так как не все средства изначально поддерживают русский), если взять тех, кто русский поддерживают и проверить их на русском тексте (5350 + 48151 слов), то получим следующие результаты:
Имя библиотеки | True negative | False positive | True positive | False negative | Время (сек) |
---|---|---|---|---|---|
Language Tool | 3781 | 1569 | 46489 | 1662 | 1169.1 |
JamSpell | 2871 | 2479 | 46484 | 1667 | 17.5 |
PySpellChecker | 4457 | 893 | 32707 | 15444 | 1692.2 |