# Языки

Спам приходит на любом языке, как и обычная почта. Spam Scanner читает и то и другое и осторожен с языками, о которых знает мало: спам-фильтр, помечающий каждое письмо на арабском или китайском, хуже, чем никакого.


## Чтение любой письменности

* **Слова.** Текст разбивается с помощью `Intl.Segmenter`, который следует правилам границ слов Unicode и использует словари для китайского, японского, тайского, лаосского, кхмерского и бирманского — письменностей без пробелов. Длинные тексты сначала делятся на части, потому что сегментатор в Node.js 18 замедляется на очень длинных строках.
* **Нормализация.** Unicode NFKC превращает полноширинные и большинство стилизованных букв (𝐅𝐑𝐄𝐄, Ⓕⓡⓔⓔ) в обычные. Текст приводится к нижнему регистру по правилам Unicode.
* **Маскировка.** Невидимые символы внутри слов (`free` с пробелом нулевой ширины между двумя буквами, мягкие переносы) удаляются и подсчитываются. Слова, смешивающие алфавиты, например `pаypal` с кириллической «а», возвращаются к одному алфавиту и подсчитываются. Цифры, использованные вместо букв (`v1agra`), заменяются буквами. Каждый вид маскировки — отдельный признак, а три и более невидимых символа или два и более смешанных слова также добавляют баллы.


## Определение языка

Язык каждого письма определяется по письменности, а для письменностей, общих для многих языков, — по буквам:

* Хангыль означает корейский; хирагана и катакана означают японский; тайская, греческая, еврейская, армянская, грузинская, бенгальская, тамильская и другие письменности одного языка указывают на него напрямую.
* Кириллические буквы, встречающиеся только в одном языке, позволяют выбрать между украинским (і, ї, є, ґ), белорусским (ў), сербским (ђ, ћ, џ), македонским (ѓ, ќ, ѕ) и русским (ы, э, ё).
* Текст в письменностях, общих для нескольких языков (латиница, кириллица, арабское письмо, деванагари и другие), если его достаточно для суждения, передаётся в [franc](https://github.com/wooorm/franc) с ограничением на языки, распространённые в почте, чтобы короткие письма не получали метки редких языков.

Язык сообщается в `result.language`, а `allowedLanguages: ['en', 'de']` (`--allow-language en,de`) добавляет 3 балла письмам, уверенно определённым на любом другом языке.


## Языки, о которых модель знает мало

Классификатор учится на примерах. В публичных наборах данных со спамом гораздо больше спама на иностранных языках, чем ham на иностранных языках, поэтому наивный классификатор усваивает, что китайский или арабский текст сам по себе означает спам. Spam Scanner исправляет это тремя способами:

1. **Язык никогда не служит доказательством.** Определённые язык и письменность не используются как признаки.
2. **Слова взвешиваются внутри своего языка.** Вероятность спама для слова вычисляется относительно количества писем со спамом и ham, которые классификатор видел на языке письма, а не на всех языках. Обычное португальское слово в модели, которая видела в основном португальский спам, остаётся нейтральным.
3. **Уверенность следует за охватом.** Результат притягивается к «unsure» пропорционально тому, сколько писем каждого вида классификатор видел на этом языке: для полной уверенности нужно по 1000 каждого (или 2 % меньшего класса для небольших личных моделей). Язык без ham в обучающих данных всегда получает «unsure».

Встроенная модель никогда не видела [SMS Spam Multilingual Collection](https://huggingface.co/datasets/dbarbedillo/SMS_Spam_Multilingual_Collection_Dataset) — SMS-сообщения, машинно переведённые на 21 язык. До этих правил она помечала как спам 5,7 % этого ham, включая 55 % португальского и 41 % французского. С ними — 0,18 %: ни одного на китайском, арабском, корейском, японском, хинди, португальском, французском и 20 других языках и 0,27 % на английском.


## Как ловить спам на этих языках

Ответ «unsure» безопасен, но спам он не ловит. Ловят три вещи:

* **Остальные проверки** не зависят от языка: похожие домены, обманные ссылки, исполняемые файлы, макросы, аутентификация, чёрные списки, правила.
* **Языковая модель.** Современные открытые модели читают на 100–200 языках, и Spam Scanner обращается к модели всякий раз, когда классификатор не уверен. Сквозные тесты проверяют, что `qwen3.5:4b` ловит спам и пропускает ham на китайском, арабском, корейском, хинди и тайском. [Языковые модели](https://spamscanner.net/ru/docs/llm/)
* **Обучение на вашей почте.** В модели, обученной на вашей собственной почте, нескольких сотен писем каждого вида на языке достаточно для полной уверенности классификатора на нём. [Обучение](https://spamscanner.net/ru/docs/training/) и [дополнительный набор данных](https://spamscanner.net/ru/docs/training/#more-languages), который добавляет 21 язык.
