Новый русский орфографический словарь для Firefox, Thunderbird и CSpell: как он собирался

от автора

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

Так случилось и с русским словарём для 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-словарь.

Причины две:

  1. Лицензирование и происхождение данных.

  2. Качество и управляемость изменений.

Для словаря, который потенциально должен попасть в 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 применяется к поддерживаемому выпуску проекта, а исторические уведомления нужны для корректной атрибуции и соблюдения условий исходных материалов.

Как строился пайплайн

Главный принцип был такой: никаких механических мегасклеек.

Пайплайн выглядел примерно так:

  1. Инвентаризация источников.

  2. Проверка лицензий и происхождения.

  3. Нормализация Hunspell-файлов.

  4. Сравнение .dic и .aff.

  5. Разделение источников на словарные семьи.

  6. Построение universe-кандидатов.

  7. Разметка кандидатов по политикам.

  8. Морфологическая проверка.

  9. Проверка е/ё.

  10. Проверка на корпусах.

  11. Hunspell-валидация.

  12. Проверка на регрессии и переобобщение.

  13. Сборка Hunspell-пакета.

  14. Сборка Firefox/Thunderbird-дополнения.

  15. Сборка CSpell-пакета.

Внутри проекта были отдельные очереди для разных типов кандидатов:

  • слова, которые можно добавить сразу;

  • слова, которым нужна морфология;

  • exact-only формы;

  • продуктивные словоформы, которые лучше не добавлять напрямую;

  • кандидаты с недостаточными доказательствами;

  • слова для ручной проверки;

  • отложенные и отклонённые кандидаты.

Отдельная большая часть работы — не добавить лишнего. Для русского языка это особенно важно: если неверно подобрать Hunspell-флаг, можно случайно разрешить не только нужное слово, но и множество странных или неправильных форм.

Что делали с морфологией

Hunspell-словарь — это не просто список слов.

Запись в .dic может содержать флаги, которые говорят Hunspell, какие формы можно строить от этой основы: падежи, числа, род, степени сравнения, глагольные формы и так далее.

Поэтому для каждого кандидата надо было решить: это самостоятельная точная форма или базовая форма с морфологической моделью?

Например, современное техническое слово может встретиться в корпусе не в именительном падеже, а в родительном или множественном числе. Но в словарь правильно добавить не эту конкретную словоформу, а базовую лемму с подходящим флагом.

И наоборот: некоторые слова лучше добавлять только exact-only, без продуктивного расширения, если модель даёт слишком много риска.

Для этого были реализованы проверки:

  • какие флаги уже используются у похожих слов;

  • какие формы Hunspell начинает принимать после добавления;

  • не появляются ли нежелательные регрессии;

  • покрывается ли слово уже существующей морфологией;

  • не является ли кандидат просто продуктивной словоформой от уже существующей основы;

  • не создаёт ли добавление слишком широкое принятие сомнительных форм.

В результате часть слов добавлялась с морфологией, часть — как точные формы, часть — отклонялась или откладывалась.

Что делали с буквой ё

Отдельная боль русского spell-checking — буква ё.

С одной стороны, правильная орфография требует различать е и ё. С другой — в реальных текстах ё часто заменяют на е, и словарь не должен массово подчёркивать обычные тексты как ошибочные только потому, что пользователь пишет «е» вместо «ё».

Поэтому в проекте была отдельная политика е/ё.

Мы проверяли случаи, когда слово с ё уже принимается словарём, но соответствующий вариант с е не принимается. Для таких случаев добавлялись недостающие пары, если форма не была уже покрыта другой записью.

В версии 1.0.1 дополнения была отдельно исправлена проблема отсутствующих пар ё/е: слова, принимаемые с ё, теперь также принимаются с е там, где такая форма раньше не покрывалась словарём.

Какие корпуса использовались

Чтобы не работать «на глаз», словарь проверялся на реальных текстах.

Использовались четыре основных корпуса:

Корпус

Зачем был нужен

Mozilla L10N

браузерная, почтовая и интерфейсная терминология

Habr

современная техническая лексика

Lenta.Ru

массовый новостной русский язык

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:

Russian Spelling Dictionary

Это современный русский словарь проверки орфографии для 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 напрямую, а с собственным форматом словарей.

Как быстро протестировать словарь

Я очень прошу поставить словарь и проверить его на своих текстах.

Самый простой способ:

  1. Установить дополнение Russian Spelling Dictionary из AMO.

  2. Открыть любое многострочное текстовое поле.

  3. Щёлкнуть внутри поля правой кнопкой мыши.

  4. Включить проверку орфографии, если она выключена.

  5. В меню Languages / Языки выбрать русский словарь.

  6. Вставить свой текст и посмотреть, что подчёркивается.

Чтобы быстро открыть тестовое поле, можно вставить в адресную строку 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/