# Мови

Спам надходить будь-якою мовою, як і звичайна пошта. 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. **Упевненість залежить від покриття.** Результат зсувається до «невизначено» тим сильніше, чим менше листів кожного типу класифікатор бачив цією мовою: для повної впевненості потрібно по 1000 кожного (або 2 % меншого класу для малих персональних моделей). Мова без ham у навчальних даних завжди отримує «невизначено».

Вбудована модель ніколи не бачила [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 % англійською.


## Виявлення спаму цими мовами

«Невизначено» — безпечно, але спаму не ловить. Його ловлять три речі:

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