Detektor bahasa yang efisien ( Nito-ELD atau ELD ) adalah perangkat lunak pendeteksi bahasa alami yang cepat dan akurat, ditulis 100% dalam PHP, dengan kecepatan yang sebanding dengan detektor cepat yang dikompilasi C++, dan akurasi dalam kisaran detektor terbaik hingga saat ini.
Tidak ada ketergantungan, instalasi mudah, yang dibutuhkan hanyalah PHP dengan ekstensi mb .
ELD juga tersedia (versi usang) dalam Javascript dan Python.
Instalasi
Cara menggunakan
Tolok ukur
Basis Data
Pengujian
Bahasa
Perubahan dari ELD v2 ke v3:
deteksi()->bahasa sekarang mengembalikan string
'und'
untuk belum ditentukan, bukanNULL
Basis data tidak kompatibel, dan lebih besar, sedang v2 ≈ v3 kecil
fungsi DynamicLangSubset() dihapus
Fungsi cleanText() sekarang bernama aktifkanTextCleanup()
$ komposer memerlukan nitotm/detektor-bahasa yang efisien
--prefer-dist
akan menghilangkan test/ , misc/ & benchmark/ , atau menggunakan --prefer-source
untuk memasukkan semuanya
Instal nitotm/efficient-language-detector:dev-main
untuk mencoba perubahan terakhir yang tidak stabil
Alternatifnya, mengunduh/mengkloning file dapat berfungsi dengan baik.
(Hanya instalasi DB kecil yang sedang dibangun)
Disarankan untuk menggunakan OPcache, khususnya untuk database yang lebih besar untuk mengurangi waktu muat.
Kita perlu menetapkan opcache.interned_strings_buffer
, opcache.memory_consumption
cukup tinggi untuk setiap database
Nilai yang direkomendasikan dalam tanda kurung. Periksa Database untuk info lebih lanjut.
pengaturan php.ini | Kecil | Sedang | Besar | Ekstra besar |
---|---|---|---|---|
memory_limit | >= 128 | >= 340 | >= 1060 | >= 2200 |
opcache.interned... | >= 8 (16) | >= 16 (32) | >= 60 (70) | >= 116 (128) |
opcache.memory | >= 64 (128) | >= 128 (230) | >= 360 (450) | >= 750 (820) |
detect()
mengharapkan string UTF-8 dan mengembalikan objek dengan properti language
, berisi kode ISO 639-1 (atau format lain yang dipilih), atau 'und'
untuk bahasa yang belum ditentukan.
// require_once 'manual_loader.php'; Untuk memuat ELD tanpa autoloader. Perbarui jalur.gunakan NitotmEld{LanguageDetector, EldDataFile, EldFormat};// LanguageDetector(databaseFile: ?string, outputFormat: ?string)$eld = new LanguageDetector(EldDataFile::SMALL, EldFormat::ISO639_1);// File database: ' kecil', 'sedang', 'besar', 'ekstra besar'. Periksa kebutuhan memori// Format: 'ISO639_1', 'ISO639_2T', 'ISO639_1_BCP47', 'ISO639_2T_BCP47' dan 'FULL_TEXT'// Konstanta tidak wajib, LanguageDetector('small', 'ISO639_1'); juga akan berfungsi$eld->detect('Hola, cómo te llamas?');// objek( bahasa => string, skor() => array, isReliable() => bool )// ( bahasa => 'es', skor() => ['es' => 0,25, 'nl' => 0,05], isReliable() => true )$eld->detect('Hola, cómo te llamas?') ->bahasa;// 'es'
Memanggil langSubset()
satu kali akan menyetel subset. Panggilan pertama memakan waktu lebih lama karena membuat database baru, jika menyimpan file database (default), maka akan dimuat saat berikutnya kita membuat subset yang sama.
Untuk menggunakan subset tanpa overhead tambahan, cara yang tepat adalah dengan membuat instance detektor dengan file yang disimpan dan dikembalikan oleh langSubset()
. Periksa Bahasa yang tersedia di bawah.
// Ia selalu menerima kode ISO 639-1, serta format keluaran yang dipilih jika berbeda.// langSubset(bahasa: [], simpan: true, encode: true); Akan mengembalikan nama file subset jika disimpan$eld->langSubset(['en', 'es', 'fr', 'it', 'nl', 'de']);// Objek ( sukses => bool, bahasa => ?array, error => ?string, file => ?string )// ( sukses => benar, bahasa => ['en', 'es'...], error => NULL, file => ' small_6_mfss...' )// untuk menghapus subset$eld->langSubset();// Cara terbaik dan tercepat untuk menggunakan subset adalah dengan memuatnya seperti database default$eld_subset = new NitotmEldLanguageDetector('small_6_mfss5z1t' );
// jika aktifkanTextCleanup(True), deteksi() menghapus Url, domain .com, email, alfanumerik...// Tidak disarankan, karena url & domain berisi petunjuk bahasa, yang mungkin membantu akurasi$eld->enableTextCleanup(true ); // Defaultnya salah// Jika diperlukan, kita bisa mendapatkan info instance ELD: bahasa, tipe database, dll.$eld->info();
Saya membandingkan ELD dengan berbagai jenis detektor, karena di PHP tidak banyak.
URL | Versi | Bahasa |
---|---|---|
https://github.com/nitotm/efisien-bahasa-detector/ | 3.0.0 | PHP |
https://github.com/pemistahl/lingua-py | 2.0.2 | ular piton |
https://github.com/facebookresearch/fastText | 0.9.2 | C++ |
https://github.com/CLD2Owners/cld2 | 21 Agustus 2015 | C++ |
https://github.com/patrickschur/bahasa-detection | 5.3.0 | PHP |
https://github.com/wooorm/franc | 7.2.0 | skrip java |
Tolok ukur:
Tatoeba : 20MB , kalimat pendek dari Tatoeba, 50 bahasa didukung oleh semua pesaing, masing-masing hingga 10 ribu baris.
Untuk Tatoeba, saya membatasi semua detektor pada subset 50 bahasa, sehingga perbandingannya seadil mungkin.
Selain itu, Tatoeba bukan bagian dari kumpulan data pelatihan ELD (atau penyetelan), tetapi untuk teks cepat
Tes ELD : 10MB , kalimat dari 60 bahasa yang didukung oleh ELD, masing-masing 1000 baris. Diekstrak dari data pelatihan ELD 60 GB.
Kalimat : 8 MB , kalimat dari benchmark Lingua , tanpa bahasa yang tidak didukung dan Yoruba yang karakternya rusak.
Pasangan kata 1,5MB , dan Kata tunggal 870KB , juga dari Lingua, 53 bahasa yang sama.
Lingua berpartisipasi dengan 54 bahasa, Franc dengan 58 bahasa, Patrickschur dengan 54 bahasa.
fasttext tidak memiliki opsi subset bawaan, jadi untuk menunjukkan potensi akurasi dan kecepatannya, saya membuat dua tolok ukur, fasttext-semuanya tidak dibatasi oleh subset apa pun pada pengujian apa pun
* CLD2 Google juga tidak memiliki opsi subset, dan sulit untuk membuat subset bahkan dengan opsinya bestEffort = True
, karena biasanya hanya mengembalikan satu bahasa, sehingga memiliki kelemahan komparatif.
Waktu dinormalisasi: (total baris * waktu) / baris yang diproses
Kecil | Sedang | Besar | Ekstra besar | |
---|---|---|---|---|
Kelebihan | Memori terendah | Diseimbangkan | Tercepat | Paling akurat |
Kontra | Paling tidak akurat | Paling lambat (tapi cepat) | Memori tinggi | Memori tertinggi |
Ukuran berkas | 3 MB | 10 MB | 32 MB | 71 MB |
Penggunaan memori | 76 MB | 280MB | 977 MB | 2083 MB |
Penggunaan memori di-cache | 0,4MB+OP | 0,4MB+OP | 0,4MB+OP | 0,4MB+OP |
OPcache menggunakan memori | 21 MB | 69 MB | 244MB | 539 MB |
OPcache digunakan diinternir | 4 MB | 10 MB | 45 MB | 98 MB |
Waktu muat Tidak di-cache | 0,14 detik | 0,5 detik | 1,5 detik | 3,4 detik |
Waktu muat di-cache | 0,0002 detik | 0,0002 detik | 0,0002 detik | 0,0002 detik |
Pengaturan (Disarankan) | ||||
memory_limit | >= 128 | >= 340 | >= 1060 | >= 2200 |
opcache.interned... * | >= 8 (16) | >= 16 (32) | >= 60 (70) | >= 116 (128) |
opcache.memory | >= 64 (128) | >= 128 (230) | >= 360 (450) | >= 750 (820) |
* Saya sarankan menggunakan lebih dari cukup interned_strings_buffer
karena kesalahan buffer overflow mungkin menunda respons server.
Untuk menggunakan semua database opcache.interned_strings_buffer
harus berukuran minimal 160MB (170MB).
Saat memilih jumlah memori, ingatlah opcache.memory_consumption
menyertakan opcache.interned_strings_buffer
.
Jika memori OPcache adalah 230MB, interned_strings adalah 32MB, dan DB medium adalah 69MB cache, kita memiliki total (230 -32 -69) = 129MB OPcache untuk yang lainnya.
Selain itu, jika Anda akan menggunakan subset bahasa selain database utama, atau beberapa subset, tambah opcache.memory
jika Anda ingin bahasa tersebut dimuat secara instan. Untuk menyimpan cache semua database default dengan nyaman, Anda ingin mengaturnya pada 1200MB.
Penginstalan komposer default mungkin tidak menyertakan file-file ini. Gunakan --prefer-source
untuk memasukkannya.
Untuk lingkungan dev dengan komposer "autoload-dev" (hanya root), berikut ini akan menjalankan pengujian
NitotmEldTestsTestsAutoload();
Atau, Anda juga dapat menjalankan pengujian dengan mengeksekusi file berikut:
$ php pendeteksi bahasa efisien/tests/tests.php # Jalur pembaruan
Untuk menjalankan benchmark akurasi, jalankan file benchmark/bench.php
.
Ini adalah kode ISO 639-1 yang mencakup 60 bahasa. Ditambah 'und'
untuk belum ditentukan
Ini adalah format bahasa ELD default. outputFormat: 'ISO639_1'
saya, ar, az, menjadi, bg, bn, ca, cs, da, de, el, en, es, et, eu, fa, fi, fr, gu, dia, Hai, hr, hu, hy, aku s, itu, ja, ka, kn, ko, ku, lo, lt, lv, ml, Bapak, Nona, nl, tidak, atau, pa, pl, pt, ro, ru, sk, sl, sq, sr, sv, ta, te, th, tl, tr, inggris, ur, vi, yo, zh
Ini adalah 60 bahasa yang didukung untuk Nito-ELD . outputFormat: 'FULL_TEXT'
Amharik, Arab, Azerbaijan (Latin), Belarusia, Bulgaria, Bengali, Katalan, Ceko, Denmark, Jerman, Yunani, Inggris, Spanyol, Estonia, Basque, Persia, Finlandia, Prancis, Gujarati, Ibrani, Hindi, Kroasia, Hongaria, Armenia , Islandia, Italia, Jepang, Georgia, Kannada, Korea, Kurdi (Arab), Laos, Lituania, Latvia, Malayalam, Marathi, Melayu (Latin), Belanda, Norwegia, Oriya, Punjabi, Polandia, Portugis, Rumania, Rusia, Slovakia , Slovenia, Albania, Serbia (Sirilik), Swedia, Tamil, Telugu, Thailand, Tagalog, Turki, Ukraina, Urdu, Vietnam, Yoruba, Cina
Kode ISO 639-1 dengan tag nama skrip IETF BCP 47. outputFormat: 'ISO639_1_BCP47'
saya, ar, az-Latn, jadilah, bg, bn, ca, cs, da, de, el, en, es, et, eu, fa, fi, fr, gu, dia, hai, jam, hu, hy, is, it, ja, ka, kn, ko, ku-Arab, lo, lt, lv, ml, mr, ms-Latn, nl, no, atau, pa, pl, pt, ro, ru, sk, sl, persegi, sr-Cyrl, sv, ta, te, th, tl, tr, inggris, ur, vi, yo, zh
Kode ISO 639-2/T (yang juga valid 639-3 ) outputFormat: 'ISO639_2T'
. Juga tersedia dengan BCP 47 ISO639_2T_BCP47
amh, ara, aze, bel, bul, ben, kucing, ces, dan, deu, ell, ind, spa, est, eus, fas, sirip, fra, guj, Ibr, hin, hrv, hun, hye, isl, ita, jpn, kat, kan, kor, kur, lao, lit, lav, mal, mar, msa, nld, nor, ori, pan, pol, por, ron, rus, slk, slv, sqi, srp, swe, tam, tel, tha, tgl, tur, ukr, urd, vie, yor, zho
Jika Anda ingin berdonasi untuk perbaikan sumber terbuka, pekerjakan saya untuk modifikasi pribadi, minta pelatihan kumpulan data alternatif, atau hubungi saya, silakan gunakan tautan berikut: https://linktr.ee/nitotm