# ภาษา

สแปมมาในทุกภาษา อีเมลทั่วไปก็เช่นกัน Spam Scanner อ่านได้ทั้งสองแบบ และระมัดระวังกับภาษาที่รู้จักน้อย: ตัวกรองสแปมที่ตีข้อความภาษาอาหรับหรือภาษาจีนทุกข้อความว่าเป็นสแปมแย่กว่าการไม่มีตัวกรองเลย


## อ่านได้ทุกระบบอักษร

* **คำ** ข้อความถูกแบ่งด้วย `Intl.Segmenter` ซึ่งใช้กฎขอบเขตคำของ Unicode และใช้พจนานุกรมสำหรับภาษาจีน ญี่ปุ่น ไทย ลาว เขมร และพม่า ซึ่งเป็นระบบอักษรที่เขียนโดยไม่เว้นวรรค ข้อความยาวจะถูกแบ่งเป็นชิ้นก่อน เพราะตัวตัดคำใน Node.js 18 ทำงานช้าลงกับสตริงที่ยาวมาก
* **การปรับให้เป็นมาตรฐาน** Unicode NFKC แปลงตัวอักษรเต็มความกว้างและตัวอักษรตกแต่งส่วนใหญ่ (𝐅𝐑𝐄𝐄, Ⓕⓡⓔⓔ) เป็นตัวอักษรธรรมดา ข้อความถูกแปลงเป็นตัวพิมพ์เล็กตามกฎของ Unicode
* **การอำพราง** อักขระที่มองไม่เห็นภายในคำ (`free` ที่มีช่องว่างความกว้างศูนย์อยู่ระหว่างตัวอักษรสองตัว, soft hyphen) ถูกลบออกและนับไว้ คำที่ใช้ตัวอักษรหลายระบบปนกัน เช่น `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. **ความมั่นใจเป็นไปตามความครอบคลุม** ผลลัพธ์ถูกดึงเข้าหา "ไม่แน่ใจ" ตามสัดส่วนของจำนวนข้อความแต่ละประเภทที่ตัวจำแนกเคยเห็นในภาษานั้น: ความมั่นใจเต็มที่ต้องมีอย่างละ 1,000 ข้อความ (หรือ 2% ของประเภทที่เล็กกว่า สำหรับโมเดลส่วนตัวขนาดเล็ก) ภาษาที่ไม่มี ham ในข้อมูลฝึกเลยจะได้ "ไม่แน่ใจ" เสมอ

โมเดลที่มาพร้อมแพ็กเกจไม่เคยเห็น [SMS Spam Multilingual Collection](https://huggingface.co/datasets/dbarbedillo/SMS_Spam_Multilingual_Collection_Dataset) ซึ่งเป็นข้อความ SMS ที่แปลด้วยเครื่องเป็น 21 ภาษา ก่อนมีกฎเหล่านี้ โมเดลตี ham ในชุดนั้นว่าเป็นสแปม 5.7% รวมถึง 55% ของภาษาโปรตุเกสและ 41% ของภาษาฝรั่งเศส เมื่อมีกฎเหล่านี้ เหลือ 0.18%: ไม่มีเลยในภาษาจีน อาหรับ เกาหลี ญี่ปุ่น ฮินดี โปรตุเกส ฝรั่งเศส หรืออีก 20 ภาษา และ 0.27% ในภาษาอังกฤษ


## จับสแปมในภาษาเหล่านั้น

"ไม่แน่ใจ" นั้นปลอดภัย แต่จับสแปมไม่ได้ สามสิ่งต่อไปนี้จับได้:

* **การตรวจอื่น** ไม่ขึ้นกับภาษา: โดเมนเลียนแบบ ลิงก์หลอกลวง ไฟล์โปรแกรม มาโคร การยืนยันตัวตน blocklist และกฎ
* **โมเดลภาษา** โมเดลแบบเปิดรุ่นใหม่อ่านได้ 100 ถึง 200 ภาษา และ Spam Scanner จะถามโมเดลทุกครั้งที่ตัวจำแนกไม่แน่ใจ การทดสอบแบบ end-to-end ตรวจว่า `qwen3.5:4b` จับสแปมและปล่อย ham ผ่านในภาษาจีน อาหรับ เกาหลี ฮินดี และไทยได้ [โมเดลภาษา](https://spamscanner.net/th/docs/llm/)
* **การฝึกด้วยอีเมลของคุณ** ในโมเดลที่ฝึกจากอีเมลของคุณเอง ข้อความแต่ละประเภทไม่กี่ร้อยข้อความในภาษาหนึ่งทำให้ตัวจำแนกมั่นใจเต็มที่ในภาษานั้น [การฝึกโมเดล](https://spamscanner.net/th/docs/training/) และ[ชุดข้อมูลเสริม](https://spamscanner.net/th/docs/training/#more-languages)ที่เพิ่ม 21 ภาษา
