# 言語

スパムはあらゆる言語で届き、普通のメールも同じです。Spam Scannerはその両方を読み、よく知らない言語については慎重に扱います。アラビア語や中国語のメッセージをすべてスパム扱いするスパムフィルターは、ないほうがましだからです。


## あらゆる文字体系を読む

* **単語**：テキストは`Intl.Segmenter`で分割します。これはUnicodeの単語境界の規則に従い、スペースを使わずに書く中国語、日本語、タイ語、ラオ語、クメール語、ビルマ語には辞書を使います。長いテキストは先に分割します。Node.js 18のセグメンターは、非常に長い文字列で遅くなるためです。
* **正規化**：UnicodeのNFKCで、全角文字とほとんどの装飾文字（𝐅𝐑𝐄𝐄、Ⓕⓡⓔⓔ）を通常の文字に変換します。テキストはUnicodeの規則で小文字化します。
* **偽装**：単語の中の不可視文字（2文字の間にゼロ幅スペースを入れた`free`、ソフトハイフンなど）は削除して数えます。キリル文字のаを使った`pаypal`のように複数の文字体系が混ざった単語は、1つの文字体系に戻して数えます。文字の代わりに使われた数字（`v1agra`）はそろえます。それぞれの偽装はそれ自体が1つの特徴になり、3つ以上の不可視文字や、2つ以上の文字体系が混ざった単語があれば点数も加算されます。


## 言語の検出

各メッセージの言語は、その文字体系から検出します。多くの言語で共有される文字体系の場合は、使われている文字からも判断します。

* ハングルは韓国語、ひらがなとカタカナは日本語です。タイ文字、ギリシャ文字、ヘブライ文字、アルメニア文字、ジョージア文字、ベンガル文字、タミル文字など、1つの言語で使われる文字体系はそのまま言語を示します。
* 1つの言語にしかないキリル文字で、ウクライナ語（і、ї、є、ґ）、ベラルーシ語（ў）、セルビア語（ђ、ћ、џ）、マケドニア語（ѓ、ќ、ѕ）、ロシア語（ы、э、ё）を判別します。
* 複数の言語で共有される文字体系（ラテン文字、キリル文字、アラビア文字、デーヴァナーガリーなど）のテキストは、判断できる長さがあれば[franc](https://github.com/wooorm/franc)に渡します。短いメッセージにまれな言語のラベルが付かないよう、メールでよく使われる言語に限定しています。

言語は`result.language`として報告されます。`allowedLanguages: ['en', 'de']`（`--allow-language en,de`）を指定すると、それ以外の言語だと確信をもって検出されたメールに3点が加算されます。


## モデルがよく知らない言語

分類器は例から学習します。公開されているスパムのデータセットには、英語以外のハムよりもはるかに多くの英語以外のスパムが含まれています。そのため単純な分類器は、中国語やアラビア語のテキストそのものがスパムを意味すると学習してしまいます。Spam Scannerはこれを3つの方法で補正します。

1. **言語は証拠にしない**：検出した言語と文字体系は手がかりとして使いません。
2. **単語はその言語の中で重み付けする**：単語のスパム確率は、すべての言語ではなく、そのメッセージの言語で分類器が学習したスパムとハムのメッセージ数に対して計算します。主にポルトガル語のスパムを学習したモデルでも、ポルトガル語の日常的な単語は中立のままです。
3. **確信度は学習量に従う**：分類器がその言語で各種類のメッセージを何通学習したかに応じて、結果を「判定不能」に引き寄せます。完全な確信を持つには各1,000通（小規模な個人用モデルでは、少ないほうのクラスの2%）が必要です。学習データにハムがない言語は、常に「判定不能」になります。

同梱モデルは、21言語に機械翻訳したSMSメッセージである[SMS Spam Multilingual Collection](https://huggingface.co/datasets/dbarbedillo/SMS_Spam_Multilingual_Collection_Dataset)を一度も見ていません。これらの規則を導入する前は、そのハムの5.7%をスパムと判定しており、ポルトガル語では55%、フランス語では41%に上りました。導入後は0.18%です。中国語、アラビア語、韓国語、日本語、ヒンディー語、ポルトガル語、フランス語、その他20言語ではゼロ、英語では0.27%でした。


## それらの言語でスパムを捕まえる

判定不能は安全ですが、スパムを捕まえるわけではありません。スパムを捕まえるのは次の3つです。

* **ほかの検査**は言語に左右されません。類似ドメイン、欺瞞的なリンク、実行ファイル、マクロ、認証、ブロックリスト、ルールです。
* **言語モデル**：最近のオープンモデルは100〜200の言語を読み、Spam Scannerは分類器が判定できないときにモデルに問い合わせます。エンドツーエンドテストでは、`qwen3.5:4b`が中国語、アラビア語、韓国語、ヒンディー語、タイ語でスパムを捕まえ、ハムを通すことを確認しています。[言語モデル](https://spamscanner.net/ja/docs/llm/)
* **自分のメールでの学習**：自分のメールで学習したモデルでは、ある言語でそれぞれ数百通のメッセージがあれば、分類器はその言語で十分な確信度を持ちます。[学習](https://spamscanner.net/ja/docs/training/)と、21言語を追加する[オプションのデータセット](https://spamscanner.net/ja/docs/training/#more-languages)を参照してください。
