# 语言

垃圾邮件以各种语言出现，普通邮件也是如此。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 分。


## 模型了解甚少的语言

分类器从示例中学习。公开的垃圾邮件数据集中，外语垃圾邮件远多于外语正常邮件，因此简单的分类器会学到：中文或阿拉伯文本身就意味着垃圾邮件。Spam Scanner 从三个方面纠正这一点：

1. **语言从不作为证据**。检测到的语言和文字不会被当作线索。
2. **词语在其所属语言内衡量**。一个词的垃圾邮件概率，是根据分类器在该邮件语言中见过的垃圾邮件和正常邮件数量计算的，而不是根据所有语言。在一个主要见过葡萄牙语垃圾邮件的模型中，日常的葡萄牙语词语仍保持中性。
3. **置信度取决于覆盖程度**。分类器在某种语言中见过的每类邮件越少，结果就越被拉向“不确定”：要达到十足的置信度，每类需要 1,000 封（对小型个人模型，则为较小类别的 2%）。训练数据中没有正常邮件的语言，总是得到“不确定”。

内置模型从未见过 [SMS Spam Multilingual Collection](https://huggingface.co/datasets/dbarbedillo/SMS_Spam_Multilingual_Collection_Dataset)，这是一组机器翻译成 21 种语言的短信。在采用这些规则之前，它把其中 5.7% 的正常邮件判为垃圾邮件，其中葡萄牙语达 55%，法语达 41%。采用之后降至 0.18%：中文、阿拉伯语、韩语、日语、印地语、葡萄牙语、法语以及其他 20 种语言均为零，英语为 0.27%。


## 识别这些语言中的垃圾邮件

“不确定”是安全的，但它识别不了垃圾邮件。有三样东西可以：

* **其他检查**不依赖语言：仿冒域名、欺骗性链接、可执行文件、宏、身份验证、黑名单和规则。
* **语言模型**。现代开放模型能读 100 到 200 种语言，只要分类器不确定，Spam Scanner 就会询问模型。端到端测试会检查 `qwen3.5:4b` 能否识别中文、阿拉伯文、韩文、印地文和泰文的垃圾邮件并放行正常邮件。[语言模型](https://spamscanner.net/zh/docs/llm/)
* **用你的邮件训练**。在用你自己的邮件训练的模型中，某种语言的每类邮件只需几百封，分类器在该语言上就有十足的置信度。[训练](https://spamscanner.net/zh/docs/training/)，以及一个增加 21 种语言的[可选数据集](https://spamscanner.net/zh/docs/training/#more-languages)。
