เครื่องมือตรวจจับภาษาที่มีประสิทธิภาพ ( Nito-ELD หรือ ELD ) เป็นซอฟต์แวร์ตรวจจับภาษาธรรมชาติที่รวดเร็วและแม่นยำ เขียนด้วย PHP 100% โดยมีความเร็วเทียบเท่ากับเครื่องมือตรวจจับที่คอมไพล์ด้วย C++ ที่รวดเร็ว และความแม่นยำภายในช่วงของเครื่องมือตรวจจับที่ดีที่สุดในปัจจุบัน
ไม่มีการพึ่งพา ติดตั้งง่าย เพียงใช้ PHP พร้อมส่วนขยาย mb
ELD ยังมีให้บริการ (เวอร์ชันล้าสมัย) ใน Javascript และ Python
การติดตั้ง
วิธีใช้
เกณฑ์มาตรฐาน
ฐานข้อมูล
การทดสอบ
ภาษา
การเปลี่ยนแปลงจาก ELD v2 เป็น v3:
ตรวจพบ () -> ภาษาตอนนี้ส่งคืนสตริง
'und'
สำหรับ ไม่ได้กำหนดไว้ แทนที่จะเป็นNULL
ฐานข้อมูลเข้ากันไม่ได้ และใหญ่กว่า ปานกลาง v2 µ เล็ก v3
ฟังก์ชัน dynamicLangSubset() ถูกลบออก
ตอนนี้ฟังก์ชัน cleanText() ได้รับการตั้งชื่อว่า EnableTextCleanup()
$ ผู้แต่งต้องการ nitotm/efficient-language-detector
--prefer-dist
จะละเว้น tests/ , misc/ & benchmark/ หรือใช้ --prefer-source
เพื่อรวมทุกอย่าง
ติดตั้ง nitotm/efficient-language-detector:dev-main
เพื่อลองการเปลี่ยนแปลงล่าสุดที่ไม่เสถียร
หรืออีกวิธีหนึ่งคือดาวน์โหลด / โคลนไฟล์ก็ทำงานได้ดี
(เฉพาะการติดตั้ง DB ขนาดเล็ก ที่อยู่ระหว่างการก่อสร้าง)
ขอแนะนำให้ใช้ OPcache โดยเฉพาะสำหรับฐานข้อมูลขนาดใหญ่เพื่อลดเวลาในการโหลด
เราจำเป็นต้องตั้งค่า opcache.interned_strings_buffer
, opcache.memory_consumption
สูงเพียงพอสำหรับแต่ละฐานข้อมูล
ค่าที่แนะนำอยู่ในวงเล็บ ตรวจสอบฐานข้อมูลเพื่อดูข้อมูลเพิ่มเติม
การตั้งค่า php.ini | เล็ก | ปานกลาง | ใหญ่ | ขนาดใหญ่พิเศษ |
---|---|---|---|---|
memory_limit | >= 128 | >= 340 | >= 1,060 | >= 2200 |
opcache.interned... | >= 8 (16) | >= 16 (32) | >= 60 (70) | >= 116 (128) |
opcache.memory | >= 64 (128) | >= 128 (230) | >= 360 (450) | >= 750 (820) |
detect()
ต้องการสตริง UTF-8 และส่งคืนออบเจ็กต์ที่มีคุณสมบัติ language
ซึ่งมีรหัส ISO 639-1 (หรือรูปแบบอื่นที่เลือก) หรือ 'und'
สำหรับภาษาที่ไม่ได้กำหนดไว้
// need_once 'manual_loader.php'; หากต้องการโหลด ELD โดยไม่มีตัวโหลดอัตโนมัติ อัปเดต path.use NitotmEld{LanguageDetector, EldDataFile, EldFormat};// LanguageDetector(databaseFile: ?string, outputFormat: ?string)$eld = new LanguageDetector(EldDataFile::SMALL, EldFormat::ISO639_1);// ไฟล์ฐานข้อมูล: ' เล็ก','กลาง','ใหญ่','ใหญ่พิเศษ' ตรวจสอบข้อกำหนดของหน่วยความจำ// รูปแบบ: 'ISO639_1', 'ISO639_2T', 'ISO639_1_BCP47', 'ISO639_2T_BCP47' และ 'FULL_TEXT'// ไม่จำเป็นต้องมีค่าคงที่ LanguageDetector('small', 'ISO639_1'); จะทำงานด้วย$eld->detect('Hola, cómo te llamas?');// object( language => string, Scores() => array, isReliable() => bool )// ( language => 'es', Scores() => ['es' => 0.25, 'nl' => 0.05], isReliable() => true )$eld->detect('Hola, cómo te llamas?') ->ภาษา;// 'es'
การเรียก langSubset()
หนึ่งครั้งจะเป็นการตั้งค่าเซ็ตย่อย การเรียกครั้งแรกใช้เวลานานกว่าในขณะที่สร้างฐานข้อมูลใหม่ หากบันทึกไฟล์ฐานข้อมูล (ค่าเริ่มต้น) จะถูกโหลดในครั้งต่อไปที่เราสร้างชุดย่อยเดียวกัน
หากต้องการใช้เซ็ตย่อยโดยไม่มีค่าใช้จ่ายเพิ่มเติม วิธีที่เหมาะสมคือสร้างอินสแตนซ์ของตัวตรวจจับด้วยไฟล์ที่บันทึกและส่งคืนโดย langSubset()
ตรวจสอบภาษาที่ใช้ได้ด้านล่าง
// ยอมรับรหัส ISO 639-1 เสมอ รวมถึงรูปแบบเอาต์พุตที่เลือกหากแตกต่าง // langSubset(ภาษา: [], บันทึก: true, เข้ารหัส: true); จะส่งกลับชื่อไฟล์ย่อยถ้า Saved$eld->langSubset(['en', 'es', 'fr', 'it', 'nl', 'de']);// Object ( Success => bool, languages => ?array, error => ?string, file => ?string )// ( Success => true, languages => ['en', 'es'...], error => NULL, file => ' small_6_mfss...' )// เพื่อลบ subset$eld->langSubset();// วิธีที่ดีที่สุดและเร็วที่สุดในการใช้ subset คือการโหลดมันเหมือนกับ defaultdatabase$eld_subset = new NitotmEldLanguageDetector('small_6_mfss5z1t' );
// หากเปิดใช้งานTextCleanup(True), ตรวจพบ() จะลบ URL, โดเมน .com, อีเมล, ตัวอักษรและตัวเลข...// ไม่แนะนำ เนื่องจาก URL และโดเมนมีคำแนะนำของภาษา ซึ่งอาจช่วยให้ความแม่นยำ$eld->enableTextCleanup(true ); // ค่าเริ่มต้นคือเท็จ// หากจำเป็น เราสามารถรับข้อมูลของอินสแตนซ์ ELD ได้: ภาษา, ประเภทฐานข้อมูล, ฯลฯ.$eld->info();
ฉันเปรียบเทียบ ELD กับเครื่องมือตรวจจับต่างๆ เนื่องจาก PHP มีไม่มากนัก
URL | เวอร์ชัน | ภาษา |
---|---|---|
https://github.com/nitotm/efficient-Language-detector/ | 3.0.0 | PHP |
https://github.com/pemistahl/lingua-py | 2.0.2 | หลาม |
https://github.com/facebookresearch/fastText | 0.9.2 | ซี++ |
https://github.com/CLD2Owners/cld2 | 21 ส.ค. 2558 | ซี++ |
https://github.com/patrickschur/ language-detection | 5.3.0 | PHP |
https://github.com/wooorm/franc | 7.2.0 | จาวาสคริปต์ |
เกณฑ์มาตรฐาน:
Tatoeba : 20MB ประโยคสั้น ๆ จาก Tatoeba ผู้แข่งขันทั้งหมดรองรับ 50 ภาษา สูงสุดครั้งละ 10,000 บรรทัด
สำหรับ Tatoeba ฉันจำกัดตัวตรวจจับทั้งหมดไว้ที่ชุดย่อย 50 ภาษา ทำให้การเปรียบเทียบยุติธรรมที่สุดเท่าที่จะเป็นไปได้
นอกจากนี้ Tatoeba ไม่ได้เป็นส่วนหนึ่งของชุดข้อมูลการฝึกอบรม ELD (หรือการปรับแต่ง) แต่มีไว้สำหรับ ข้อความด่วน
การทดสอบ ELD : 10MB ประโยคจาก 60 ภาษาที่ ELD รองรับ แต่ละประโยคมี 1,000 บรรทัด แยกมาจากข้อมูลการฝึกอบรม ELD ขนาด 60GB
ประโยค : 8MB ประโยคจากเกณฑ์มาตรฐาน Lingua ลบภาษาที่ไม่รองรับและภาษาโยรูบาซึ่งมีอักขระที่ใช้งานไม่ได้
คู่คำ 1.5MB และ คำเดี่ยว 870KB จาก Lingua เหมือนกัน 53 ภาษา
Lingua เข้าร่วม 54 ภาษา, ฟรัง ก์ 58 ภาษา, patrickschur 54 ภาษา
fasttext ไม่มีตัวเลือกเซ็ตย่อยในตัว ดังนั้นเพื่อแสดงความแม่นยำและศักยภาพด้านความเร็ว ฉันจึงทำการวัดประสิทธิภาพสองแบบ fasttext ทั้งหมดนี้ไม่ถูกจำกัดด้วยเซ็ตย่อยใดๆ ในการทดสอบใดๆ
* CLD2 ของ Google ไม่มีตัวเลือกชุดย่อย และเป็นการยากที่จะสร้างชุดย่อยแม้ว่าจะมีตัวเลือก bestEffort = True
เนื่องจากโดยปกติแล้วจะส่งคืนเพียงภาษาเดียว ดังนั้นจึงมีข้อเสียเปรียบในเชิงเปรียบเทียบ
เวลาถูกทำให้เป็นมาตรฐาน: (เส้นทั้งหมด * เวลา) / เส้นที่ประมวลผล
เล็ก | ปานกลาง | ใหญ่ | ขนาดใหญ่พิเศษ | |
---|---|---|---|---|
ข้อดี | หน่วยความจำต่ำสุด | ปรับสมดุลแล้ว | เร็วที่สุด | แม่นยำที่สุด |
ข้อเสีย | แม่นยำน้อยที่สุด | ช้าที่สุด (แต่เร็ว) | หน่วยความจำสูง | หน่วยความจำสูงสุด |
ขนาดไฟล์ | 3 ลบ | 10 เมกะไบต์ | 32 เมกะไบต์ | 71 เมกะไบต์ |
การใช้หน่วยความจำ | 76 เมกะไบต์ | 280 เมกะไบต์ | 977 เมกะไบต์ | 2083 ลบ |
การใช้หน่วยความจำแคช | 0.4 MB + OP | 0.4 MB + OP | 0.4 MB + OP | 0.4 MB + OP |
OPcache ใช้หน่วยความจำ | 21 เมกะไบต์ | 69 เมกะไบต์ | 244 เมกะไบต์ | 539 ลบ |
OPcache ใช้ฝึกงาน | 4 เมกะไบต์ | 10 เมกะไบต์ | 45 เมกะไบต์ | 98 เมกะไบต์ |
เวลาในการโหลดไม่แคช | 0.14 วินาที | 0.5 วินาที | 1.5 วินาที | 3.4 วินาที |
เวลาในการโหลดแคช | 0.0002 วินาที | 0.0002 วินาที | 0.0002 วินาที | 0.0002 วินาที |
การตั้งค่า (แนะนำ) | ||||
memory_limit | >= 128 | >= 340 | >= 1,060 | >= 2200 |
opcache.interned... * | >= 8 (16) | >= 16 (32) | >= 60 (70) | >= 116 (128) |
opcache.memory | >= 64 (128) | >= 128 (230) | >= 360 (450) | >= 750 (820) |
* ฉันแนะนำให้ใช้ interned_strings_buffer
ให้มากเกินพอ เนื่องจากข้อผิดพลาด บัฟเฟอร์ล้น อาจทำให้การตอบสนองของเซิร์ฟเวอร์ล่าช้า
หากต้องการใช้ฐานข้อมูล ทั้งหมด opcache.interned_strings_buffer
ควรมีขนาดไม่ต่ำกว่า 160MB (170MB)
เมื่อเลือกจำนวนหน่วยความจำ โปรดจำไว้ว่า opcache.memory_consumption
รวมถึง opcache.interned_strings_buffer
หากหน่วยความจำ OPcache คือ 230MB, interned_strings คือ 32MB และ DB ขนาดกลางแคชไว้ 69MB เราจะมี OPcache ทั้งหมด (230 -32 -69) = 129MB สำหรับอย่างอื่นทั้งหมด
นอกจากนี้ หากคุณกำลังจะใช้ชุดย่อยของภาษานอกเหนือจากฐานข้อมูลหลัก หรือหลายชุดย่อย ให้เพิ่ม opcache.memory
ตามลำดับ หากคุณต้องการให้โหลดทันที หากต้องการแคชฐานข้อมูลเริ่มต้นทั้งหมดอย่างสะดวกสบาย คุณต้องตั้งค่าไว้ที่ 1200MB
การติดตั้งผู้แต่งเริ่มต้นอาจไม่รวมไฟล์เหล่านี้ ใช้ --prefer-source
เพื่อรวมไว้
สำหรับสภาพแวดล้อม dev ที่มีผู้แต่ง "autoload-dev" (รูทเท่านั้น) สิ่งต่อไปนี้จะดำเนินการทดสอบ
ใหม่ NitotmEldTestsTestsAutoload();
หรือคุณสามารถรันการทดสอบโดยใช้ไฟล์ต่อไปนี้:
$ php เครื่องตรวจจับภาษาที่มีประสิทธิภาพ/tests/tests.php # อัปเดตเส้นทาง
หากต้องการรันการวัดประสิทธิภาพความแม่นยำ ให้รันไฟล์ benchmark/bench.php
นี่คือ รหัส ISO 639-1 ที่รวม 60 ภาษา บวก 'und'
สำหรับไม่ทราบแน่ชัด
มันเป็นรูปแบบภาษา ELD เริ่มต้น outputFormat: 'ISO639_1'
am, ar, az, เป็น, bg, bn, ca, cs, da, de, el, en, es, et, eu, fa, fi, fr, gu, เขา, สวัสดี, ชั่วโมง, hu, hy, คือ, มัน, ja, ka, kn, ko, ku, lo, lt, lv, ml, mr, ms, nl, ไม่, หรือ, pa, pl, pt, ro, ru, sk, sl, sq, sr, sv, ทา, เต้, th, tl, tr, สหราชอาณาจักร, ของคุณ, vi, โย่, zh
นี่คือ 60 ภาษาที่รองรับสำหรับ Nito-ELD outputFormat: 'FULL_TEXT'
อัมฮาริก, อาหรับ, อาเซอร์ไบจาน (ละติน), เบลารุส, บัลแกเรีย, เบงกาลี, คาตาลัน, เช็ก, เดนมาร์ก, เยอรมัน, กรีก, อังกฤษ, สเปน, เอสโตเนีย, บาสก์, เปอร์เซีย, ฟินแลนด์, ฝรั่งเศส, คุชราต, ฮิบรู, ฮินดี, โครเอเชีย, ฮังการี, อาร์เมเนีย , ไอซ์แลนด์, อิตาลี, ญี่ปุ่น, จอร์เจีย, กันนาดา, เกาหลี, เคิร์ด (อาหรับ), ลาว, ลิทัวเนีย, ลัตเวีย, มาลายาลัม, มราฐี, มาเลย์ (ละติน), ดัตช์, นอร์เวย์, โอริยา, ปัญจาบ, โปแลนด์, โปรตุเกส, โรมาเนีย, รัสเซีย, สโลวัก , สโลวีเนีย, แอลเบเนีย, เซอร์เบีย (ซีริลลิก), สวีเดน, ทมิฬ, เตลูกู, ไทย, ตากาล็อก, ตุรกี, ยูเครน, อูรดู, เวียดนาม, โยรูบา, จีน
รหัส ISO 639-1 พร้อมแท็กชื่อสคริปต์ IETF BCP 47 outputFormat: 'ISO639_1_BCP47'
am, ar, az-Latn, เป็น, bg, bn, ca, cs, da, de, el, en, es, et, eu, fa, fi, fr, gu, เขา, สวัสดี, ชั่วโมง, hu, hy, คือ มัน ja, ka, kn, ko, ku-Arab, lo, lt, lv, ml, mr, ms-Latn, nl, ไม่, หรือ, pa, pl, pt, ro, ru, sk, sl, sq, sr-Cyrl, sv, ta, te, th, tl, tr, uk, ur, vi, yo, zh
รหัส ISO 639-2/T (ซึ่งก็ใช้ได้เช่นกัน 639-3 ) outputFormat: 'ISO639_2T'
ใช้ได้กับ BCP 47 ISO639_2T_BCP47
ด้วย
amh, ara, aze, bel, bul, ben, cat, ces, dan, deu, ell, eng, สปา, est, eus, fas, fin, fra, guj, heb, hin, hrv, hun, hye, isl, ita, jpn, kat, kan, kor, kur, lao, lit, Lava, mal, mar, msa, nld, หรือ, ori, กระทะ, pol, por, รอน, มาตุภูมิ, slk, slv, sqi, srp, swe, tam, tel, tha, tgl, tur, ukr, urd, vie, yor, zho
หากคุณต้องการบริจาคเพื่อการปรับปรุงโอเพ่นซอร์ส จ้างฉันให้แก้ไขแบบส่วนตัว ขอการฝึกอบรมชุดข้อมูลทางเลือก หรือติดต่อฉัน โปรดใช้ลิงก์ต่อไปนี้: https://linktr.ee/nitotm