
งานของมันง่าย: มันบอกคุณว่าภาษาใดที่เขียนข้อความบางอย่างนี้มีประโยชน์มากเป็นขั้นตอนการประมวลผลล่วงหน้าสำหรับข้อมูลภาษาศาสตร์ในแอปพลิเคชันการประมวลผลภาษาธรรมชาติเช่นการจำแนกประเภทข้อความและการตรวจสอบการสะกด ตัวอย่างเช่นกรณีการใช้งานอื่น ๆ อาจรวมถึงการกำหนดเส้นทางอีเมลไปยังแผนกบริการลูกค้าที่ตั้งอยู่ทางภูมิศาสตร์ตามภาษาของอีเมล
การตรวจจับภาษามักจะทำเป็นส่วนหนึ่งของกรอบการเรียนรู้ของเครื่องจักรขนาดใหญ่หรือแอพพลิเคชั่นการประมวลผลภาษาธรรมชาติ ในกรณีที่คุณไม่ต้องการฟังก์ชั่นที่เต็มเปี่ยมของระบบเหล่านั้นหรือไม่ต้องการเรียนรู้เชือกของเหล่านั้นห้องสมุดขนาดเล็กที่มีความยืดหยุ่นมีประโยชน์
จนถึงตอนนี้ห้องสมุดโอเพนซอร์สที่ครอบคลุมอื่น ๆ ในระบบนิเวศของ GO สำหรับงานนี้คือ Whatlanggo น่าเสียดายที่มีข้อเสียสองประการที่สำคัญ:
Lingua ตั้งเป้าหมายที่จะกำจัดปัญหาเหล่านี้ เธอเกือบจะไม่ต้องการการกำหนดค่าใด ๆ และให้ผลลัพธ์ที่แม่นยำทั้งข้อความยาวและสั้นแม้ในคำเดียวและวลี เธอใช้วิธีการทั้งตามกฎและสถิติ แต่ไม่ได้ใช้พจนานุกรมคำใด ๆ เธอไม่จำเป็นต้องเชื่อมต่อกับ API หรือบริการภายนอกใด ๆ เมื่อดาวน์โหลดห้องสมุดแล้วจะสามารถใช้ออฟไลน์ได้อย่างสมบูรณ์
เมื่อเปรียบเทียบกับห้องสมุดการตรวจจับภาษาอื่น ๆ การมุ่งเน้น ของ Lingua นั้นมี คุณภาพมากกว่าปริมาณ นั่นคือการตรวจจับที่ถูกต้องสำหรับชุดภาษาขนาดเล็กก่อนที่จะเพิ่มภาษาใหม่ ปัจจุบันมีการรองรับ 75 ภาษาต่อไปนี้:
LINGUA สามารถรายงานสถิติความถูกต้องสำหรับข้อมูลการทดสอบแบบรวมบางอย่างสำหรับแต่ละภาษาที่รองรับ ข้อมูลการทดสอบสำหรับแต่ละภาษาแบ่งออกเป็นสามส่วน:
ทั้งแบบจำลองภาษาและข้อมูลการทดสอบถูกสร้างขึ้นจากเอกสารแยกต่างหากของ Wortschatz Corpora ที่นำเสนอโดย Leipzig University ประเทศเยอรมนี ข้อมูลที่รวบรวมข้อมูลจากเว็บไซต์ข่าวต่าง ๆ ถูกใช้สำหรับการฝึกอบรมแต่ละคลังข้อมูลประกอบด้วยหนึ่งล้านประโยค สำหรับการทดสอบมีการใช้งาน Corpora ที่ทำจากเว็บไซต์ที่เลือกโดยพลการแต่ละแห่งประกอบด้วยประโยคหนึ่งหมื่นประโยค จากแต่ละคลังการทดสอบชุดย่อยที่ไม่ได้เรียงลำดับแบบสุ่มของ 1,000 คำเดียว 1,000 คำคู่และ 1,000 ประโยคได้รับการสกัดตามลำดับ
จากข้อมูลการทดสอบที่สร้างขึ้นฉันได้เปรียบเทียบผลการตรวจจับของ LINGUA และ Whatlanggo ที่ทำงานผ่านข้อมูลของ 75 ภาษาที่รองรับ ของ Lingua นอกจากนี้ฉันได้เพิ่ม CLD3 ของ Google ในการเปรียบเทียบด้วยความช่วยเหลือของการผูก GOCLD3 ภาษาที่ไม่ได้รับการสนับสนุนโดย CLD3 หรือ Whatlanggo จะถูกละเว้นในระหว่างกระบวนการตรวจจับ
แต่ละส่วนต่อไปนี้มีสองแปลง พล็อตบาร์แสดงผลลัพธ์ความแม่นยำโดยละเอียดสำหรับแต่ละภาษาที่รองรับ พล็อตกล่องแสดงการแจกแจงของค่าความแม่นยำสำหรับตัวจําแนกแต่ละตัว กล่องเองเป็นตัวแทนของพื้นที่ที่อยู่ตรงกลาง 50 % ของข้อมูลอยู่ภายใน ภายในกล่องสีเส้นแนวนอนจะทำเครื่องหมายค่ามัธยฐานของการแจกแจง
ตารางด้านล่างแสดงสถิติโดยละเอียดสำหรับแต่ละภาษาและตัวจําแนกรวมถึงค่าเฉลี่ยค่าเฉลี่ยและค่าเบี่ยงเบนมาตรฐาน
| ภาษา | เฉลี่ย | คำเดียว | คู่คำ | ประโยค | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ลิ้น (โหมดความแม่นยำสูง) | ลิ้น (โหมดความแม่นยำต่ำ) | CLD3 | Whatlang | ลิ้น (โหมดความแม่นยำสูง) | ลิ้น (โหมดความแม่นยำต่ำ) | CLD3 | Whatlang | ลิ้น (โหมดความแม่นยำสูง) | ลิ้น (โหมดความแม่นยำต่ำ) | CLD3 | Whatlang | ลิ้น (โหมดความแม่นยำสูง) | ลิ้น (โหมดความแม่นยำต่ำ) | CLD3 | Whatlang | |
| ชาวแอฟริกัน | 79 | 64 | 55 | 51 | 58 | 38 | 22 | 21 | 81 | 62 | 46 | 39 | 97 | 93 | 98 | 92 |
| ชาวแอลเบเนีย | 88 | 80 | 55 | - | 69 | 54 | 18 | - | 95 | 86 | 48 | - | 100 | 99 | 98 | - |
| ภาษาอาหรับ | 98 | 94 | 90 | 89 | 96 | 88 | 79 | 77 | 99 | 96 | 92 | 91 | 100 | 99 | 100 | 99 |
| เกี่ยวกับอาร์เมเนีย | 100 | 100 | 99 | - | 100 | 100 | 100 | - | 100 | 100 | 100 | - | 100 | 100 | 97 | - |
| อาเซอร์ไบจัน | 90 | 82 | 81 | 64 | 77 | 71 | 62 | 45 | 92 | 78 | 82 | 58 | 99 | 96 | 99 | 91 |
| เกี่ยวกับบาสก์ | 84 | 75 | 62 | - | 71 | 56 | 33 | - | 87 | 76 | 62 | - | 93 | 92 | 92 | - |
| ชาวเบลารุส | 97 | 92 | 84 | 81 | 92 | 80 | 67 | 64 | 99 | 95 | 86 | 80 | 100 | 100 | 100 | 98 |
| เบงกอล | 100 | 100 | 99 | 100 | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 99 | 100 |
| บอคมาล | 58 | 50 | - | 34 | 39 | 27 | - | 15 | 59 | 47 | - | 28 | 77 | 75 | - | 60 |
| ชาวบอสเนีย | 35 | 29 | 33 | - | 29 | 23 | 19 | - | 35 | 29 | 28 | - | 41 | 36 | 52 | - |
| ชาวบัลแกเรีย | 87 | 78 | 70 | 61 | 70 | 56 | 45 | 37 | 91 | 81 | 66 | 57 | 99 | 96 | 98 | 89 |
| คาตาลัน | 70 | 58 | 48 | - | 51 | 33 | 19 | - | 74 | 60 | 42 | - | 87 | 82 | 84 | - |
| ชาวจีน | 100 | 100 | 92 | 100 | 100 | 100 | 92 | 100 | 100 | 100 | 83 | 100 | 100 | 100 | 100 | 100 |
| เกี่ยวกับภาษาโครเอเชีย | 73 | 60 | 42 | 55 | 53 | 36 | 26 | 28 | 74 | 57 | 42 | 44 | 90 | 86 | 58 | 91 |
| ภาษาเช็ก | 80 | 71 | 64 | 50 | 66 | 54 | 39 | 31 | 84 | 72 | 65 | 46 | 91 | 87 | 88 | 71 |
| เกี่ยวกับเดนมาร์ก | 81 | 70 | 58 | 47 | 61 | 45 | 26 | 24 | 84 | 70 | 54 | 38 | 98 | 95 | 95 | 79 |
| ชาวดัตช์ | 77 | 64 | 58 | 47 | 55 | 36 | 29 | 22 | 81 | 61 | 47 | 36 | 96 | 94 | 97 | 82 |
| ภาษาอังกฤษ | 81 | 63 | 54 | 49 | 55 | 29 | 22 | 17 | 89 | 62 | 44 | 35 | 99 | 97 | 97 | 94 |
| ชาวเอสเปอร์รันโต | 84 | 66 | 57 | 52 | 67 | 44 | 22 | 25 | 85 | 61 | 51 | 45 | 98 | 93 | 98 | 88 |
| เอสโตเนีย | 92 | 83 | 70 | 61 | 80 | 62 | 41 | 36 | 96 | 88 | 69 | 53 | 100 | 99 | 99 | 94 |
| ภาษาฟินแลนด์ | 96 | 91 | 80 | 71 | 90 | 77 | 58 | 45 | 98 | 95 | 84 | 70 | 100 | 100 | 99 | 98 |
| ภาษาฝรั่งเศส | 89 | 77 | 55 | 64 | 74 | 52 | 22 | 37 | 94 | 83 | 49 | 59 | 99 | 98 | 94 | 97 |
| กานดา | 91 | 84 | - | - | 79 | 65 | - | - | 95 | 87 | - | - | 100 | 100 | - | - |
| ชาวจอร์เจีย | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 96 | 100 |
| ชาวเยอรมัน | 89 | 80 | 66 | 65 | 74 | 57 | 40 | 38 | 94 | 84 | 62 | 60 | 100 | 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 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| ภาษาฮีบรู | 100 | 100 | - | 90 | 100 | 100 | - | 76 | 100 | 100 | - | 94 | 100 | 100 | - | 99 |
| ภาษาฮินดี | 73 | 33 | 58 | 52 | 61 | 11 | 34 | 27 | 64 | 20 | 45 | 40 | 95 | 67 | 95 | 88 |
| ชาวฮังการี | 95 | 90 | 76 | 62 | 87 | 77 | 53 | 37 | 98 | 94 | 76 | 53 | 100 | 100 | 99 | 95 |
| เกี่ยวกับไอซ์แลนด์ | 93 | 88 | 71 | - | 83 | 72 | 42 | - | 97 | 92 | 70 | - | 100 | 99 | 99 | - |
| ชาวอินโดนีเซีย | 61 | 47 | 46 | 67 | 39 | 25 | 26 | 39 | 61 | 46 | 45 | 66 | 83 | 71 | 66 | 95 |
| เกี่ยวกับไอริช | 91 | 85 | 67 | - | 82 | 70 | 42 | - | 94 | 90 | 66 | - | 96 | 95 | 94 | - |
| อิตาลี | 87 | 71 | 62 | 56 | 69 | 42 | 31 | 25 | 92 | 74 | 57 | 47 | 100 | 98 | 98 | 96 |
| ญี่ปุ่น | 100 | 100 | 98 | 99 | 100 | 100 | 97 | 100 | 100 | 100 | 96 | 100 | 100 | 100 | 100 | 97 |
| คาซัค | 92 | 90 | 82 | - | 80 | 78 | 62 | - | 96 | 93 | 83 | - | 99 | 99 | 99 | - |
| เกาหลี | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 100 |
| ภาษาละติน | 87 | 73 | 62 | - | 72 | 49 | 44 | - | 93 | 76 | 58 | - | 97 | 94 | 83 | - |
| เกี่ยวกับลัตเวีย | 93 | 87 | 75 | 59 | 85 | 75 | 51 | 36 | 97 | 90 | 77 | 54 | 99 | 97 | 98 | 87 |
| เกี่ยวกับลิทัวเนีย | 95 | 87 | 72 | 62 | 86 | 76 | 42 | 38 | 98 | 89 | 75 | 56 | 100 | 98 | 99 | 92 |
| ชาวมาซิโดเนีย | 84 | 72 | 60 | 62 | 66 | 52 | 30 | 39 | 86 | 70 | 54 | 55 | 99 | 95 | 97 | 94 |
| มลายู | 31 | 31 | 22 | - | 26 | 22 | 11 | - | 38 | 36 | 22 | - | 28 | 35 | 34 | - |
| ชาวเมารี | 91 | 82 | 52 | - | 82 | 62 | 22 | - | 92 | 87 | 43 | - | 99 | 98 | 91 | - |
| มาราธี | 85 | 39 | 84 | 73 | 74 | 16 | 69 | 52 | 85 | 30 | 84 | 74 | 96 | 72 | 98 | 93 |
| ชาวมองโกเลีย | 97 | 95 | 83 | - | 93 | 89 | 63 | - | 99 | 98 | 87 | - | 99 | 99 | 99 | - |
| Nynorsk | 66 | 52 | - | 34 | 41 | 25 | - | 10 | 66 | 49 | - | 24 | 91 | 81 | - | 69 |
| ชาวเปอร์เซีย | 90 | 80 | 76 | 70 | 78 | 62 | 57 | 46 | 94 | 80 | 70 | 66 | 100 | 98 | 99 | 99 |
| ขัด | 95 | 90 | 77 | 66 | 85 | 77 | 51 | 45 | 98 | 93 | 80 | 59 | 100 | 99 | 99 | 94 |
| ชาวโปรตุเกส | 81 | 69 | 53 | 57 | 59 | 42 | 21 | 26 | 85 | 70 | 40 | 48 | 99 | 95 | 97 | 96 |
| ปัญจาบ | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| เกี่ยวกับโรมาเนีย | 87 | 72 | 53 | 59 | 69 | 49 | 24 | 34 | 92 | 74 | 48 | 52 | 99 | 94 | 88 | 90 |
| ชาวรัสเซีย | 90 | 78 | 71 | 53 | 76 | 59 | 48 | 40 | 95 | 84 | 72 | 52 | 98 | 92 | 93 | 68 |
| ประเทศเซอร์เบีย | 88 | 78 | 78 | 57 | 74 | 62 | 63 | 34 | 90 | 80 | 75 | 51 | 99 | 91 | 95 | 86 |
| โชนา | 91 | 81 | 76 | 68 | 78 | 56 | 51 | 44 | 96 | 86 | 79 | 65 | 100 | 100 | 99 | 95 |
| ชาวสโลวะเกีย | 84 | 75 | 63 | - | 64 | 49 | 32 | - | 90 | 78 | 61 | - | 99 | 97 | 96 | - |
| สโลเวเนียน | 82 | 67 | 63 | 48 | 61 | 39 | 29 | 25 | 87 | 68 | 60 | 38 | 99 | 93 | 99 | 81 |
| โซมาเลีย | 92 | 85 | 69 | 68 | 82 | 64 | 38 | 38 | 96 | 90 | 70 | 66 | 100 | 100 | 100 | 99 |
| sotho | 86 | 72 | 49 | - | 67 | 43 | 15 | - | 90 | 75 | 33 | - | 100 | 97 | 98 | - |
| เกี่ยวกับภาษาสเปน | 70 | 56 | 48 | 48 | 44 | 26 | 16 | 19 | 69 | 49 | 32 | 33 | 97 | 94 | 96 | 93 |
| ภาษาสวาฮิลี | 81 | 70 | 57 | - | 60 | 43 | 25 | - | 84 | 68 | 49 | - | 98 | 97 | 98 | - |
| ภาษาสวีเดน | 84 | 72 | 61 | 49 | 64 | 46 | 30 | 24 | 88 | 76 | 56 | 40 | 99 | 94 | 96 | 83 |
| ภาษาตากาล็อก | 78 | 66 | - | 52 | 52 | 36 | - | 23 | 83 | 67 | - | 43 | 98 | 96 | - | 90 |
| ทมิฬ | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 |
| เตลูกู | 100 | 100 | 99 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 |
| แบบไทย | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 99 |
| ซองกา | 84 | 72 | - | - | 66 | 46 | - | - | 89 | 73 | - | - | 98 | 97 | - | - |
| TSWANA | 84 | 71 | - | - | 65 | 44 | - | - | 88 | 73 | - | - | 99 | 96 | - | - |
| ตุรกี | 94 | 87 | 69 | 54 | 84 | 71 | 41 | 26 | 98 | 91 | 70 | 44 | 100 | 100 | 97 | 92 |
| ชาวยูเครน | 92 | 86 | 81 | 72 | 84 | 75 | 62 | 53 | 97 | 92 | 83 | 71 | 95 | 93 | 98 | 93 |
| ภาษาอูรดู | 91 | 80 | 61 | 57 | 80 | 65 | 39 | 31 | 94 | 78 | 53 | 46 | 98 | 96 | 92 | 94 |
| เวียดนาม | 91 | 87 | 66 | 73 | 79 | 76 | 26 | 36 | 94 | 87 | 74 | 85 | 99 | 98 | 99 | 97 |
| ชาวเวลส์ | 91 | 82 | 69 | - | 78 | 61 | 43 | - | 96 | 87 | 66 | - | 99 | 99 | 98 | - |
| โซซา | 82 | 69 | 66 | - | 64 | 45 | 40 | - | 85 | 67 | 65 | - | 98 | 94 | 92 | - |
| โยรูบา | 74 | 62 | 15 | 22 | 50 | 33 | 5 | 11 | 77 | 61 | 11 | 14 | 96 | 92 | 28 | 41 |
| ซูลู | 81 | 70 | 63 | 70 | 62 | 45 | 35 | 44 | 83 | 72 | 63 | 68 | 97 | 94 | 92 | 98 |
| หมายถึง | 86 | 77 | 69 | 67 | 74 | 61 | 48 | 48 | 89 | 78 | 67 | 63 | 96 | 93 | 93 | 91 |
| ค่ามัธยฐาน | 89.0 | 80.0 | 68.0 | 62.0 | 74.0 | 57.0 | 41.0 | 38.0 | 94.0 | 81.0 | 66.0 | 57.0 | 99.0 | 97.0 | 98.0 | 94.0 |
| ค่าเบี่ยงเบนมาตรฐาน | 13.08 | 17.29 | 19.04 | 20.22 | 18.41 | 24.9 | 27.86 | 29.28 | 13.12 | 18.93 | 21.83 | 24.22 | 11.05 | 11.91 | 13.95 | 11.24 |
เครื่องตรวจจับภาษาทุกตัวใช้โมเดล N-Gram ที่น่าจะเป็นที่ผ่านการฝึกอบรมเกี่ยวกับการกระจายตัวละครในคลังการฝึกอบรมบางอย่าง ห้องสมุดส่วนใหญ่ใช้ N-GRAMs ขนาด 3 (trigrams) ซึ่งเป็นที่น่าพอใจสำหรับการตรวจจับภาษาของชิ้นส่วนข้อความที่ยาวขึ้นซึ่งประกอบด้วยหลายประโยค อย่างไรก็ตามสำหรับวลีสั้น ๆ หรือคำเดียว trigrams ไม่เพียงพอ ยิ่งข้อความอินพุตสั้นลงเท่าใดก็ยิ่งมี N-GRAM น้อยลง ความน่าจะเป็นที่ประเมินจาก N-grams ไม่กี่ตัวนั้นไม่น่าเชื่อถือ นี่คือเหตุผลที่ Lingua ใช้ประโยชน์จาก N-Grams ขนาด 1 ถึง 5 ซึ่งส่งผลให้การทำนายภาษาที่ถูกต้องแม่นยำยิ่งขึ้น
ความแตกต่างที่สำคัญอันดับสองคือ LINGUA ไม่เพียง แต่ใช้โมเดลทางสถิติดังกล่าวเท่านั้น แต่ยังรวมถึงเอ็นจิ้นตามกฎด้วย เครื่องยนต์นี้จะกำหนดตัวอักษรของข้อความอินพุตและค้นหาอักขระที่ไม่ซ้ำกันในหนึ่งภาษาหรือมากกว่า หากภาษาเดียวสามารถเลือกได้อย่างน่าเชื่อถือด้วยวิธีนี้แบบจำลองทางสถิติไม่จำเป็นอีกต่อไป ไม่ว่าในกรณีใดเครื่องยนต์ตามกฎจะกรองภาษาที่ไม่เป็นไปตามเงื่อนไขของข้อความอินพุต จากนั้นในขั้นตอนที่สองโมเดล N-GRAM ความน่าจะเป็นจะถูกนำมาพิจารณา สิ่งนี้สมเหตุสมผลเพราะการโหลดแบบจำลองภาษาน้อยลงหมายถึงการใช้หน่วยความจำน้อยลงและประสิทธิภาพการทำงานของรันไทม์ที่ดีขึ้น
โดยทั่วไปแล้วมันเป็นความคิดที่ดีที่จะ จำกัด ชุดภาษาที่จะพิจารณาในกระบวนการจำแนกประเภทโดยใช้วิธี API ที่เกี่ยวข้อง หากคุณรู้ล่วงหน้าว่าบางภาษาจะไม่เกิดขึ้นในข้อความอินพุตอย่าปล่อยให้ภาษาเหล่านั้นมีส่วนร่วมในกระบวนการแยกประเภท กลไกการกรองของเอ็นจิ้นตามกฎนั้นค่อนข้างดีอย่างไรก็ตามการกรองตามความรู้ของคุณเกี่ยวกับข้อความอินพุตนั้นดีกว่าเสมอ
หากคุณต้องการทำซ้ำผลลัพธ์ที่ถูกต้องด้านบนคุณสามารถสร้างรายงานการทดสอบด้วยตัวเองสำหรับตัวแยกประเภทและทุกภาษาโดยการทำ:
cd cmd
go run accuracy_reporter.go
เพื่อให้ GOCLD3 ทำงานได้สำเร็จคุณต้องติดตั้งเวอร์ชัน 3.17.3 ของบัฟเฟอร์โปรโตคอลของ Google ซึ่งเป็นเรื่องที่โชคร้ายเล็กน้อย สำหรับเครื่องตรวจจับและภาษาแต่ละรายการไฟล์รายงานการทดสอบจะถูกเขียนลงใน /accuracy-reports ตัวอย่างเช่นนี่คือผลลัพธ์ปัจจุบันของรายงานภาษาเยอรมัน Lingua :
##### German #####
>>> Accuracy on average: 89.23%
>> Detection of 1000 single words (average length: 9 chars)
Accuracy: 73.90%
Erroneously classified as Dutch: 2.30%, Danish: 2.10%, English: 2.00%, Latin: 1.90%, Bokmal: 1.60%, Basque: 1.20%, French: 1.20%, Italian: 1.20%, Esperanto: 1.10%, Swedish: 1.00%, Afrikaans: 0.80%, Tsonga: 0.70%, Nynorsk: 0.60%, Portuguese: 0.60%, Yoruba: 0.60%, Finnish: 0.50%, Sotho: 0.50%, Welsh: 0.50%, Estonian: 0.40%, Irish: 0.40%, Polish: 0.40%, Spanish: 0.40%, Swahili: 0.40%, Tswana: 0.40%, Bosnian: 0.30%, Icelandic: 0.30%, Tagalog: 0.30%, Albanian: 0.20%, Catalan: 0.20%, Croatian: 0.20%, Indonesian: 0.20%, Lithuanian: 0.20%, Maori: 0.20%, Romanian: 0.20%, Xhosa: 0.20%, Zulu: 0.20%, Latvian: 0.10%, Malay: 0.10%, Slovak: 0.10%, Slovene: 0.10%, Somali: 0.10%, Turkish: 0.10%
>> Detection of 1000 word pairs (average length: 18 chars)
Accuracy: 94.10%
Erroneously classified as Dutch: 0.90%, Latin: 0.80%, English: 0.70%, Swedish: 0.60%, Danish: 0.50%, French: 0.40%, Bokmal: 0.30%, Irish: 0.20%, Tagalog: 0.20%, Afrikaans: 0.10%, Esperanto: 0.10%, Estonian: 0.10%, Finnish: 0.10%, Italian: 0.10%, Maori: 0.10%, Nynorsk: 0.10%, Somali: 0.10%, Swahili: 0.10%, Tsonga: 0.10%, Turkish: 0.10%, Welsh: 0.10%, Zulu: 0.10%
>> Detection of 1000 sentences (average length: 111 chars)
Accuracy: 99.70%
Erroneously classified as Dutch: 0.20%, Latin: 0.10%
go get github.com/pemistahl/lingua-go
Lingua ต้องการอย่างน้อยไปเวอร์ชัน 1.18
git clone https://github.com/pemistahl/lingua-go.git
cd lingua-go
go build
ซอร์สโค้ดมาพร้อมกับชุดทดสอบหน่วยที่กว้างขวาง ในการเรียกใช้การทดสอบเพียงแค่พูดว่า:
go test
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
if language , exists := detector . DetectLanguageOf ( "languages are awesome" ); exists {
fmt . Println ( language )
}
// Output: English
}โดยค่าเริ่มต้น Lingua จะส่งคืนภาษาที่เป็นไปได้มากที่สุดสำหรับข้อความอินพุตที่กำหนด อย่างไรก็ตามมีคำบางคำที่สะกดเหมือนกันในมากกว่าหนึ่งภาษา ยกตัวอย่างเช่นคำ ว่าคำว่า เป็นทั้งคำภาษาอังกฤษและภาษาฝรั่งเศสที่ถูกต้อง Lingua จะส่งออกภาษาอังกฤษหรือภาษาฝรั่งเศสซึ่งอาจผิดในบริบทที่กำหนด สำหรับกรณีเช่นนั้นมันเป็นไปได้ที่จะระบุระยะทางสัมพัทธ์ขั้นต่ำที่ความน่าจะเป็นลอการิทึมและสรุปความน่าจะเป็นสำหรับแต่ละภาษาที่เป็นไปได้จะต้องตอบสนอง สามารถระบุได้ด้วยวิธีต่อไปนี้:
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
WithMinimumRelativeDistance ( 0.9 ).
Build ()
language , exists := detector . DetectLanguageOf ( "languages are awesome" )
fmt . Println ( language )
fmt . Println ( exists )
// Output:
// Unknown
// false
} โปรดทราบว่าระยะห่างระหว่างความน่าจะเป็นภาษานั้นขึ้นอยู่กับความยาวของข้อความอินพุต ยิ่งข้อความอินพุตนานเท่าไหร่ระยะห่างระหว่างภาษาก็ยิ่งใหญ่ขึ้นเท่านั้น ดังนั้นหากคุณต้องการจำแนกวลีข้อความสั้น ๆ อย่าตั้งระยะทางสัมพัทธ์ขั้นต่ำสูงเกินไป มิฉะนั้นจะ Unknown จะส่งคืนส่วนใหญ่ในตัวอย่างข้างต้น นี่คือค่าผลตอบแทนสำหรับกรณีที่การตรวจจับภาษาไม่น่าเชื่อถือ ค่านี้ไม่ได้มีไว้เพื่อรวมอยู่ในชุดภาษาอินพุตเมื่อสร้างเครื่องตรวจจับภาษา หากคุณรวมไว้มันจะถูกลบออกโดยอัตโนมัติจากชุดภาษาอินพุต
การรู้เกี่ยวกับภาษาที่เป็นไปได้มากที่สุดนั้นดี แต่ความน่าเชื่อถือของความน่าเชื่อถือคือการคำนวณ? และภาษาที่ตรวจสอบอื่น ๆ มีโอกาสน้อยแค่ไหนเมื่อเทียบกับภาษาที่เป็นไปได้มากที่สุด? คำถามเหล่านี้สามารถตอบได้เช่นกัน:
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
confidenceValues := detector . ComputeLanguageConfidenceValues ( "languages are awesome" )
for _ , elem := range confidenceValues {
fmt . Printf ( "%s: %.2f n " , elem . Language (), elem . Value ())
}
// Output:
// English: 0.93
// French: 0.04
// German: 0.02
// Spanish: 0.01
} ในตัวอย่างข้างต้นชิ้นส่วนของ ConfidenceValue จะถูกส่งคืนซึ่งมีภาษาที่เป็นไปได้ทั้งหมดที่จัดเรียงตามค่าความเชื่อมั่นของพวกเขาตามลำดับจากมากไปน้อย แต่ละค่าคือความน่าจะเป็นระหว่าง 0.0 ถึง 1.0 ความน่าจะเป็นของทุกภาษาจะรวมเป็น 1.0 หากภาษาถูกระบุอย่างไม่น่าสงสัยโดยเอ็นจิ้นกฎค่า 1.0 จะถูกส่งคืนสำหรับภาษานี้เสมอ ภาษาอื่น ๆ จะได้รับค่า 0.0
นอกจากนี้ยังมีวิธีการคืนค่าความเชื่อมั่นสำหรับภาษาเฉพาะหนึ่งภาษาเท่านั้น:
confidence := detector . ComputeLanguageConfidence ( "languages are awesome" , lingua . French )
fmt . Printf ( "%.2f" , confidence )
// Output:
// 0.04ค่าที่วิธีการนี้คำนวณเป็นตัวเลขระหว่าง 0.0 ถึง 1.0 หากภาษาถูกระบุอย่างไม่น่าสงสัยโดยเอ็นจิ้นกฎค่า 1.0 จะถูกส่งคืนเสมอ หากภาษาที่กำหนดไม่ได้รับการสนับสนุนโดยอินสแตนซ์ของเครื่องตรวจจับนี้ค่า 0.0 จะถูกส่งคืนเสมอ
โดยค่าเริ่มต้น LINGUA ใช้การโหลดขี้เกียจเพื่อโหลดเฉพาะรุ่นภาษาเหล่านั้นตามความต้องการซึ่งถือว่าเกี่ยวข้องกับเอ็นจิ้นตัวกรองตามกฎ ตัวอย่างเช่นบริการเว็บมันค่อนข้างเป็นประโยชน์ในการโหลดโมเดลภาษาทั้งหมดลงในหน่วยความจำเพื่อหลีกเลี่ยงเวลาแฝงที่ไม่คาดคิดในขณะที่รอการตอบกลับบริการ หากคุณต้องการเปิดใช้งานโหมด eager-loading คุณสามารถทำได้เช่นนี้:
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithPreloadedLanguageModels ().
Build () อินสแตนซ์หลายอินสแตนซ์ของ LanguageDetector แชร์โมเดลภาษาเดียวกันในหน่วยความจำซึ่งเข้าถึงแบบอะซิงโครนัสโดยอินสแตนซ์
ความแม่นยำในการตรวจจับที่สูง ของ Lingua มาพร้อมกับค่าใช้จ่ายในการช้ากว่าเครื่องตรวจจับภาษาอื่น ๆ อย่างเห็นได้ชัด แบบจำลองภาษาขนาดใหญ่ยังใช้หน่วยความจำจำนวนมาก ข้อกำหนดเหล่านี้อาจไม่สามารถทำได้สำหรับระบบที่ใช้ทรัพยากรต่ำ หากคุณต้องการจำแนกข้อความยาวส่วนใหญ่หรือต้องการบันทึกทรัพยากรคุณสามารถเปิดใช้งาน โหมดความแม่นยำต่ำ ที่โหลดเฉพาะชุดย่อยขนาดเล็กของโมเดลภาษาลงในหน่วยความจำ:
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithLowAccuracyMode ().
Build ()ข้อเสียของวิธีการนี้คือความแม่นยำในการตรวจจับสำหรับข้อความสั้น ๆ ซึ่งประกอบด้วยตัวอักษรน้อยกว่า 120 ตัวจะลดลงอย่างมีนัยสำคัญ อย่างไรก็ตามความแม่นยำในการตรวจจับสำหรับข้อความที่มีความยาวเกิน 120 อักขระจะยังคงไม่ได้รับผลกระทบ
ในโหมดความแม่นยำสูง (ค่าเริ่มต้น) เครื่องตรวจจับภาษาใช้หน่วยความจำประมาณ 1,800 MB หากโหลดทุกรุ่นภาษา ในโหมดความแม่นยำต่ำการใช้หน่วยความจำจะลดลงเหลือประมาณ 110 MB เป้าหมายคือเพื่อลดการใช้หน่วยความจำในรุ่นต่อ ๆ ไป
อีกทางเลือกหนึ่งสำหรับรอยเท้าหน่วยความจำที่เล็กกว่าและประสิทธิภาพที่เร็วขึ้นคือการลดชุดภาษาเมื่อสร้างเครื่องตรวจจับภาษา ในกรณีส่วนใหญ่ไม่แนะนำให้สร้างเครื่องตรวจจับจากภาษาที่รองรับทั้งหมด เมื่อคุณมีความรู้เกี่ยวกับข้อความที่คุณต้องการจัดประเภทคุณสามารถแยกแยะภาษาบางภาษาได้ว่าเป็นไปไม่ได้หรือไม่น่าจะเกิดขึ้น
ตรงกันข้ามกับเครื่องตรวจจับภาษาอื่น ๆ ส่วนใหญ่ Lingua สามารถตรวจจับหลายภาษาในข้อความภาษาผสม คุณลักษณะนี้สามารถให้ผลลัพธ์ที่สมเหตุสมผล แต่ก็ยังอยู่ในสถานะการทดลองและดังนั้นผลการตรวจจับจึงขึ้นอยู่กับข้อความอินพุตสูง มันทำงานได้ดีที่สุดในโหมดความแม่นยำสูงพร้อมคำยาวหลายคำสำหรับแต่ละภาษา ยิ่งวลีและคำพูดของพวกเขาสั้นลงเท่าไหร่ผลลัพธ์ก็คือผลลัพธ์ที่แม่นยำ การลดชุดภาษาเมื่อสร้างเครื่องตรวจจับภาษายังสามารถปรับปรุงความแม่นยำสำหรับงานนี้หากภาษาที่เกิดขึ้นในข้อความเท่ากับภาษาที่สนับสนุนโดยอินสแตนซ์ของเครื่องตรวจจับภาษาที่เกี่ยวข้อง
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
sentence := "Parlez-vous français? " +
"Ich spreche Französisch nur ein bisschen. " +
"A little bit is better than nothing."
for _ , result := range detector . DetectMultipleLanguagesOf ( sentence ) {
fmt . Printf ( "%s: '%s' n " , result . Language (), sentence [ result . StartIndex (): result . EndIndex ()])
}
// Output:
// French: 'Parlez-vous français? '
// German: 'Ich spreche Französisch nur ein bisschen. '
// English: 'A little bit is better than nothing.'
} ในตัวอย่างข้างต้นชิ้นส่วนของ DetectionResult จะถูกส่งคืน แต่ละรายการในชิ้นอธิบายส่วนข้อความภาษาเดียวที่ต่อเนื่องกันซึ่งจัดทำดัชนีเริ่มต้นและสิ้นสุดของสตริงย่อยที่เกี่ยวข้อง
อาจมีงานการจำแนกประเภทที่คุณรู้มาก่อนว่าข้อมูลภาษาของคุณไม่ได้เขียนเป็นภาษาละตินอย่างแน่นอน ความแม่นยำในการตรวจจับอาจดีขึ้นในกรณีเช่นนี้หากคุณแยกภาษาบางภาษาออกจากกระบวนการตัดสินใจหรือเพียงแค่รวมภาษาที่เกี่ยวข้องอย่างชัดเจน:
// Include all languages available in the library.
lingua . NewLanguageDetectorBuilder (). FromAllLanguages ()
// Include only languages that are not yet extinct (= currently excludes Latin).
lingua . NewLanguageDetectorBuilder (). FromAllSpokenLanguages ()
// Include only languages written with Cyrillic script.
lingua . NewLanguageDetectorBuilder (). FromAllLanguagesWithCyrillicScript ()
// Exclude only the Spanish language from the decision algorithm.
lingua . NewLanguageDetectorBuilder (). FromAllLanguagesWithout ( lingua . Spanish )
// Only decide between English and German.
lingua . NewLanguageDetectorBuilder (). FromLanguages ( lingua . English , lingua . German )
// Select languages by ISO 639-1 code.
lingua . NewLanguageDetectorBuilder (). FromIsoCodes639_1 ( lingua . EN , lingua . DE )
// Select languages by ISO 639-3 code.
lingua . NewLanguageDetectorBuilder (). FromIsoCodes639_3 ( lingua . ENG , lingua . DEU )ดูปัญหาที่วางแผนไว้
การมีส่วนร่วมใด ๆ ที่มีต่อ LINGUA นั้นได้รับการชื่นชมอย่างมาก โปรดอ่านคำแนะนำใน CONTRIBUTING.md สำหรับวิธีเพิ่มภาษาใหม่ในห้องสมุด