Русская проверка орфографии в браузере — вещь почти невидимая. Пока она работает нормально, о ней не думаешь. Но стоит словарю начать подчёркивать обычные современные слова — и он сразу превращается из полезного инструмента в раздражитель.
Так случилось и с русским словарём для Firefox и Thunderbird. Текущий словарь много лет выполнял свою работу, но постепенно начал отставать от живого языка: технической лексики, интерфейсных слов, современной терминологии, слов из документации, ИБ, веба, разработки и повседневной цифровой среды.

История проекта началась с бага 2040224 в Bugzilla: Evaluate new Russian dictionary. В нём обсуждался вопрос, можно ли заменить старый русский словарь Mozilla на более новый словарь Александра Клюквина.
На первый взгляд задача звучала просто: взять словарь поновее, положить его в Firefox/Thunderbird, закрыть баг. На практике быстро стало понятно, что так делать нельзя.
Орфографический словарь — это не просто список слов.
Что было взято за основу
За основу был взят текущий Mozilla-совместимый русский Hunspell-словарь, происходящий из линии словаря Александра Лебедева.
Это важный момент: я не стал делать словарь «с нуля» и не стал механически склеивать все найденные русские словари. Базовый словарь уже имеет понятную историю использования в Mozilla-продуктах, совместимый лицензионный контур и Hunspell-структуру:
-
.dic— словарные записи; -
.aff— правила словоизменения.
На момент начала работы базовый словарь содержал 146 433 записи. Итоговый словарь в текущем пакете содержит 179 956 записей.
Но большая часть работы была не в том, чтобы «добавить 33 тысячи строк». Основная работа была в том, чтобы понять:
-
какие слова действительно нужны;
-
какие слова уже покрываются существующей морфологией;
-
какие слова надо добавлять как базовые леммы с Hunspell-флагами;
-
какие слова лучше добавлять только как exact-only (точные) формы;
-
какие слова лучше не добавлять вообще;
-
какие кандидаты являются опечатками, мусором корпуса, OCR-ошибками, фрагментами кода, никами или слишком рискованными формами.
Кроме Hunspell-версии для Firefox и Thunderbird, был также собран CSpell-пакет. Для CSpell пришлось отдельно развернуть Hunspell-словарь в список слов в кодировке UTF-8: итоговый CSpell-словарь содержит около 1,79 млн словоформ.
Публичный репозиторий проекта: https://github.com/Goudron/ru-spelling-dictionary
Почему нельзя было просто взять другой словарь
В Bugzilla в качестве одного из кандидатов обсуждался словарь Александра Клюквина. Он действительно интересен как источник для сравнения: он больше старого словаря и исторически тоже связан с русскими Hunspell-словарями.
Но его нельзя было просто взять и положить в Mozilla-словарь.
Причины две:
-
Лицензирование и происхождение данных.
-
Качество и управляемость изменений.
Для словаря, который потенциально должен попасть в Firefox и Thunderbird, недостаточно сказать: «этот файл больше, значит он лучше». Нужно понимать, откуда взяты записи, какие лицензии применяются, можно ли использовать данные в Mozilla-продуктах, что именно добавляется и не появляется ли из-за новых правил слишком широкое принятие неправильных форм.
Поэтому вместо простой замены был сделан воспроизводимый проект с инвентаризацией источников, проверкой лицензий, построением очередей кандидатов, корпусной проверкой и отдельной валидацией.
Категории источников
Источники были разделены на несколько категорий.
|
Категория |
Как использовалась |
|---|---|
|
Direct-use allowed |
можно использовать как источник кандидатов при сохранении уведомлений и после проверки |
|
Evidence-only |
можно использовать как сигнал, но нельзя копировать напрямую |
|
Coverage-only |
можно использовать для поиска пропущенных слов в реальных текстах |
|
Unknown / blocked |
нельзя использовать до выяснения лицензии и происхождения |
В прямой контур попали источники из Mozilla/Lebedev/LibreOffice/Debian/Ubuntu/Arch/Fedora-линии, где лицензии и происхождение позволяли работать с кандидатами.
Но и здесь была важная тонкость: LibreOffice, Debian, Ubuntu и Arch в нашем наборе оказались фактически одной словарной семьёй, а не четырьмя независимыми источниками. Поэтому нельзя было считать их четырьмя независимыми голосами «за» слово.
Другие источники использовались осторожно:
-
словарь Александра Клюквина;
-
AOT-словари;
-
LanguageTool;
-
OpenCorpora;
-
Wiktionary/Kaikki;
-
реальные текстовые корпуса.
Они были полезны для сравнения, поиска кандидатов, проверки покрытия и приоритизации, но не использовались как источник механического копирования.
Лицензия: почему MPL 2.0 и почему есть дополнительные уведомления
Итоговый словарь распространяется под Mozilla Public License 2.0.
Это естественный выбор для словаря, который должен быть пригоден для Mozilla-продуктов.
При этом в LICENSE сохранены дополнительные уведомления из предыдущей словарной линии: BSD-style notice для словаря Лебедева и уведомления из LibreOffice-family.
Это не «смешение лицензий для красоты», а нормальная юридическая гигиена. Если проект основан на предыдущем словаре или использует совместимую линию с обязательным сохранением уведомлений, эти уведомления надо сохранять.
MPL 2.0 применяется к поддерживаемому выпуску проекта, а исторические уведомления нужны для корректной атрибуции и соблюдения условий исходных материалов.
Как строился пайплайн
Главный принцип был такой: никаких механических мегасклеек.
Пайплайн выглядел примерно так:
-
Инвентаризация источников.
-
Проверка лицензий и происхождения.
-
Нормализация Hunspell-файлов.
-
Сравнение
.dicи.aff. -
Разделение источников на словарные семьи.
-
Построение universe-кандидатов.
-
Разметка кандидатов по политикам.
-
Морфологическая проверка.
-
Проверка
е/ё. -
Проверка на корпусах.
-
Hunspell-валидация.
-
Проверка на регрессии и переобобщение.
-
Сборка Hunspell-пакета.
-
Сборка Firefox/Thunderbird-дополнения.
-
Сборка CSpell-пакета.
Внутри проекта были отдельные очереди для разных типов кандидатов:
-
слова, которые можно добавить сразу;
-
слова, которым нужна морфология;
-
exact-only формы;
-
продуктивные словоформы, которые лучше не добавлять напрямую;
-
кандидаты с недостаточными доказательствами;
-
слова для ручной проверки;
-
отложенные и отклонённые кандидаты.
Отдельная большая часть работы — не добавить лишнего. Для русского языка это особенно важно: если неверно подобрать Hunspell-флаг, можно случайно разрешить не только нужное слово, но и множество странных или неправильных форм.
Что делали с морфологией
Hunspell-словарь — это не просто список слов.
Запись в .dic может содержать флаги, которые говорят Hunspell, какие формы можно строить от этой основы: падежи, числа, род, степени сравнения, глагольные формы и так далее.
Поэтому для каждого кандидата надо было решить: это самостоятельная точная форма или базовая форма с морфологической моделью?
Например, современное техническое слово может встретиться в корпусе не в именительном падеже, а в родительном или множественном числе. Но в словарь правильно добавить не эту конкретную словоформу, а базовую лемму с подходящим флагом.
И наоборот: некоторые слова лучше добавлять только exact-only, без продуктивного расширения, если модель даёт слишком много риска.
Для этого были реализованы проверки:
-
какие флаги уже используются у похожих слов;
-
какие формы Hunspell начинает принимать после добавления;
-
не появляются ли нежелательные регрессии;
-
покрывается ли слово уже существующей морфологией;
-
не является ли кандидат просто продуктивной словоформой от уже существующей основы;
-
не создаёт ли добавление слишком широкое принятие сомнительных форм.
В результате часть слов добавлялась с морфологией, часть — как точные формы, часть — отклонялась или откладывалась.
Что делали с буквой ё
Отдельная боль русского spell-checking — буква ё.
С одной стороны, правильная орфография требует различать е и ё. С другой — в реальных текстах ё часто заменяют на е, и словарь не должен массово подчёркивать обычные тексты как ошибочные только потому, что пользователь пишет «е» вместо «ё».
Поэтому в проекте была отдельная политика е/ё.
Мы проверяли случаи, когда слово с ё уже принимается словарём, но соответствующий вариант с е не принимается. Для таких случаев добавлялись недостающие пары, если форма не была уже покрыта другой записью.
В версии 1.0.1 дополнения была отдельно исправлена проблема отсутствующих пар ё/е: слова, принимаемые с ё, теперь также принимаются с е там, где такая форма раньше не покрывалась словарём.
Какие корпуса использовались
Чтобы не работать «на глаз», словарь проверялся на реальных текстах.
Использовались четыре основных корпуса:
|
Корпус |
Зачем был нужен |
|---|---|
|
Mozilla L10N |
браузерная, почтовая и интерфейсная терминология |
|
Habr |
современная техническая лексика |
|
массовый новостной русский язык |
|
|
OpenCorpora |
морфологическая и общеязыковая проверка |
В полном корпусном прогоне использовались:
-
Mozilla L10N: 585 документов, около 3 млн символов;
-
Lenta.Ru: около 801 тыс. документов, около 2 млрд символов;
-
Habr: около 299 тыс. документов, около 3,9 млрд символов;
-
OpenCorpora: около 110 тыс. документов, около 11,6 млн символов.
Важно: корпуса не использовались по принципу «возьмём все слова и добавим». Они использовались для обнаружения проблем, приоритизации кандидатов и проверки покрытия.
Например, если слово часто встречается на Хабре, это ещё не значит, что его автоматически надо добавить. Оно могло быть:
-
частью кода;
-
ником;
-
английским словом;
-
обрезком URL;
-
опечаткой;
-
мусором парсинга;
-
редкой фамилией;
-
формой, которую лучше покрыть через другую лемму.
Корпус помогает увидеть, где словарь реально мешает пользователю, но решение о добавлении всё равно должно быть словарным, морфологическим и лицензионно безопасным.
На промежуточной проверке по real-text samples новый словарь уменьшил число неизвестных токенов примерно на 10,37% в сумме по корпусам, а на Mozilla L10N — примерно на 43,49%. При этом в этом прогоне не было регрессий: новый словарь не перестал принимать слова, которые принимал базовый Mozilla-словарь.
Что добавлялось
Основной фокус был на современной и практически полезной лексике:
-
технические термины;
-
браузерная терминология;
-
слова из интерфейсов;
-
термины безопасности и приватности;
-
слова из документации;
-
современные заимствования;
-
общеупотребительные слова, отсутствовавшие в старом словаре;
-
корректные производные формы, если они подтверждались морфологией и корпусами.
Примеры слов, важных для современного технического текста:
антифишинговыйбраузерныйдвухфакторныйкаршерингкибербезопасностьковоркингмаркетплейсмессенджерподкастрепозиторийскриншотстримтокентрекерфреймхеш
Это не значит, что словарь стал «айтишным». Скорее, он перестал игнорировать тот русский язык, которым сегодня пишут пользователи, документация, интерфейсы и технические СМИ.
Дополнение для Firefox/Thunderbird
Словарь уже опубликован как дополнение для Firefox:
Это современный русский словарь проверки орфографии для Firefox и Thunderbird. На AMO сейчас опубликована версия 1.0.1. Дополнение содержит только Hunspell-словарь и manifest: без скриптов, разрешений, host permissions, телеметрии и сетевого доступа.
Основные свойства текущего пакета:
-
версия: 1.0.1;
-
лицензия: Mozilla Public License 2.0;
-
формат: Hunspell
.aff/.dic; -
целевые продукты: Firefox и Thunderbird;
-
назначение: проверка русской орфографии.
CSpell-версия
Кроме Hunspell-пакета, подготовлена версия для CSpell.
Это полезно для разработчиков, документации, CI и репозиториев, где проверка орфографии запускается не через Firefox/Thunderbird, а через cspell.
В репозитории есть готовая папка:
cspell/ README.md cspell.config.yaml cspell-ext.json dictionaries/ manifest.json ru_RU.txt.gz smoke/ positive.txt negative.txt
Подключение в проекте выглядит примерно так:
import: - ./path/to/ru-spelling-dictionary/cspell/cspell.config.yaml
После этого можно запускать:
cspell "**/*"
CSpell-словарь собран из того же Hunspell-источника, но представлен как список слов в кодировке UTF-8, потому что CSpell работает не с Hunspell .aff/.dic напрямую, а с собственным форматом словарей.
Как быстро протестировать словарь
Я очень прошу поставить словарь и проверить его на своих текстах.
Самый простой способ:
-
Установить дополнение Russian Spelling Dictionary из AMO.
-
Открыть любое многострочное текстовое поле.
-
Щёлкнуть внутри поля правой кнопкой мыши.
-
Включить проверку орфографии, если она выключена.
-
В меню Languages / Языки выбрать русский словарь.
-
Вставить свой текст и посмотреть, что подчёркивается.
Чтобы быстро открыть тестовое поле, можно вставить в адресную строку Firefox вот это:
data:text/html;charset=utf-8,%3Ctextarea%20autofocus%20spellcheck%3D%22true%22%20style%3D%22width%3A95vw%3Bheight%3A90vh%3Bfont%3A20px%20sans-serif%3B%22%3E%3C%2Ftextarea%3E
Откроется пустая страница с большим текстовым полем. Вставьте туда свой текст, включите русский словарь и посмотрите, что подчёркивается.

Какая обратная связь нужна
Очень нужны реальные примеры.
Пожалуйста, пишите, если:
-
словарь подчёркивает корректное современное слово;
-
словарь принимает явно неправильную форму;
-
не хватает ходового слова;
-
плохо работают формы с
е/ё; -
не хватает технических, браузерных, ИБ, веб- или интерфейсных терминов;
-
слово принимается только в одной форме, но не принимается в другой нормальной форме;
-
подсказки Hunspell выглядят странно.
Лучше всего присылать не просто одно слово, а короткий контекст:
Слово: антиспамовыйКонтекст: антиспамовый фильтрЧто сейчас: подчёркиваетсяЧто ожидается: должно приниматьсяПочему слово стоит добавить: распространённый термин в почтовых клиентах и ИБ
Особенно интересны современные и ходовые слова: то, что реально встречается в текстах, документации, интерфейсах, технических статьях и обычной переписке.
Что дальше
Сейчас словарь вынесен в отдельное дополнение, чтобы его можно было быстро установить и протестировать без ожидания релизного цикла Firefox и Thunderbird.
Следующий шаг — собрать обратную связь, исправить найденные проблемы и подготовить обновлённый словарь для включения в основной код Mozilla-продуктов. Цель — чтобы новый русский словарь в итоге использовался в Firefox и Thunderbird по умолчанию.
Также я хочу посмотреть возможность передать улучшения в LibreOffice, потому что у русской проверки орфографии в разных open source-продуктах общие исторические корни и схожие проблемы.
Если вы пишете по-русски в Firefox, Thunderbird, CSpell, документации, GitHub/GitLab, Markdown, почте или просто в браузерных текстовых полях — пожалуйста, установите словарь и попробуйте его на своих текстах.
Чем больше реальных примеров мы соберём сейчас, тем лучше будет следующая версия русского spell-checking для всех пользователей.
ссылка на оригинал статьи https://habr.com/ru/articles/1043982/