
Tugasnya sederhana: ini memberi tahu Anda bahasa mana beberapa teks ditulis. Ini sangat berguna sebagai langkah preprocessing untuk data linguistik dalam aplikasi pemrosesan bahasa alami seperti klasifikasi teks dan pemeriksaan ejaan. Kasus penggunaan lainnya, misalnya, mungkin termasuk routing email ke departemen layanan pelanggan yang berlokasi geografis secara geografis, berdasarkan bahasa email.
Deteksi bahasa sering dilakukan sebagai bagian dari kerangka pembelajaran mesin besar atau aplikasi pemrosesan bahasa alami. Dalam kasus di mana Anda tidak memerlukan fungsionalitas penuh dari sistem tersebut atau tidak ingin mempelajari tali itu, perpustakaan fleksibel kecil berguna.
Sejauh ini, satu -satunya perpustakaan open source komprehensif lainnya di ekosistem GO untuk tugas ini adalah Whatlanggo . Sayangnya, ia memiliki dua kelemahan utama:
Lingua bertujuan untuk menghilangkan masalah ini. Dia hampir tidak memerlukan konfigurasi dan menghasilkan hasil yang cukup akurat pada teks panjang dan pendek, bahkan pada satu kata dan frasa. Dia mengacu pada metode berbasis aturan dan statistik tetapi tidak menggunakan kamus kata. Dia juga tidak membutuhkan koneksi ke API eksternal atau layanan. Setelah perpustakaan diunduh, itu dapat digunakan sepenuhnya offline.
Dibandingkan dengan perpustakaan deteksi bahasa lainnya, fokus Lingua adalah pada kualitas lebih dari kuantitas , yaitu mendapatkan deteksi yang tepat untuk serangkaian kecil bahasa terlebih dahulu sebelum menambahkan yang baru. Saat ini, 75 bahasa berikut didukung:
Lingua dapat melaporkan statistik akurasi untuk beberapa data uji yang dibundel yang tersedia untuk setiap bahasa yang didukung. Data uji untuk setiap bahasa dibagi menjadi tiga bagian:
Baik model bahasa dan data uji telah dibuat dari dokumen terpisah dari Wortschatz Corpora yang ditawarkan oleh Leipzig University, Jerman. Data yang dirangkak dari berbagai situs web berita telah digunakan untuk pelatihan, setiap korpus yang terdiri dari satu juta kalimat. Untuk pengujian, korpora yang terbuat dari situs web yang dipilih secara sewenang -wenang telah digunakan, masing -masing terdiri dari sepuluh ribu kalimat. Dari setiap corpus uji, subset acak yang tidak disortir dari 1000 kata tunggal, 1000 pasangan kata dan 1000 kalimat telah diekstraksi, masing -masing.
Mengingat data uji yang dihasilkan, saya telah membandingkan hasil deteksi Lingua dan Whatlanggo yang menjalankan data 75 bahasa yang didukung Lingua . Selain itu, saya telah menambahkan Google CLD3 ke perbandingan dengan bantuan binding GOCLD3. Bahasa yang tidak didukung oleh CLD3 atau Whatlanggo hanya diabaikan selama proses deteksi.
Masing -masing bagian berikut berisi dua plot. Plot batang menunjukkan hasil akurasi terperinci untuk setiap bahasa yang didukung. Plot kotak menggambarkan distribusi nilai akurasi untuk setiap classifier. Kotak -kotak itu sendiri mewakili area yang ada di dalam 50 % data di dalamnya. Di dalam kotak berwarna, garis horizontal menandai median distribusi.
Tabel di bawah ini menunjukkan statistik terperinci untuk setiap bahasa dan classifier termasuk rata -rata, median dan standar deviasi.
| Bahasa | Rata-rata | Kata tunggal | Pasangan kata | Kalimat | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Lingua (mode akurasi tinggi) | Lingua (mode akurasi rendah) | Cld3 | Whatlang | Lingua (mode akurasi tinggi) | Lingua (mode akurasi rendah) | Cld3 | Whatlang | Lingua (mode akurasi tinggi) | Lingua (mode akurasi rendah) | Cld3 | Whatlang | Lingua (mode akurasi tinggi) | Lingua (mode akurasi rendah) | Cld3 | Whatlang | |
| Afrikanas | 79 | 64 | 55 | 51 | 58 | 38 | 22 | 21 | 81 | 62 | 46 | 39 | 97 | 93 | 98 | 92 |
| bahasa Albania | 88 | 80 | 55 | - | 69 | 54 | 18 | - | 95 | 86 | 48 | - | 100 | 99 | 98 | - |
| Arab | 98 | 94 | 90 | 89 | 96 | 88 | 79 | 77 | 99 | 96 | 92 | 91 | 100 | 99 | 100 | 99 |
| Armenia | 100 | 100 | 99 | - | 100 | 100 | 100 | - | 100 | 100 | 100 | - | 100 | 100 | 97 | - |
| Azerbaijani | 90 | 82 | 81 | 64 | 77 | 71 | 62 | 45 | 92 | 78 | 82 | 58 | 99 | 96 | 99 | 91 |
| Basque | 84 | 75 | 62 | - | 71 | 56 | 33 | - | 87 | 76 | 62 | - | 93 | 92 | 92 | - |
| Belarusia | 97 | 92 | 84 | 81 | 92 | 80 | 67 | 64 | 99 | 95 | 86 | 80 | 100 | 100 | 100 | 98 |
| Benggala | 100 | 100 | 99 | 100 | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 99 | 100 |
| Bokmal | 58 | 50 | - | 34 | 39 | 27 | - | 15 | 59 | 47 | - | 28 | 77 | 75 | - | 60 |
| Bosnia | 35 | 29 | 33 | - | 29 | 23 | 19 | - | 35 | 29 | 28 | - | 41 | 36 | 52 | - |
| Bulgaria | 87 | 78 | 70 | 61 | 70 | 56 | 45 | 37 | 91 | 81 | 66 | 57 | 99 | 96 | 98 | 89 |
| Catalan | 70 | 58 | 48 | - | 51 | 33 | 19 | - | 74 | 60 | 42 | - | 87 | 82 | 84 | - |
| Cina | 100 | 100 | 92 | 100 | 100 | 100 | 92 | 100 | 100 | 100 | 83 | 100 | 100 | 100 | 100 | 100 |
| Kroasia | 73 | 60 | 42 | 55 | 53 | 36 | 26 | 28 | 74 | 57 | 42 | 44 | 90 | 86 | 58 | 91 |
| Ceko | 80 | 71 | 64 | 50 | 66 | 54 | 39 | 31 | 84 | 72 | 65 | 46 | 91 | 87 | 88 | 71 |
| Denmark | 81 | 70 | 58 | 47 | 61 | 45 | 26 | 24 | 84 | 70 | 54 | 38 | 98 | 95 | 95 | 79 |
| Belanda | 77 | 64 | 58 | 47 | 55 | 36 | 29 | 22 | 81 | 61 | 47 | 36 | 96 | 94 | 97 | 82 |
| Bahasa inggris | 81 | 63 | 54 | 49 | 55 | 29 | 22 | 17 | 89 | 62 | 44 | 35 | 99 | 97 | 97 | 94 |
| Esperanto | 84 | 66 | 57 | 52 | 67 | 44 | 22 | 25 | 85 | 61 | 51 | 45 | 98 | 93 | 98 | 88 |
| Estonia | 92 | 83 | 70 | 61 | 80 | 62 | 41 | 36 | 96 | 88 | 69 | 53 | 100 | 99 | 99 | 94 |
| Finlandia | 96 | 91 | 80 | 71 | 90 | 77 | 58 | 45 | 98 | 95 | 84 | 70 | 100 | 100 | 99 | 98 |
| Perancis | 89 | 77 | 55 | 64 | 74 | 52 | 22 | 37 | 94 | 83 | 49 | 59 | 99 | 98 | 94 | 97 |
| Ganda | 91 | 84 | - | - | 79 | 65 | - | - | 95 | 87 | - | - | 100 | 100 | - | - |
| Georgia | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 96 | 100 |
| Jerman | 89 | 80 | 66 | 65 | 74 | 57 | 40 | 38 | 94 | 84 | 62 | 60 | 100 | 99 | 98 | 97 |
| Orang yunani | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| Gujarati | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| Ibrani | 100 | 100 | - | 90 | 100 | 100 | - | 76 | 100 | 100 | - | 94 | 100 | 100 | - | 99 |
| Hindi | 73 | 33 | 58 | 52 | 61 | 11 | 34 | 27 | 64 | 20 | 45 | 40 | 95 | 67 | 95 | 88 |
| Hongaria | 95 | 90 | 76 | 62 | 87 | 77 | 53 | 37 | 98 | 94 | 76 | 53 | 100 | 100 | 99 | 95 |
| Islandia | 93 | 88 | 71 | - | 83 | 72 | 42 | - | 97 | 92 | 70 | - | 100 | 99 | 99 | - |
| Indonesia | 61 | 47 | 46 | 67 | 39 | 25 | 26 | 39 | 61 | 46 | 45 | 66 | 83 | 71 | 66 | 95 |
| Irlandia | 91 | 85 | 67 | - | 82 | 70 | 42 | - | 94 | 90 | 66 | - | 96 | 95 | 94 | - |
| Italia | 87 | 71 | 62 | 56 | 69 | 42 | 31 | 25 | 92 | 74 | 57 | 47 | 100 | 98 | 98 | 96 |
| Jepang | 100 | 100 | 98 | 99 | 100 | 100 | 97 | 100 | 100 | 100 | 96 | 100 | 100 | 100 | 100 | 97 |
| Kazakh | 92 | 90 | 82 | - | 80 | 78 | 62 | - | 96 | 93 | 83 | - | 99 | 99 | 99 | - |
| Korea | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 100 |
| Latin | 87 | 73 | 62 | - | 72 | 49 | 44 | - | 93 | 76 | 58 | - | 97 | 94 | 83 | - |
| Latvia | 93 | 87 | 75 | 59 | 85 | 75 | 51 | 36 | 97 | 90 | 77 | 54 | 99 | 97 | 98 | 87 |
| Lithuania | 95 | 87 | 72 | 62 | 86 | 76 | 42 | 38 | 98 | 89 | 75 | 56 | 100 | 98 | 99 | 92 |
| Makedonia | 84 | 72 | 60 | 62 | 66 | 52 | 30 | 39 | 86 | 70 | 54 | 55 | 99 | 95 | 97 | 94 |
| Melayu | 31 | 31 | 22 | - | 26 | 22 | 11 | - | 38 | 36 | 22 | - | 28 | 35 | 34 | - |
| Maori | 91 | 82 | 52 | - | 82 | 62 | 22 | - | 92 | 87 | 43 | - | 99 | 98 | 91 | - |
| Marathi | 85 | 39 | 84 | 73 | 74 | 16 | 69 | 52 | 85 | 30 | 84 | 74 | 96 | 72 | 98 | 93 |
| Mongolia | 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 |
| Persia | 90 | 80 | 76 | 70 | 78 | 62 | 57 | 46 | 94 | 80 | 70 | 66 | 100 | 98 | 99 | 99 |
| Polandia | 95 | 90 | 77 | 66 | 85 | 77 | 51 | 45 | 98 | 93 | 80 | 59 | 100 | 99 | 99 | 94 |
| Portugis | 81 | 69 | 53 | 57 | 59 | 42 | 21 | 26 | 85 | 70 | 40 | 48 | 99 | 95 | 97 | 96 |
| Punjabi | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| Rumania | 87 | 72 | 53 | 59 | 69 | 49 | 24 | 34 | 92 | 74 | 48 | 52 | 99 | 94 | 88 | 90 |
| Rusia | 90 | 78 | 71 | 53 | 76 | 59 | 48 | 40 | 95 | 84 | 72 | 52 | 98 | 92 | 93 | 68 |
| Serbia | 88 | 78 | 78 | 57 | 74 | 62 | 63 | 34 | 90 | 80 | 75 | 51 | 99 | 91 | 95 | 86 |
| Shona | 91 | 81 | 76 | 68 | 78 | 56 | 51 | 44 | 96 | 86 | 79 | 65 | 100 | 100 | 99 | 95 |
| Slovakia | 84 | 75 | 63 | - | 64 | 49 | 32 | - | 90 | 78 | 61 | - | 99 | 97 | 96 | - |
| Slovene | 82 | 67 | 63 | 48 | 61 | 39 | 29 | 25 | 87 | 68 | 60 | 38 | 99 | 93 | 99 | 81 |
| Somalia | 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 | - |
| Spanyol | 70 | 56 | 48 | 48 | 44 | 26 | 16 | 19 | 69 | 49 | 32 | 33 | 97 | 94 | 96 | 93 |
| Swahili | 81 | 70 | 57 | - | 60 | 43 | 25 | - | 84 | 68 | 49 | - | 98 | 97 | 98 | - |
| Swedia | 84 | 72 | 61 | 49 | 64 | 46 | 30 | 24 | 88 | 76 | 56 | 40 | 99 | 94 | 96 | 83 |
| Tagalog | 78 | 66 | - | 52 | 52 | 36 | - | 23 | 83 | 67 | - | 43 | 98 | 96 | - | 90 |
| Tamil | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 |
| Telugu | 100 | 100 | 99 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 |
| Thai | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 99 |
| Tsonga | 84 | 72 | - | - | 66 | 46 | - | - | 89 | 73 | - | - | 98 | 97 | - | - |
| Tswana | 84 | 71 | - | - | 65 | 44 | - | - | 88 | 73 | - | - | 99 | 96 | - | - |
| Turki | 94 | 87 | 69 | 54 | 84 | 71 | 41 | 26 | 98 | 91 | 70 | 44 | 100 | 100 | 97 | 92 |
| Ukraina | 92 | 86 | 81 | 72 | 84 | 75 | 62 | 53 | 97 | 92 | 83 | 71 | 95 | 93 | 98 | 93 |
| Urdu | 91 | 80 | 61 | 57 | 80 | 65 | 39 | 31 | 94 | 78 | 53 | 46 | 98 | 96 | 92 | 94 |
| Vietnam | 91 | 87 | 66 | 73 | 79 | 76 | 26 | 36 | 94 | 87 | 74 | 85 | 99 | 98 | 99 | 97 |
| Welsh | 91 | 82 | 69 | - | 78 | 61 | 43 | - | 96 | 87 | 66 | - | 99 | 99 | 98 | - |
| Xhosa | 82 | 69 | 66 | - | 64 | 45 | 40 | - | 85 | 67 | 65 | - | 98 | 94 | 92 | - |
| Yoruba | 74 | 62 | 15 | 22 | 50 | 33 | 5 | 11 | 77 | 61 | 11 | 14 | 96 | 92 | 28 | 41 |
| Zulu | 81 | 70 | 63 | 70 | 62 | 45 | 35 | 44 | 83 | 72 | 63 | 68 | 97 | 94 | 92 | 98 |
| Berarti | 86 | 77 | 69 | 67 | 74 | 61 | 48 | 48 | 89 | 78 | 67 | 63 | 96 | 93 | 93 | 91 |
| Median | 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 |
| Deviasi standar | 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 |
Setiap detektor bahasa menggunakan model n-gram probabilistik yang dilatih pada distribusi karakter dalam beberapa corpus pelatihan. Sebagian besar perpustakaan hanya menggunakan n-gram ukuran 3 (trigram) yang memuaskan untuk mendeteksi bahasa fragmen teks yang lebih panjang yang terdiri dari beberapa kalimat. Namun, untuk frasa pendek atau kata tunggal, trigram tidak cukup. Semakin pendek teks inputnya, semakin sedikit n-gram yang tersedia. Probabilitas yang diperkirakan dari beberapa gram N tersebut tidak dapat diandalkan. Inilah sebabnya mengapa Lingua memanfaatkan N-gram ukuran 1 hingga 5 yang menghasilkan prediksi bahasa yang benar yang jauh lebih akurat.
Perbedaan penting kedua adalah bahwa Lingua tidak hanya menggunakan model statistik seperti itu, tetapi juga mesin berbasis aturan. Mesin ini pertama -tama menentukan alfabet dari teks input dan mencari karakter yang unik dalam satu atau lebih bahasa. Jika tepat satu bahasa dapat dipilih dengan andal dengan cara ini, model statistik tidak diperlukan lagi. Bagaimanapun, mesin berbasis aturan memfilter bahasa yang tidak memenuhi persyaratan teks input. Hanya dengan demikian, pada langkah kedua, model N-gram probabilistik dipertimbangkan. Ini masuk akal karena memuat lebih sedikit model bahasa berarti lebih sedikit konsumsi memori dan kinerja runtime yang lebih baik.
Secara umum, selalu merupakan ide yang baik untuk membatasi serangkaian bahasa untuk dipertimbangkan dalam proses klasifikasi menggunakan metode API masing -masing. Jika Anda tahu sebelumnya bahwa bahasa tertentu tidak pernah terjadi dalam teks input, jangan biarkan itu mengambil bagian dalam proses klasifikasi. Mekanisme penyaringan mesin berbasis aturan cukup baik, namun, penyaringan berdasarkan pengetahuan Anda sendiri tentang teks input selalu lebih disukai.
Jika Anda ingin mereproduksi hasil akurasi di atas, Anda dapat menghasilkan laporan tes sendiri untuk pengklasifikasi dan semua bahasa dengan melakukan:
cd cmd
go run accuracy_reporter.go
Agar GOCLD3 berhasil berjalan, Anda perlu menginstal versi 3.17.3 yang tepat dari buffer protokol Google yang agak disayangkan. Untuk setiap detektor dan bahasa, file laporan tes kemudian ditulis ke dalam /accuracy-reports . Sebagai contoh, berikut adalah output saat ini dari laporan Lingua Jerman:
##### 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 membutuhkan setidaknya GO Versi 1.18.
git clone https://github.com/pemistahl/lingua-go.git
cd lingua-go
go build
Kode sumber disertai dengan rangkaian uji unit yang luas. Untuk menjalankan tes, katakan saja:
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
}Secara default, Lingua mengembalikan bahasa yang paling mungkin untuk teks input yang diberikan. Namun, ada kata -kata tertentu yang dieja sama dalam lebih dari satu bahasa. Kata prolog , misalnya, adalah kata bahasa Inggris dan Prancis yang valid. Lingua akan menghasilkan bahasa Inggris atau Prancis yang mungkin salah dalam konteks yang diberikan. Untuk kasus -kasus seperti itu, dimungkinkan untuk menentukan jarak relatif minimum yang harus dipenuhi oleh logaritmisasi dan diringkas probabilitas untuk setiap bahasa yang mungkin harus dipenuhi. Itu dapat dinyatakan dengan cara berikut:
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
} Ketahuilah bahwa jarak antara probabilitas bahasa tergantung pada panjang teks input. Semakin lama teks input, semakin besar jarak antara bahasa. Jadi, jika Anda ingin mengklasifikasikan frasa teks yang sangat singkat, jangan atur jarak relatif minimum terlalu tinggi. Jika tidak, Unknown akan dikembalikan sebagian besar waktu seperti pada contoh di atas. Ini adalah nilai pengembalian untuk kasus di mana deteksi bahasa tidak dapat diandalkan. Nilai ini tidak dimaksudkan untuk dimasukkan dalam set bahasa input saat membangun detektor bahasa. Jika Anda memasukkannya, itu akan secara otomatis dihapus dari set bahasa input.
Mengetahui tentang bahasa yang paling mungkin bagus tetapi seberapa andal kemungkinan yang dihitung? Dan seberapa kecil bahasa yang diperiksa lainnya dibandingkan dengan yang paling mungkin? Pertanyaan -pertanyaan ini juga dapat dijawab:
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
} Dalam contoh di atas, sepotong ConfidenceValue dikembalikan berisi semua bahasa yang mungkin diurutkan berdasarkan nilai kepercayaan diri mereka dalam urutan menurun. Setiap nilai adalah probabilitas antara 0,0 dan 1.0. Probabilitas semua bahasa akan berjumlah 1.0. Jika bahasa secara jelas diidentifikasi oleh mesin aturan, nilai 1.0 akan selalu dikembalikan untuk bahasa ini. Bahasa lain akan menerima nilai 0,0.
Ada juga metode untuk mengembalikan nilai kepercayaan hanya untuk satu bahasa tertentu:
confidence := detector . ComputeLanguageConfidence ( "languages are awesome" , lingua . French )
fmt . Printf ( "%.2f" , confidence )
// Output:
// 0.04Nilai yang dihitung metode ini adalah angka antara 0,0 dan 1.0. Jika bahasa secara jelas diidentifikasi oleh mesin aturan, nilai 1.0 akan selalu dikembalikan. Jika bahasa yang diberikan tidak didukung oleh instance detektor ini, nilai 0,0 akan selalu dikembalikan.
Secara default, Lingua menggunakan pemuatan malas untuk memuat hanya model bahasa sesuai permintaan yang dianggap relevan oleh mesin filter berbasis aturan. Untuk layanan web, misalnya, agak bermanfaat untuk memuat semua model bahasa ke dalam memori untuk menghindari latensi yang tidak terduga sambil menunggu respons layanan. Jika Anda ingin mengaktifkan mode pemuatan yang bersemangat, Anda dapat melakukannya seperti ini:
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithPreloadedLanguageModels ().
Build () Berbagai instance dari LanguageDetector berbagi model bahasa yang sama dalam memori yang diakses secara tidak sinkron oleh contoh.
Akurasi deteksi tinggi Lingua datang dengan biaya lebih lambat daripada detektor bahasa lainnya. Model bahasa besar juga mengkonsumsi sejumlah besar memori. Persyaratan ini mungkin tidak layak untuk sistem yang berjalan rendah pada sumber daya. Jika Anda ingin mengklasifikasikan sebagian besar teks panjang atau perlu menyimpan sumber daya, Anda dapat mengaktifkan mode akurasi rendah yang hanya memuat sebagian kecil dari model bahasa ke dalam memori:
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithLowAccuracyMode ().
Build ()Kelemahan dari pendekatan ini adalah bahwa akurasi deteksi untuk teks pendek yang terdiri dari kurang dari 120 karakter akan turun secara signifikan. Namun, akurasi deteksi untuk teks yang lebih dari 120 karakter akan tetap sebagian besar tidak terpengaruh.
Dalam mode akurasi tinggi (default), detektor bahasa mengkonsumsi sekitar 1.800 MB memori jika semua model bahasa dimuat. Dalam mode akurasi rendah, konsumsi memori dikurangi menjadi sekitar 110 MB. Tujuannya adalah untuk lebih mengurangi konsumsi memori dalam rilis selanjutnya.
Alternatif untuk jejak memori yang lebih kecil dan kinerja yang lebih cepat adalah mengurangi serangkaian bahasa saat membangun detektor bahasa. Dalam kebanyakan kasus, tidak disarankan untuk membangun detektor dari semua bahasa yang didukung. Ketika Anda memiliki pengetahuan tentang teks yang ingin Anda klasifikasi, Anda hampir selalu dapat mengesampingkan bahasa tertentu sebagai hal yang mustahil atau tidak mungkin terjadi.
Berbeda dengan sebagian besar detektor bahasa lainnya, Lingua mampu mendeteksi beberapa bahasa dalam teks bahasa campuran. Fitur ini dapat menghasilkan hasil yang cukup masuk akal tetapi masih dalam keadaan eksperimental dan oleh karena itu hasil deteksi sangat tergantung pada teks input. Ini bekerja paling baik dalam mode akurasi tinggi dengan beberapa kata panjang untuk setiap bahasa. Semakin pendek frasa dan kata -katanya, semakin tidak akurat hasilnya. Mengurangi serangkaian bahasa ketika membangun detektor bahasa juga dapat meningkatkan akurasi untuk tugas ini jika bahasa yang terjadi dalam teks sama dengan bahasa yang didukung oleh instance detektor bahasa masing -masing.
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.'
} Dalam contoh di atas, sepotong DetectionResult dikembalikan. Setiap entri dalam irisan menggambarkan bagian teks bahasa tunggal yang berdekatan, memberikan indeks awal dan akhir dari masing-masing substring.
Mungkin ada tugas klasifikasi di mana Anda tahu sebelumnya bahwa data bahasa Anda jelas tidak ditulis dalam bahasa Latin, misalnya. Akurasi deteksi dapat menjadi lebih baik dalam kasus seperti itu jika Anda mengecualikan bahasa tertentu dari proses keputusan atau hanya secara eksplisit memasukkan bahasa yang relevan:
// 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 )Lihatlah masalah yang direncanakan.
Kontribusi apa pun untuk Lingua sangat dihargai. Harap baca instruksi di CONTRIBUTING.md untuk cara menambahkan bahasa baru ke perpustakaan.