งานของมันนั้นง่าย: มันบอกคุณว่าภาษาใดที่ให้ข้อมูลข้อความที่เขียนไว้ซึ่งมีประโยชน์มากเป็นขั้นตอนการประมวลผลล่วงหน้าสำหรับข้อมูลภาษาศาสตร์ในแอปพลิเคชันการประมวลผลภาษาธรรมชาติเช่นการจำแนกข้อความและการตรวจสอบการสะกด ตัวอย่างเช่นกรณีการใช้งานอื่น ๆ อาจรวมถึงการกำหนดเส้นทางอีเมลไปยังแผนกบริการลูกค้าที่ตั้งอยู่ทางภูมิศาสตร์ตามภาษาของอีเมล
การตรวจจับภาษามักจะทำเป็นส่วนหนึ่งของกรอบการเรียนรู้ของเครื่องจักรขนาดใหญ่หรือแอพพลิเคชั่นการประมวลผลภาษาธรรมชาติ ในกรณีที่คุณไม่ต้องการฟังก์ชั่นที่เต็มเปี่ยมของระบบเหล่านั้นหรือไม่ต้องการเรียนรู้เชือกของเหล่านั้นห้องสมุดขนาดเล็กที่มีความยืดหยุ่นมีประโยชน์
จนถึงตอนนี้ไลบรารีโอเพนซอร์สที่ครอบคลุมอีกสามแห่งที่ทำงานกับ JVM สำหรับงานนี้คือ Apache Tika, Apache OpenNLP และเพิ่มประสิทธิภาพการตรวจจับภาษา น่าเสียดายโดยเฉพาะอย่างยิ่งหลังมีข้อเสียสามประการที่สำคัญ:
Lingua ตั้งเป้าหมายที่จะกำจัดปัญหาเหล่านี้ เกือบจะไม่จำเป็นต้องมีการกำหนดค่าใด ๆ และให้ผลลัพธ์ที่แม่นยำทั้งข้อความยาวและสั้นแม้ในคำเดียวและวลี มันใช้วิธีการทั้งตามกฎและทางสถิติ แต่ไม่ได้ใช้พจนานุกรมคำใด ๆ ไม่จำเป็นต้องเชื่อมต่อกับ API หรือบริการภายนอกใด ๆ เมื่อดาวน์โหลดห้องสมุดแล้วจะสามารถใช้ออฟไลน์ได้อย่างสมบูรณ์
เมื่อเปรียบเทียบกับห้องสมุดการตรวจจับภาษาอื่น ๆ การมุ่งเน้น ของ Lingua นั้นมี คุณภาพมากกว่าปริมาณ นั่นคือการตรวจจับที่ถูกต้องสำหรับชุดภาษาขนาดเล็กก่อนที่จะเพิ่มภาษาใหม่ ปัจจุบันมีการรองรับ 75 ภาษาต่อไปนี้:
LINGUA สามารถรายงานสถิติความถูกต้องสำหรับข้อมูลการทดสอบแบบรวมบางอย่างสำหรับแต่ละภาษาที่รองรับ ข้อมูลการทดสอบสำหรับแต่ละภาษาแบ่งออกเป็นสามส่วน:
ทั้งแบบจำลองภาษาและข้อมูลการทดสอบถูกสร้างขึ้นจากเอกสารแยกต่างหากของ Wortschatz Corpora ที่นำเสนอโดย Leipzig University ประเทศเยอรมนี ข้อมูลที่รวบรวมข้อมูลจากเว็บไซต์ข่าวต่าง ๆ ถูกใช้สำหรับการฝึกอบรมแต่ละคลังข้อมูลประกอบด้วยหนึ่งล้านประโยค สำหรับการทดสอบมีการใช้งาน Corpora ที่ทำจากเว็บไซต์ที่เลือกโดยพลการแต่ละแห่งประกอบด้วยประโยคหนึ่งหมื่นประโยค จากแต่ละคลังการทดสอบชุดย่อยที่ไม่ได้เรียงลำดับแบบสุ่มของ 1,000 คำเดียว 1,000 คำคู่และ 1,000 ประโยคได้รับการสกัดตามลำดับ
จากข้อมูลการทดสอบที่สร้างขึ้นฉันได้เปรียบเทียบผลการตรวจจับของ LINGUA , Apache Tika , Apache OpenNLP และ เพิ่มประสิทธิภาพเครื่องตรวจจับภาษา โดยใช้การทดสอบ JUNIT แบบพารามิเตอร์ที่ทำงานผ่านข้อมูลของ 75 ภาษาที่รองรับ ของ LINGUA ภาษาที่ไม่ได้รับการสนับสนุนจากไลบรารีอื่น ๆ นั้นถูกละเว้นสำหรับผู้ใช้ในระหว่างกระบวนการตรวจจับ
แต่ละส่วนต่อไปนี้มีสองแปลง พล็อตบาร์แสดงผลลัพธ์ความแม่นยำโดยละเอียดสำหรับแต่ละภาษาที่รองรับ พล็อตกล่องแสดงการแจกแจงของค่าความแม่นยำสำหรับตัวจําแนกแต่ละตัว กล่องเองเป็นตัวแทนของพื้นที่ที่อยู่ตรงกลาง 50 % ของข้อมูลอยู่ภายใน ภายในกล่องสีเส้นแนวนอนจะทำเครื่องหมายค่ามัธยฐานของการแจกแจง
ตารางด้านล่างแสดงสถิติโดยละเอียดสำหรับแต่ละภาษาและตัวจําแนกรวมถึงค่าเฉลี่ยค่าเฉลี่ยและค่าเบี่ยงเบนมาตรฐาน
| ภาษา | เฉลี่ย | คำเดียว | คู่คำ | ประโยค | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ลิ้น (โหมดความแม่นยำสูง) | ลิ้น (โหมดความแม่นยำต่ำ) | Tika | Opennlp | ปรับให้เหมาะสม | ลิ้น (โหมดความแม่นยำสูง) | ลิ้น (โหมดความแม่นยำต่ำ) | Tika | Opennlp | ปรับให้เหมาะสม | ลิ้น (โหมดความแม่นยำสูง) | ลิ้น (โหมดความแม่นยำต่ำ) | Tika | Opennlp | ปรับให้เหมาะสม | ลิ้น (โหมดความแม่นยำสูง) | ลิ้น (โหมดความแม่นยำต่ำ) | Tika | Opennlp | ปรับให้เหมาะสม | |
| ชาวแอฟริกัน | 79 | 64 | 71 | 72 | 39 | 58 | 38 | 44 | 41 | 3 | 81 | 62 | 70 | 75 | 22 | 97 | 93 | 98 | 99 | 93 |
| ชาวแอลเบเนีย | 88 | 80 | 79 | 71 | 70 | 69 | 54 | 54 | 40 | 38 | 95 | 86 | 84 | 73 | 73 | 100 | 99 | 99 | 100 | 98 |
| ภาษาอาหรับ | 98 | 94 | 97 | 84 | 89 | 96 | 88 | 94 | 65 | 72 | 99 | 96 | 99 | 88 | 94 | 100 | 99 | 100 | 99 | 100 |
| เกี่ยวกับอาร์เมเนีย | 100 | 100 | - | 100 | - | 100 | 100 | - | 100 | - | 100 | 100 | - | 100 | - | 100 | 100 | - | 100 | - |
| อาเซอร์ไบจัน | 90 | 82 | - | 82 | - | 77 | 71 | - | 60 | - | 92 | 78 | - | 86 | - | 99 | 96 | - | 99 | - |
| เกี่ยวกับบาสก์ | 84 | 74 | 83 | 77 | 66 | 71 | 56 | 64 | 56 | 33 | 87 | 76 | 86 | 82 | 70 | 93 | 91 | 98 | 92 | 95 |
| ชาวเบลารุส | 97 | 92 | 96 | 91 | 87 | 92 | 80 | 92 | 78 | 69 | 99 | 95 | 98 | 95 | 92 | 100 | 100 | 100 | 100 | 99 |
| เบงกอล | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| บอคมาล | 58 | 49 | - | 66 | - | 39 | 27 | - | 42 | - | 59 | 47 | - | 69 | - | 75 | 74 | - | 87 | - |
| ชาวบอสเนีย | 35 | 29 | - | 26 | - | 29 | 23 | - | 12 | - | 35 | 29 | - | 22 | - | 40 | 36 | - | 44 | - |
| ชาวบัลแกเรีย | 87 | 78 | 73 | 83 | 48 | 70 | 56 | 52 | 62 | 18 | 91 | 81 | 69 | 87 | 36 | 99 | 96 | 96 | 100 | 91 |
| คาตาลัน | 70 | 58 | 58 | 42 | 31 | 51 | 33 | 32 | 11 | 2 | 74 | 60 | 57 | 32 | 16 | 86 | 81 | 84 | 81 | 77 |
| ชาวจีน | 100 | 100 | 69 | 78 | 31 | 100 | 100 | 20 | 40 | 0 | 100 | 100 | 86 | 94 | 2 | 100 | 100 | 100 | 100 | 91 |
| เกี่ยวกับภาษาโครเอเชีย | 72 | 60 | 74 | 50 | 41 | 53 | 36 | 54 | 23 | 8 | 74 | 57 | 72 | 44 | 24 | 90 | 85 | 97 | 81 | 91 |
| ภาษาเช็ก | 80 | 71 | 72 | 67 | 49 | 66 | 54 | 54 | 42 | 21 | 84 | 72 | 75 | 70 | 46 | 91 | 87 | 88 | 90 | 81 |
| เกี่ยวกับเดนมาร์ก | 81 | 70 | 83 | 60 | 55 | 61 | 45 | 63 | 34 | 19 | 84 | 70 | 86 | 52 | 51 | 98 | 95 | 99 | 94 | 96 |
| ชาวดัตช์ | 77 | 64 | 60 | 61 | 39 | 55 | 36 | 31 | 31 | 6 | 81 | 61 | 52 | 57 | 19 | 96 | 94 | 98 | 97 | 91 |
| ภาษาอังกฤษ | 81 | 62 | 64 | 52 | 41 | 55 | 29 | 30 | 10 | 2 | 89 | 62 | 62 | 46 | 23 | 99 | 96 | 99 | 99 | 97 |
| ชาวเอสเปอร์รันโต | 84 | 66 | - | 76 | - | 67 | 44 | - | 50 | - | 85 | 61 | - | 78 | - | 98 | 92 | - | 100 | - |
| เอสโตเนีย | 92 | 83 | 84 | 59 | 61 | 80 | 62 | 66 | 29 | 23 | 96 | 88 | 88 | 60 | 63 | 100 | 99 | 100 | 88 | 98 |
| ภาษาฟินแลนด์ | 96 | 91 | 94 | 86 | 79 | 90 | 77 | 86 | 68 | 51 | 98 | 95 | 96 | 91 | 86 | 100 | 100 | 100 | 100 | 100 |
| ภาษาฝรั่งเศส | 89 | 77 | 78 | 59 | 54 | 74 | 52 | 55 | 25 | 18 | 94 | 83 | 80 | 55 | 48 | 99 | 97 | 99 | 98 | 97 |
| กานดา | 91 | 84 | - | - | - | 79 | 65 | - | - | - | 95 | 87 | - | - | - | 100 | 100 | - | - | - |
| ชาวจอร์เจีย | 100 | 100 | - | 100 | - | 100 | 100 | - | 100 | - | 100 | 100 | - | 100 | - | 100 | 100 | - | 100 | - |
| ชาวเยอรมัน | 89 | 80 | 74 | 67 | 55 | 74 | 57 | 50 | 38 | 21 | 94 | 84 | 71 | 66 | 46 | 100 | 99 | 100 | 98 | 99 |
| กรีก | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| รัฐคุชราต | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| ภาษาฮีบรู | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| ภาษาฮินดี | 73 | 33 | 80 | 58 | 51 | 61 | 11 | 65 | 28 | 16 | 64 | 20 | 75 | 49 | 38 | 93 | 67 | 99 | 99 | 98 |
| ชาวฮังการี | 95 | 90 | 88 | 78 | 77 | 87 | 77 | 75 | 53 | 51 | 98 | 94 | 91 | 82 | 82 | 100 | 100 | 100 | 100 | 99 |
| เกี่ยวกับไอซ์แลนด์ | 93 | 88 | 90 | 76 | 78 | 83 | 72 | 76 | 53 | 53 | 97 | 92 | 94 | 76 | 82 | 100 | 99 | 100 | 99 | 99 |
| ชาวอินโดนีเซีย | 60 | 48 | 60 | 29 | 18 | 39 | 25 | 37 | 10 | 0 | 61 | 46 | 62 | 25 | 1 | 81 | 72 | 82 | 52 | 54 |
| เกี่ยวกับไอริช | 91 | 85 | 90 | 78 | 80 | 82 | 70 | 80 | 56 | 58 | 94 | 90 | 92 | 82 | 85 | 96 | 95 | 99 | 97 | 98 |
| อิตาลี | 87 | 71 | 80 | 64 | 51 | 69 | 42 | 58 | 31 | 12 | 92 | 74 | 84 | 61 | 43 | 100 | 98 | 99 | 100 | 98 |
| ญี่ปุ่น | 100 | 100 | 25 | 95 | 98 | 100 | 100 | 1 | 87 | 99 | 100 | 100 | 5 | 100 | 100 | 100 | 100 | 68 | 100 | 96 |
| คาซัค | 92 | 90 | - | 85 | - | 80 | 78 | - | 66 | - | 96 | 93 | - | 90 | - | 99 | 99 | - | 100 | - |
| เกาหลี | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| ภาษาละติน | 87 | 73 | - | 70 | - | 72 | 49 | - | 43 | - | 93 | 76 | - | 71 | - | 97 | 93 | - | 96 | - |
| เกี่ยวกับลัตเวีย | 93 | 87 | 90 | 86 | 78 | 85 | 75 | 78 | 72 | 56 | 97 | 90 | 93 | 88 | 82 | 99 | 97 | 98 | 98 | 97 |
| เกี่ยวกับลิทัวเนีย | 95 | 87 | 89 | 79 | 72 | 86 | 76 | 74 | 56 | 40 | 98 | 89 | 92 | 83 | 77 | 100 | 98 | 99 | 99 | 98 |
| ชาวมาซิโดเนีย | 84 | 72 | 83 | 68 | 46 | 66 | 52 | 66 | 37 | 10 | 86 | 70 | 83 | 68 | 32 | 99 | 95 | 100 | 98 | 97 |
| มลายู | 31 | 31 | 23 | 19 | 4 | 26 | 22 | 19 | 10 | 0 | 38 | 36 | 22 | 20 | 0 | 30 | 36 | 28 | 27 | 11 |
| ชาวเมารี | 92 | 83 | - | 92 | - | 84 | 64 | - | 85 | - | 92 | 88 | - | 90 | - | 99 | 98 | - | 100 | - |
| มาราธี | 85 | 41 | 90 | 81 | 71 | 74 | 20 | 81 | 62 | 43 | 85 | 30 | 92 | 83 | 74 | 96 | 72 | 98 | 98 | 96 |
| ชาวมองโกเลีย | 97 | 96 | - | 84 | - | 93 | 89 | - | 66 | - | 99 | 98 | - | 88 | - | 99 | 99 | - | 99 | - |
| Nynorsk | 66 | 52 | - | 55 | - | 41 | 25 | - | 24 | - | 66 | 49 | - | 47 | - | 90 | 81 | - | 92 | - |
| ชาวเปอร์เซีย | 90 | 80 | 81 | 75 | 62 | 78 | 62 | 65 | 53 | 29 | 94 | 80 | 79 | 74 | 58 | 100 | 98 | 99 | 99 | 99 |
| ขัด | 95 | 90 | 90 | 83 | 81 | 85 | 77 | 76 | 61 | 57 | 98 | 93 | 93 | 89 | 86 | 100 | 99 | 100 | 100 | 100 |
| ชาวโปรตุเกส | 81 | 69 | 63 | 58 | 40 | 59 | 42 | 34 | 22 | 7 | 85 | 70 | 58 | 54 | 19 | 98 | 95 | 98 | 98 | 94 |
| ปัญจาบ | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| เกี่ยวกับโรมาเนีย | 87 | 72 | 78 | 67 | 55 | 69 | 49 | 57 | 34 | 24 | 92 | 74 | 80 | 68 | 50 | 99 | 94 | 97 | 99 | 91 |
| ชาวรัสเซีย | 90 | 78 | 80 | 50 | 53 | 76 | 59 | 62 | 20 | 22 | 95 | 84 | 85 | 43 | 50 | 98 | 92 | 94 | 86 | 87 |
| ประเทศเซอร์เบีย | 88 | 78 | 73 | 73 | 46 | 74 | 62 | 57 | 46 | 18 | 90 | 80 | 70 | 74 | 39 | 99 | 91 | 90 | 98 | 80 |
| โชนา | 91 | 81 | - | - | - | 78 | 56 | - | - | - | 96 | 86 | - | - | - | 100 | 100 | - | - | - |
| ชาวสโลวะเกีย | 84 | 75 | 76 | 70 | 47 | 64 | 49 | 53 | 39 | 12 | 90 | 78 | 76 | 73 | 38 | 99 | 97 | 98 | 99 | 92 |
| สโลเวเนียน | 82 | 67 | 74 | 71 | 37 | 61 | 39 | 53 | 43 | 3 | 87 | 68 | 72 | 72 | 18 | 99 | 93 | 98 | 99 | 90 |
| โซมาเลีย | 92 | 85 | 91 | 69 | 79 | 82 | 64 | 78 | 35 | 50 | 96 | 90 | 94 | 74 | 88 | 100 | 100 | 100 | 98 | 100 |
| sotho | 85 | 72 | - | - | - | 67 | 43 | - | - | - | 90 | 75 | - | - | - | 99 | 97 | - | - | - |
| เกี่ยวกับภาษาสเปน | 70 | 56 | 59 | 42 | 32 | 44 | 26 | 29 | 8 | 0 | 69 | 49 | 50 | 25 | 6 | 97 | 94 | 97 | 93 | 91 |
| ภาษาสวาฮิลี | 81 | 70 | 75 | 73 | 60 | 60 | 43 | 50 | 45 | 26 | 84 | 68 | 75 | 74 | 58 | 98 | 97 | 99 | 99 | 98 |
| ภาษาสวีเดน | 84 | 72 | 71 | 69 | 50 | 64 | 46 | 44 | 41 | 15 | 88 | 76 | 72 | 69 | 42 | 99 | 95 | 97 | 97 | 94 |
| ภาษาตากาล็อก | 78 | 66 | 77 | 61 | 61 | 52 | 36 | 53 | 27 | 23 | 83 | 67 | 79 | 57 | 62 | 99 | 96 | 99 | 98 | 97 |
| ทมิฬ | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| เตลูกู | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| แบบไทย | 99 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 98 | 100 | 99 | 100 |
| ซองกา | 84 | 72 | - | - | - | 66 | 46 | - | - | - | 89 | 73 | - | - | - | 98 | 97 | - | - | - |
| TSWANA | 84 | 71 | - | - | - | 65 | 44 | - | - | - | 88 | 73 | - | - | - | 99 | 96 | - | - | - |
| ตุรกี | 94 | 87 | 81 | 72 | 70 | 84 | 71 | 62 | 48 | 43 | 98 | 91 | 83 | 71 | 70 | 100 | 99 | 99 | 98 | 96 |
| ชาวยูเครน | 92 | 86 | 81 | 79 | 68 | 84 | 75 | 62 | 54 | 39 | 97 | 92 | 84 | 83 | 69 | 95 | 93 | 97 | 99 | 94 |
| ภาษาอูรดู | 91 | 80 | 83 | 68 | 72 | 80 | 65 | 68 | 45 | 49 | 94 | 78 | 84 | 62 | 71 | 98 | 96 | 96 | 98 | 96 |
| เวียดนาม | 91 | 87 | 85 | 84 | 87 | 79 | 76 | 63 | 66 | 65 | 94 | 87 | 92 | 86 | 95 | 99 | 98 | 100 | 100 | 100 |
| ชาวเวลส์ | 91 | 82 | 85 | 77 | 77 | 78 | 61 | 68 | 50 | 50 | 96 | 87 | 88 | 81 | 82 | 99 | 99 | 100 | 99 | 99 |
| โซซา | 82 | 69 | - | - | - | 64 | 45 | - | - | - | 85 | 67 | - | - | - | 98 | 94 | - | - | - |
| โยรูบา | 75 | 62 | - | - | - | 50 | 33 | - | - | - | 77 | 61 | - | - | - | 97 | 93 | - | - | - |
| ซูลู | 81 | 70 | - | 78 | - | 62 | 45 | - | 51 | - | 83 | 72 | - | 82 | - | 97 | 94 | - | 100 | - |
| หมายถึง | 86 | 77 | 80 | 74 | 65 | 74 | 61 | 64 | 53 | 41 | 89 | 78 | 81 | 74 | 61 | 96 | 93 | 96 | 95 | 93 |
| ค่ามัธยฐาน | 89.23 | 79.63 | 81.3 | 75.55 | 63.85 | 74.3 | 56.7 | 63.39 | 48.7 | 30.75 | 93.7 | 80.6 | 84.25 | 75.55 | 65.95 | 99.0 | 96.9 | 99.15 | 99.0 | 97.4 |
| ค่าเบี่ยงเบนมาตรฐาน | 13.12 | 17.26 | 16.2 | 18.56 | 23.87 | 18.43 | 24.81 | 23.9 | 27.37 | 33.87 | 13.13 | 18.96 | 18.74 | 21.32 | 31.32 | 11.02 | 11.86 | 10.77 | 12.59 | 13.54 |
เครื่องตรวจจับภาษาทุกตัวใช้โมเดล N-Gram ที่น่าจะเป็นที่ผ่านการฝึกอบรมเกี่ยวกับการกระจายตัวละครในคลังการฝึกอบรมบางอย่าง ห้องสมุดส่วนใหญ่ใช้ N-GRAMs ขนาด 3 (trigrams) ซึ่งเป็นที่น่าพอใจสำหรับการตรวจจับภาษาของชิ้นส่วนข้อความที่ยาวขึ้นซึ่งประกอบด้วยหลายประโยค อย่างไรก็ตามสำหรับวลีสั้น ๆ หรือคำเดียว trigrams ไม่เพียงพอ ยิ่งข้อความอินพุตสั้นลงเท่าใดก็ยิ่งมี N-GRAM น้อยลง ความน่าจะเป็นที่ประเมินจาก N-grams ไม่กี่ตัวนั้นไม่น่าเชื่อถือ นี่คือเหตุผลที่ Lingua ใช้ประโยชน์จาก N-Grams ขนาด 1 ถึง 5 ซึ่งส่งผลให้การทำนายภาษาที่ถูกต้องแม่นยำยิ่งขึ้น
ความแตกต่างที่สำคัญอันดับสองคือ LINGUA ไม่เพียง แต่ใช้โมเดลทางสถิติดังกล่าวเท่านั้น แต่ยังรวมถึงเอ็นจิ้นตามกฎด้วย เครื่องยนต์นี้จะกำหนดตัวอักษรของข้อความอินพุตและค้นหาอักขระที่ไม่ซ้ำกันในหนึ่งภาษาหรือมากกว่า หากภาษาเดียวสามารถเลือกได้อย่างน่าเชื่อถือด้วยวิธีนี้แบบจำลองทางสถิติไม่จำเป็นอีกต่อไป ไม่ว่าในกรณีใดเครื่องยนต์ตามกฎจะกรองภาษาที่ไม่เป็นไปตามเงื่อนไขของข้อความอินพุต จากนั้นในขั้นตอนที่สองโมเดล N-GRAM ความน่าจะเป็นจะถูกนำมาพิจารณา สิ่งนี้สมเหตุสมผลเพราะการโหลดแบบจำลองภาษาน้อยลงหมายถึงการใช้หน่วยความจำน้อยลงและประสิทธิภาพการทำงานของรันไทม์ที่ดีขึ้น
โดยทั่วไปแล้วมันเป็นความคิดที่ดีที่จะ จำกัด ชุดภาษาที่จะพิจารณาในกระบวนการจำแนกประเภทโดยใช้วิธี API ที่เกี่ยวข้อง หากคุณรู้ล่วงหน้าว่าบางภาษาจะไม่เกิดขึ้นในข้อความอินพุตอย่าปล่อยให้ภาษาเหล่านั้นมีส่วนร่วมในกระบวนการแยกประเภท กลไกการกรองของเอ็นจิ้นตามกฎนั้นค่อนข้างดีอย่างไรก็ตามการกรองตามความรู้ของคุณเกี่ยวกับข้อความอินพุตนั้นดีกว่าเสมอ
หากคุณต้องการทำซ้ำผลลัพธ์ที่ถูกต้องด้านบนคุณสามารถสร้างรายงานการทดสอบด้วยตัวเราเองทั้งสี่ตัวและทุกภาษาโดยการทำ:
./gradlew accuracyReport
นอกจากนี้คุณยังสามารถ จำกัด ตัวแยกประเภทและภาษาเพื่อสร้างรายงานโดยผ่านอาร์กิวเมนต์ไปยังงาน Gradle งานต่อไปนี้สร้างรายงานสำหรับ LINGUA และภาษาอังกฤษและภาษาเยอรมันเท่านั้น:
./gradlew accuracyReport -Pdetectors=Lingua -Planguages=English,German
โดยค่าเริ่มต้นจะใช้ CPU Core เพียงตัวเดียวสำหรับการสร้างรายงาน หากคุณมีซีพียูหลายคอร์ในเครื่องของคุณคุณสามารถแยกกระบวนการได้มากเท่าที่คุณมีคอร์ CPU สิ่งนี้จะเพิ่มความเร็วในการสร้างรายงานอย่างมีนัยสำคัญ อย่างไรก็ตามโปรดทราบว่าการฟอร์กมากกว่าหนึ่งกระบวนการสามารถใช้ RAM จำนวนมากได้ คุณทำแบบนี้:
./gradlew accuracyReport -PcpuCores=2
สำหรับเครื่องตรวจจับและภาษาแต่ละรายการไฟล์รายงานการทดสอบจะถูกเขียนลงใน /accuracy-reports เพื่อพบถัดจากไดเรกทอรี src ตัวอย่างเช่นนี่คือผลลัพธ์ปัจจุบันของรายงานภาษาเยอรมัน Lingua :
##### GERMAN #####
Legend: 'low accuracy mode | high accuracy mode'
>>> Accuracy on average: 79.80% | 89.23%
>> Detection of 1000 single words (average length: 9 chars)
Accuracy: 56.70% | 73.90%
Erroneously classified as DUTCH: 2.80% | 2.30%, DANISH: 2.20% | 2.10%, ENGLISH: 1.90% | 2.00%, LATIN: 1.90% | 1.90%, BOKMAL: 2.40% | 1.60%, BASQUE: 1.60% | 1.20%, ITALIAN: 1.00% | 1.20%, FRENCH: 1.60% | 1.20%, ESPERANTO: 1.10% | 1.10%, SWEDISH: 3.20% | 1.00%, AFRIKAANS: 1.30% | 0.80%, TSONGA: 1.50% | 0.70%, NYNORSK: 1.40% | 0.60%, PORTUGUESE: 0.50% | 0.60%, YORUBA: 0.40% | 0.60%, SOTHO: 0.70% | 0.50%, FINNISH: 0.80% | 0.50%, WELSH: 1.30% | 0.50%, SPANISH: 1.20% | 0.40%, SWAHILI: 0.60% | 0.40%, TSWANA: 2.20% | 0.40%, POLISH: 0.70% | 0.40%, ESTONIAN: 0.90% | 0.40%, IRISH: 0.50% | 0.40%, TAGALOG: 0.10% | 0.30%, ICELANDIC: 0.30% | 0.30%, BOSNIAN: 0.10% | 0.30%, LITHUANIAN: 0.80% | 0.20%, MAORI: 0.50% | 0.20%, INDONESIAN: 0.40% | 0.20%, ALBANIAN: 0.60% | 0.20%, CATALAN: 0.70% | 0.20%, ZULU: 0.30% | 0.20%, ROMANIAN: 1.20% | 0.20%, CROATIAN: 0.10% | 0.20%, XHOSA: 0.40% | 0.20%, TURKISH: 0.70% | 0.10%, MALAY: 0.50% | 0.10%, LATVIAN: 0.40% | 0.10%, SLOVENE: 0.00% | 0.10%, SLOVAK: 0.30% | 0.10%, SOMALI: 0.00% | 0.10%, HUNGARIAN: 0.40% | 0.00%, SHONA: 0.80% | 0.00%, VIETNAMESE: 0.40% | 0.00%, CZECH: 0.30% | 0.00%, GANDA: 0.20% | 0.00%, AZERBAIJANI: 0.10% | 0.00%
>> Detection of 1000 word pairs (average length: 18 chars)
Accuracy: 83.50% | 94.10%
Erroneously classified as DUTCH: 1.50% | 0.90%, LATIN: 1.00% | 0.80%, ENGLISH: 1.40% | 0.70%, SWEDISH: 1.40% | 0.60%, DANISH: 1.20% | 0.50%, FRENCH: 0.60% | 0.40%, BOKMAL: 1.40% | 0.30%, TAGALOG: 0.10% | 0.20%, IRISH: 0.20% | 0.20%, TURKISH: 0.10% | 0.10%, NYNORSK: 0.90% | 0.10%, TSONGA: 0.40% | 0.10%, ZULU: 0.10% | 0.10%, ESPERANTO: 0.30% | 0.10%, AFRIKAANS: 0.60% | 0.10%, ITALIAN: 0.10% | 0.10%, ESTONIAN: 0.30% | 0.10%, FINNISH: 0.40% | 0.10%, SOMALI: 0.00% | 0.10%, SWAHILI: 0.20% | 0.10%, MAORI: 0.00% | 0.10%, WELSH: 0.10% | 0.10%, LITHUANIAN: 0.40% | 0.00%, INDONESIAN: 0.10% | 0.00%, CATALAN: 0.30% | 0.00%, LATVIAN: 0.20% | 0.00%, XHOSA: 0.30% | 0.00%, SPANISH: 0.50% | 0.00%, MALAY: 0.10% | 0.00%, SLOVAK: 0.10% | 0.00%, BASQUE: 0.40% | 0.00%, YORUBA: 0.20% | 0.00%, TSWANA: 0.30% | 0.00%, SHONA: 0.10% | 0.00%, PORTUGUESE: 0.10% | 0.00%, SOTHO: 0.30% | 0.00%, CZECH: 0.10% | 0.00%, ALBANIAN: 0.40% | 0.00%, AZERBAIJANI: 0.10% | 0.00%, ICELANDIC: 0.10% | 0.00%, SLOVENE: 0.10% | 0.00%
>> Detection of 1000 sentences (average length: 111 chars)
Accuracy: 99.20% | 99.70%
Erroneously classified as DUTCH: 0.00% | 0.20%, LATIN: 0.20% | 0.10%, NYNORSK: 0.10% | 0.00%, SPANISH: 0.10% | 0.00%, DANISH: 0.10% | 0.00%, SOTHO: 0.20% | 0.00%, ZULU: 0.10% | 0.00%
Lingua เป็นเจ้าภาพในแพ็คเกจ GitHub และ Maven Central
// Groovy syntax
implementation 'com.github.pemistahl:lingua:1.2.2'
// Kotlin syntax
implementation("com.github.pemistahl:lingua:1.2.2")
<dependency>
<groupId>com.github.pemistahl</groupId>
<artifactId>lingua</artifactId>
<version>1.2.2</version>
</dependency>
Lingua ใช้ Gradle เพื่อสร้างและต้องการ Java> = 1.8 สำหรับสิ่งนั้น
git clone https://github.com/pemistahl/lingua.git
cd lingua
./gradlew build
หอจดหมายเหตุโถหลายแห่งสามารถสร้างได้จากโครงการ
./gradlew jar ประกอบ lingua-1.2.2.jar ที่มีแหล่งข้อมูลที่รวบรวมเท่านั้น./gradlew sourcesJar ประกอบ lingua-1.2.2-sources.jar ที่มีซอร์สโค้ดธรรมดา./gradlew jarWithDependencies ประกอบ lingua-1.2.2-with-dependencies.jar ที่มีแหล่งข้อมูลที่รวบรวมและการพึ่งพาภายนอกทั้งหมดที่จำเป็นในการรันไทม์ ไฟล์ JAR นี้สามารถรวมอยู่ในโครงการที่ไม่มีระบบการจัดการการพึ่งพา นอกจากนี้ยังสามารถใช้เพื่อเรียกใช้ Lingua ในโหมดสแตนด์อโลน (ดูด้านล่าง) LINGUA สามารถใช้งานได้ในรหัสของคุณเองหรือในโหมดสแตนด์อโลน
API นั้นค่อนข้างตรงไปตรงมาและสามารถใช้ได้ทั้งในรหัส Kotlin และ Java
/* Kotlin */
import com.github.pemistahl.lingua.api.*
import com.github.pemistahl.lingua.api.Language.*
val detector : LanguageDetector = LanguageDetectorBuilder .fromLanguages( ENGLISH , FRENCH , GERMAN , SPANISH ).build()
val detectedLanguage : Language = detector.detectLanguageOf(text = " languages are awesome " ) API สาธารณะของ Lingua ไม่เคยส่งคืน null ที่ไหนสักแห่งดังนั้นจึงปลอดภัยที่จะใช้จากภายในรหัส Java เช่นกัน
/* Java */
import com . github . pemistahl . lingua . api .*;
import static com . github . pemistahl . lingua . api . Language .*;
final LanguageDetector detector = LanguageDetectorBuilder . fromLanguages ( ENGLISH , FRENCH , GERMAN , SPANISH ). build ();
final Language detectedLanguage = detector . detectLanguageOf ( "languages are awesome" );โดยค่าเริ่มต้น Lingua จะส่งคืนภาษาที่เป็นไปได้มากที่สุดสำหรับข้อความอินพุตที่กำหนด อย่างไรก็ตามมีคำบางคำที่สะกดเหมือนกันในมากกว่าหนึ่งภาษา ยกตัวอย่างเช่นคำ ว่าคำว่า เป็นทั้งคำภาษาอังกฤษและภาษาฝรั่งเศสที่ถูกต้อง Lingua จะส่งออกภาษาอังกฤษหรือภาษาฝรั่งเศสซึ่งอาจผิดในบริบทที่กำหนด สำหรับกรณีเช่นนั้นมันเป็นไปได้ที่จะระบุระยะทางสัมพัทธ์ขั้นต่ำที่ความน่าจะเป็นลอการิทึมและสรุปความน่าจะเป็นสำหรับแต่ละภาษาที่เป็นไปได้จะต้องตอบสนอง สามารถระบุได้ด้วยวิธีต่อไปนี้:
val detector = LanguageDetectorBuilder
.fromAllLanguages()
.withMinimumRelativeDistance( 0.25 ) // minimum: 0.00 maximum: 0.99 default: 0.00
.build() โปรดทราบว่าระยะห่างระหว่างความน่าจะเป็นภาษานั้นขึ้นอยู่กับความยาวของข้อความอินพุต ยิ่งข้อความอินพุตนานเท่าไหร่ระยะห่างระหว่างภาษาก็ยิ่งใหญ่ขึ้นเท่านั้น ดังนั้นหากคุณต้องการจำแนกวลีข้อความสั้น ๆ อย่าตั้งระยะทางสัมพัทธ์ขั้นต่ำสูงเกินไป มิฉะนั้นคุณจะได้รับผลลัพธ์ส่วนใหญ่ที่ส่งคืนเป็น Language.UNKNOWN ซึ่งเป็นค่าคืนสินค้าสำหรับกรณีที่การตรวจจับภาษาไม่น่าเชื่อถือ
การรู้เกี่ยวกับภาษาที่เป็นไปได้มากที่สุดนั้นดี แต่ความน่าเชื่อถือของความน่าเชื่อถือคือการคำนวณ? และภาษาที่ตรวจสอบอื่น ๆ มีโอกาสน้อยแค่ไหนเมื่อเทียบกับภาษาที่เป็นไปได้มากที่สุด? คำถามเหล่านี้สามารถตอบได้เช่นกัน:
val detector = LanguageDetectorBuilder .fromLanguages( GERMAN , ENGLISH , FRENCH , SPANISH ).build()
val confidenceValues = detector.computeLanguageConfidenceValues(text = " Coding is fun. " )
// {
// ENGLISH=1.0,
// GERMAN=0.8665738136456169,
// FRENCH=0.8249537317466078,
// SPANISH=0.7792362923625288
// }ในตัวอย่างข้างต้นแผนที่ของภาษาที่เป็นไปได้ทั้งหมดจะถูกส่งคืนจัดเรียงตามค่าความเชื่อมั่นของพวกเขาตามลำดับจากมากไปน้อย ค่าที่เครื่องตรวจจับคำนวณเป็นส่วนหนึ่งของตัวชี้วัดความเชื่อ มั่นสัมพัทธ์ ไม่ใช่ค่าสัมบูรณ์ แต่ละค่าคือตัวเลขระหว่าง 0.0 ถึง 1.0 ภาษาที่เป็นไปได้มากที่สุดจะถูกส่งคืนด้วยค่า 1.0 เสมอ ภาษาอื่น ๆ ทั้งหมดได้รับค่าที่ได้รับมอบหมายซึ่งต่ำกว่า 1.0 ซึ่งแสดงว่าภาษาเหล่านั้นมีโอกาสน้อยกว่าเมื่อเปรียบเทียบกับภาษาที่เป็นไปได้มากที่สุด
แผนที่ที่ส่งคืนโดยวิธีนี้ไม่จำเป็นต้องมีทุกภาษาที่อินสแตนซ์การโทรของ LanguageDetector ถูกสร้างขึ้นจาก หากเครื่องยนต์ตามกฎตัดสินใจว่าภาษาเฉพาะนั้นเป็นไปไม่ได้อย่างแท้จริงมันจะไม่เป็นส่วนหนึ่งของแผนที่ที่ส่งคืน ในทำนองเดียวกันหากไม่พบความน่าจะเป็นของ NGRAM ภายในภาษาของเครื่องตรวจจับสำหรับข้อความอินพุตที่กำหนดแผนที่ที่ส่งคืนจะว่างเปล่า ค่าความเชื่อมั่นสำหรับแต่ละภาษาที่ไม่ได้เป็นส่วนหนึ่งของแผนที่ที่ส่งคืนจะถือว่าเป็น 0.0
โดยค่าเริ่มต้น LINGUA ใช้การโหลดขี้เกียจเพื่อโหลดเฉพาะรุ่นภาษาเหล่านั้นตามความต้องการซึ่งถือว่าเกี่ยวข้องกับเอ็นจิ้นตัวกรองตามกฎ ตัวอย่างเช่นบริการเว็บมันค่อนข้างเป็นประโยชน์ในการโหลดโมเดลภาษาทั้งหมดลงในหน่วยความจำเพื่อหลีกเลี่ยงเวลาแฝงที่ไม่คาดคิดในขณะที่รอการตอบกลับบริการ หากคุณต้องการเปิดใช้งานโหมด eager-loading คุณสามารถทำได้เช่นนี้:
LanguageDetectorBuilder .fromAllLanguages().withPreloadedLanguageModels().build() อินสแตนซ์หลายอินสแตนซ์ของ LanguageDetector แชร์โมเดลภาษาเดียวกันในหน่วยความจำซึ่งเข้าถึงแบบอะซิงโครนัสโดยอินสแตนซ์
ความแม่นยำในการตรวจจับที่สูง ของ Lingua มาพร้อมกับค่าใช้จ่ายในการช้ากว่าเครื่องตรวจจับภาษาอื่น ๆ อย่างเห็นได้ชัด แบบจำลองภาษาขนาดใหญ่ยังใช้หน่วยความจำจำนวนมาก ข้อกำหนดเหล่านี้อาจไม่สามารถทำได้สำหรับระบบที่ใช้ทรัพยากรต่ำ หากคุณต้องการจำแนกข้อความยาวส่วนใหญ่หรือต้องการบันทึกทรัพยากรคุณสามารถเปิดใช้งาน โหมดความแม่นยำต่ำ ที่โหลดเฉพาะชุดย่อยขนาดเล็กของโมเดลภาษาลงในหน่วยความจำ:
LanguageDetectorBuilder .fromAllLanguages().withLowAccuracyMode().build()ข้อเสียของวิธีการนี้คือความแม่นยำในการตรวจจับสำหรับข้อความสั้น ๆ ซึ่งประกอบด้วยตัวอักษรน้อยกว่า 120 ตัวจะลดลงอย่างมีนัยสำคัญ อย่างไรก็ตามความแม่นยำในการตรวจจับสำหรับข้อความที่มีความยาวเกิน 120 อักขระจะยังคงไม่ได้รับผลกระทบ
อีกทางเลือกหนึ่งสำหรับรอยเท้าหน่วยความจำที่เล็กกว่าและประสิทธิภาพที่เร็วขึ้นคือการลดชุดภาษาเมื่อสร้างเครื่องตรวจจับภาษา ในกรณีส่วนใหญ่ไม่แนะนำให้สร้างเครื่องตรวจจับจากภาษาที่รองรับทั้งหมด เมื่อคุณมีความรู้เกี่ยวกับข้อความที่คุณต้องการจัดประเภทคุณสามารถแยกแยะภาษาบางภาษาได้ว่าเป็นไปไม่ได้หรือไม่น่าจะเกิดขึ้น
อาจมีงานการจำแนกประเภทที่คุณรู้ล่วงหน้าว่าข้อมูลภาษาของคุณไม่ได้เขียนเป็นภาษาละตินอย่างแน่นอน (สิ่งที่น่าประหลาดใจ :-) ความแม่นยำในการตรวจจับอาจดีขึ้นในกรณีเช่นนี้หากคุณแยกภาษาบางภาษาออกจากกระบวนการตัดสินใจหรือเพียงแค่รวมภาษาที่เกี่ยวข้องอย่างชัดเจน:
// include all languages available in the library
// WARNING: in the worst case this produces high memory
// consumption of approximately 3.5GB
// and slow runtime performance
// (in high accuracy mode)
LanguageDetectorBuilder .fromAllLanguages()
// include only languages that are not yet extinct (= currently excludes Latin)
LanguageDetectorBuilder .fromAllSpokenLanguages()
// include only languages written with Cyrillic script
LanguageDetectorBuilder .fromAllLanguagesWithCyrillicScript()
// exclude only the Spanish language from the decision algorithm
LanguageDetectorBuilder .fromAllLanguagesWithout( Language . SPANISH )
// only decide between English and German
LanguageDetectorBuilder .fromLanguages( Language . ENGLISH , Language . GERMAN )
// select languages by ISO 639-1 code
LanguageDetectorBuilder .fromIsoCodes639_1( IsoCode639_1 . EN , IsoCode639_3 . DE )
// select languages by ISO 639-3 code
LanguageDetectorBuilder .fromIsoCodes639_3( IsoCode639_3 . ENG , IsoCode639_3 . DEU )ภายใน LINGUA ใช้คอร์ทั้งหมดของ CPU ของคุณอย่างมีประสิทธิภาพเพื่อเพิ่มความเร็วในการโหลดแบบจำลองภาษาและการตรวจจับภาษาเอง เพื่อจุดประสงค์นี้จะใช้ forkjoinpool ภายใน หากใช้ไลบรารีภายในแอปพลิเคชันเซิร์ฟเวอร์หน่วยความจำที่ใช้จะไม่ได้รับการปลดปล่อยโดยอัตโนมัติเมื่อแอปพลิเคชันไม่ได้ใช้งาน
หากคุณต้องการปลดปล่อยทรัพยากรทั้งหมด ของ Lingua คุณจะต้องทำสิ่งนี้ด้วยตนเองโดยการโทรหา detector.unloadLanguageModels() ในระหว่างการไม่ใช้งาน สิ่งนี้จะล้างรุ่นภาษาที่โหลดทั้งหมดจากหน่วยความจำ แต่พูลเธรดจะทำงานต่อไป
หากคุณต้องการลองใช้ LINGUA ก่อนที่คุณจะตัดสินใจว่าจะใช้หรือไม่คุณสามารถเรียกใช้ใน REPL และดูผลการตรวจจับได้ทันที
./gradlew runLinguaOnConsole --console=plainjava -jar lingua-1.2.2-with-dependencies.jarจากนั้นเพียงแค่เล่นรอบ ๆ :
This is Lingua.
Select the language models to load.
1: enter language iso codes manually
2: all supported languages
Type a number and press <Enter>.
Type :quit to exit.
> 1
List some language iso 639-1 codes separated by spaces and press <Enter>.
Type :quit to exit.
> en fr de es
Loading language models...
Done. 4 language models loaded lazily.
Type some text and press <Enter> to detect its language.
Type :quit to exit.
> languages
ENGLISH
> Sprachen
GERMAN
> langues
FRENCH
> :quit
Bye! Ciao! Tschüss! Salut!
ในกรณีที่คุณต้องการมีส่วนร่วมใน Lingua คุณจะได้รับการสนับสนุนให้ทำเช่นนั้น คุณมีแนวคิดในการปรับปรุง API หรือไม่? มีบางภาษาที่คุณต้องการสนับสนุนก่อนหรือไม่? หรือคุณพบข้อบกพร่องใด ๆ จนถึงตอนนี้? อย่าลังเลที่จะเปิดปัญหาหรือส่งคำขอดึง มันชื่นชมมาก
สำหรับคำขอดึงโปรดตรวจสอบให้แน่ใจว่าการทดสอบหน่วยทั้งหมดผ่านและรหัสนั้นถูกจัดรูปแบบตามคู่มือสไตล์ Kotlin อย่างเป็นทางการ คุณสามารถตรวจสอบสิ่งนี้ได้โดยเรียกใช้ Kotlin Linter Ktlint โดยใช้ ./gradlew ktlintCheck ปัญหาส่วนใหญ่ที่ linter ระบุสามารถแก้ไขได้โดยการรัน ./gradlew ktlintFormat ปัญหาอื่น ๆ ทั้งหมดโดยเฉพาะบรรทัดที่มีความยาวมากกว่า 120 อักขระไม่สามารถแก้ไขได้โดยอัตโนมัติ ในกรณีนี้โปรดจัดรูปแบบบรรทัดที่เกี่ยวข้องด้วยมือ คุณจะสังเกตเห็นว่าการสร้างจะล้มเหลวหากการจัดรูปแบบไม่ถูกต้อง
ยินดีต้อนรับคำขอดึงทุกชนิด สิ่งที่ชอบมากที่สุดคือการเพิ่มภาษาใหม่ หากคุณต้องการมีส่วนร่วมในภาษาใหม่ให้กับ LINGUA นี่คือคู่มือรายละเอียดที่อธิบายถึงวิธีการทำสิ่งนั้นให้สำเร็จ
ขอบคุณมากล่วงหน้าสำหรับการมีส่วนร่วมทั้งหมด แต่อาจมีขนาดเล็ก
ในการดำเนินการตามขั้นตอนด้านล่างคุณจะต้องใช้ Java 8 ขึ้นไป แม้ว่าไลบรารีจะทำงานบน Java> = 6 แต่คลาส FilesWriter ใช้ประโยชน์จาก Java.nio API ซึ่งได้รับการแนะนำด้วย Java 8
IsoCode639_1 และ IsoCode639_3 และเพิ่มรหัส ISO ของภาษา ท่ามกลางไซต์อื่น ๆ Wikipedia มีรายการที่ครอบคลุมLanguage enum และเพิ่มรายการใหม่สำหรับภาษาของคุณ หากภาษาถูกเขียนด้วยสคริปต์ที่ยังไม่ได้รับการสนับสนุนโดย Alphabet enum ของ Lingua ให้เพิ่มรายการใหม่สำหรับมันเช่นกันLanguage อย่างไรก็ตามหากอักขระเกิดขึ้นในมากกว่าหนึ่งภาษา แต่ ไม่ใช่ในทุกภาษาให้เพิ่มลงในค่าคงที่ CHARS_TO_LANGUAGES_MAPPING ในค่า Constant คลาสแทนLanguageModelFilesWriter เพื่อสร้างไฟล์โมเดลภาษา ไฟล์ข้อมูลการฝึกอบรมที่ใช้สำหรับการประมาณความน่าจะเป็นของ NGRAM ไม่จำเป็นต้องมีรูปแบบเฉพาะนอกเหนือจากการเป็นไฟล์ TXT ที่ถูกต้อง/src/main/resources/language-models และวางไฟล์โมเดลภาษาที่สร้างขึ้นไว้ในนั้น อย่า เปลี่ยนชื่อไฟล์โมเดลภาษา ชื่อของไดเรกทอรีย่อย จะต้อง เป็นรหัส ISO 639-1 ของภาษาลดลงอย่างสมบูรณ์TestDataFilesWriter เพื่อสร้างไฟล์ข้อมูลทดสอบที่ใช้สำหรับการสร้างรายงานความแม่นยำ ไฟล์อินพุตที่จะสร้างข้อมูลการทดสอบควรมีแต่ละประโยคในบรรทัดแยกต่างหาก/src/accuracyReport/resources/language-testdata อย่า เปลี่ยนชื่อไฟล์ข้อมูลการทดสอบ/src/accuracyReport/kotlin/com/github/pemistahl/lingua/report/config ดูไฟล์ภาษาอื่น ๆ ในไดเรกทอรีนี้เพื่อดูว่าคลาสจะต้องมีลักษณะอย่างไร มันควรจะอธิบายตนเองได้/src/accuracyReport/kotlin/com/github/pemistahl/lingua/report/lingua ดูไฟล์ภาษาอื่น ๆ ในไดเรกทอรีนี้เพื่อดูว่าคลาสจะต้องมีลักษณะอย่างไร มันควรจะอธิบายตนเองได้ หากหนึ่งในห้องสมุดเครื่องตรวจจับภาษาอื่นรองรับภาษาของคุณแล้วคุณสามารถเพิ่มคลาสทดสอบสำหรับผู้ที่ได้เช่นกัน แต่ละห้องสมุดมีไดเรกทอรีของตัวเองเพื่อจุดประสงค์นี้ หากภาษาของคุณไม่ได้รับการสนับสนุนโดยไลบรารีเครื่องตรวจจับภาษาอื่น ๆ ให้แยกออกเป็น AbstractLanguageDetectionAccuracyReportlinguaSupportedLanguages ใน /gradle.properties./gradlew accuracyReport และเพิ่มรายงานความแม่นยำที่อัปเดตลงในคำขอดึงของคุณ./gradlew drawAccuracyPlots และเพิ่มพล็อตที่อัปเดตลงในคำขอดึงของคุณ./gradlew writeAccuracyTable และเพิ่มตารางความแม่นยำที่อัปเดตลงในคำขอดึงของคุณดูปัญหาที่วางแผนไว้