# 언어

스팸은 모든 언어로 도착하며, 평범한 메일도 마찬가지입니다. Spam Scanner는 둘 다 읽으며, 잘 모르는 언어는 신중하게 다룹니다. 아랍어나 중국어 메시지를 모두 스팸으로 표시하는 스팸 필터는 필터가 없는 것보다 나쁩니다.


## 모든 문자 체계 읽기

* **단어.** 텍스트는 `Intl.Segmenter`로 분리합니다. 이 기능은 유니코드 단어 경계 규칙을 따르며, 띄어쓰기 없이 쓰는 중국어, 일본어, 태국어, 라오어, 크메르어, 버마어에는 사전을 사용합니다. 긴 텍스트는 먼저 여러 조각으로 나눕니다. Node.js 18의 분리기는 아주 긴 문자열에서 느려지기 때문입니다.
* **정규화.** 유니코드 NFKC는 전각 글자와 대부분의 꾸민 글자(𝐅𝐑𝐄𝐄, Ⓕⓡⓔⓔ)를 일반 글자로 바꿉니다. 텍스트는 유니코드 규칙에 따라 소문자로 변환합니다.
* **위장.** 단어 안의 보이지 않는 문자(두 글자 사이에 폭 없는 공백이 들어간 `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" 쪽으로 끌어당깁니다. 완전한 확신에는 각 종류마다 1,000개(소규모 개인 모델이라면 더 작은 분류의 2%)가 필요합니다. 학습 데이터에 ham이 없는 언어는 항상 "unsure"가 됩니다.

번들 모델은 SMS 메시지를 21개 언어로 기계 번역한 [SMS Spam Multilingual Collection](https://huggingface.co/datasets/dbarbedillo/SMS_Spam_Multilingual_Collection_Dataset)을 본 적이 없습니다. 이 규칙을 적용하기 전에는 그 ham의 5.7%를 스팸으로 표시했고, 포르투갈어는 55%, 프랑스어는 41%에 달했습니다. 규칙을 적용한 뒤에는 0.18%입니다. 중국어, 아랍어, 한국어, 일본어, 힌디어, 포르투갈어, 프랑스어를 비롯한 다른 20개 언어에서는 하나도 없었고, 영어는 0.27%였습니다.


## 그 언어들로 된 스팸 잡기

unsure는 안전하지만 스팸을 잡지는 못합니다. 스팸을 잡는 것은 다음 세 가지입니다.

* **나머지 검사**는 언어와 무관합니다. 유사 도메인, 기만적인 링크, 실행 파일, 매크로, 인증, 차단 목록, 규칙이 그렇습니다.
* **언어 모델.** 최신 공개 모델은 100\~200개 언어를 읽으며, Spam Scanner는 분류기가 확신하지 못할 때마다 모델에 묻습니다. 엔드투엔드 테스트에서 `qwen3.5:4b`가 중국어, 아랍어, 한국어, 힌디어, 태국어의 스팸을 잡고 ham을 통과시키는지 확인합니다. [언어 모델](https://spamscanner.net/ko/docs/llm/)
* **직접 받은 메일로 학습.** 직접 받은 메일로 학습한 모델에서는 한 언어당 각 종류의 메시지 수백 개면 그 언어에서 분류기가 완전한 확신을 갖게 됩니다. [학습](https://spamscanner.net/ko/docs/training/), 그리고 21개 언어를 추가하는 [선택적 데이터 세트](https://spamscanner.net/ko/docs/training/#more-languages)를 참고하십시오.
