# Многоязычный спам-фильтр

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


## Чтение слов

Слова выделяются с помощью `Intl.Segmenter` — правил границ слов Unicode со словарями для китайского, японского, тайского, лаосского, кхмерского и бирманского. Китайское предложение превращается в слова вроде 恭喜, 获得 и 大奖, а не в одну длинную строку, которая никогда не повторяется.

Маскировка снимается до подсчёта: невидимые символы внутри слов, кириллические или греческие буквы внутри латинских слов (`pаypal`), цифры вместо букв (`v1agra`), математические или обведённые буквы (𝐅𝐑𝐄𝐄). Каждый вид маскировки также служит отдельным признаком.


## Не помечать незнакомое

В публичных наборах данных гораздо больше спама на иностранных языках, чем ham на иностранных языках, поэтому наивный классификатор усваивает, что арабский или корейский текст сам по себе — спам. Spam Scanner никогда не использует язык как признак, взвешивает каждое слово относительно счётчиков спама и ham на его собственном языке и остаётся в состоянии «unsure» пропорционально тому, как мало ham он видел на этом языке.

В тесте на SMS-сообщениях на 21 языке, которых встроенная модель никогда не видела, это свело её ложные срабатывания на китайском, арабском, корейском, японском, хинди, бенгальском, урду, турецком, украинском и шведском к нулю.


## Ловить спам на любом языке

* **Проверки, которые не читают слова:** похожие домены, обманные ссылки, исполняемые файлы, макросы, SPF, DKIM, DMARC и чёрные списки.
* **Языковая модель** для писем с ответом «unsure». Открытые модели, такие как Qwen 3.5 и Gemma 4, читают на 140–200 языках; сквозные тесты проверяют спам и ham на китайском, арабском, корейском, хинди и тайском на реальной модели.
* **Ваша собственная почта.** Нескольких сотен писем каждого вида на языке достаточно, чтобы модель, обученная на вашей почте, была на нём полностью уверена.

```sh
spamscanner scan message.eml --llm ollama --llm-model qwen3.5:4b
spamscanner train --spam ~/Maildir/.Junk --ham ~/Maildir/cur --out my-model.json
```

Чтобы принимать только некоторые языки, `--allow-language en,de` добавляет баллы письмам, уверенно определённым на любом другом языке.

[Подробнее о языках](https://spamscanner.net/ru/docs/languages/)
