Kami mendefinisikan bahasa pesan dengan sederhana dan akurat


Di YouScan , kami memproses sekitar 100 juta pesan sehari, di mana banyak aturan dan berbagai fungsi pintar diterapkan. Untuk pekerjaan mereka yang benar, perlu untuk menentukan bahasa dengan benar, karena tidak semua fungsi dapat dibuat agnostik sehubungan dengan bahasa. Pada artikel ini, kita akan secara singkat berbicara tentang studi kami tentang masalah ini dan menunjukkan penilaian kualitas pada dataset jaringan sosial. jaringan.


Garis besar artikel


  1. Masalah Definisi Bahasa
  2. Solusi Publik yang Terjangkau
    • Detektor Bahasa Compact 2
    • Teks cepat
  3. Penilaian kualitas
  4. Kesimpulan

1. Masalah definisi bahasa


Definisi bahasa adalah masalah yang agak lama dan banyak yang mencoba menyelesaikannya dalam kerangka multibahasa dari produk mereka. Pendekatan yang lebih lama menggunakan solusi berdasarkan n-gram, ketika jumlah kemunculan n-gram tertentu dipertimbangkan dan berdasarkan ini, "kecepatan" untuk setiap bahasa dihitung, setelah itu bahasa yang paling mungkin dipilih sesuai dengan model kami. Kelemahan utama dari model-model ini adalah bahwa konteksnya sama sekali tidak diperhitungkan, oleh karena itu, definisi bahasa untuk kelompok bahasa yang sama sulit. Tetapi karena kesederhanaan model, kami berakhir dengan kecepatan penentuan tinggi, yang menghemat sumber daya untuk sistem yang sangat dimuat. Pilihan lain, yang lebih modern, adalah solusi pada jaringan saraf berulang. Solusi ini sudah didasarkan tidak hanya pada n-gram, tetapi juga memperhitungkan konteksnya, yang seharusnya memberikan peningkatan kualitas kerja.


Kompleksitas menciptakan solusi Anda sendiri terletak pada pengumpulan data untuk pelatihan dan proses pembelajaran itu sendiri. Solusi yang paling jelas adalah melatih model pada artikel-artikel Wikipedia, karena kita tahu bahasanya dengan pasti dan ada teks-teks terverifikasi berkualitas sangat tinggi yang relatif mudah dikompilasi. Dan untuk melatih model Anda, Anda harus menghabiskan banyak waktu untuk merakit dataset, memprosesnya, dan kemudian memilih arsitektur terbaik. Kemungkinan besar seseorang telah melakukan ini sebelum kita. Di blok berikutnya, kami melihat solusi yang ada.


2. Solusi publik yang tersedia


Detektor Bahasa Compact 2


CLD2 adalah model probabilistik berbasis pembelajaran mesin (Naive Baessian classifier) โ€‹โ€‹yang dapat menentukan 83 bahasa berbeda untuk teks dalam format UTF-8 atau format html / xml. Untuk bahasa campuran, model mengembalikan 3 bahasa teratas, di mana probabilitas dihitung sebagai persentase perkiraan teks dari jumlah total byte. Jika model tidak yakin dengan jawabannya, maka kembalikan tag "unc".


Keakuratan dan kelengkapan model ini berada pada level yang cukup baik, tetapi keunggulan utamanya adalah kecepatan. Pembuatnya mengklaim sekitar 30 kb dalam 1 ms, pada pengujian kami tentang pembungkus Python yang kami terima dari 21 hingga 26 kb dalam 1 ms (70.000-85.000 pesan per detik, ukuran rata-rata adalah 0.8 kb dan median adalah 0.3 kb).


Solusi ini sangat mudah digunakan. Pertama, Anda perlu menginstal pembungkus python atau menggunakan buruh pelabuhan kami .


Untuk membuat perkiraan, cukup impor pycld2 library dan tulis satu baris kode tambahan:


Menentukan bahasa menggunakan cld2
 import pycld2 as cld2 cld2.detect("Bonjour, Habr!") # (True, # 14, # (('FRENCH', 'fr', 92, 1102.0), # ('Unknown', 'un', 0, 0.0), # ('Unknown', 'un', 0, 0.0))) 

Respons detektor adalah tupel tiga elemen:


  • bahasa didefinisikan atau tidak;
  • jumlah karakter;
  • tuple dari tiga bahasa yang paling mungkin, di mana nama lengkapnya lebih dulu,
    yang kedua adalah singkatan menurut ISO 3166 Codes, yang ketiga adalah persentase karakter yang dimiliki bahasa ini, dan yang keempat adalah jumlah byte.

Teks cepat


FastText adalah perpustakaan yang ditulis oleh Facebook untuk pembelajaran dan klasifikasi teks yang efektif. Dalam kerangka kerja proyek ini, Facebook Research menyajikan embeddings untuk 157 bahasa yang menunjukkan hasil mutakhir untuk berbagai tugas, serta model untuk menentukan bahasa dan tugas pengawasan lainnya.


Untuk model definisi bahasa, mereka menggunakan data dari Wikipedia, Tatoeba dan SETimes, dan sebagai penggolong, mereka menggunakan solusi fasttext mereka.


Pengembang penelitian facebook menyediakan dua model:


  • lid.176.bin , yang sedikit lebih cepat dan lebih akurat daripada model kedua, tetapi beratnya 128Mb;
  • lid.176.ftz - versi terkompresi dari model asli.

Untuk menggunakan model ini dalam python, Anda harus menginstal pembungkus python terlebih dahulu untuk fasttext . Mungkin sulit untuk menginstalnya, jadi Anda harus mengikuti instruksi pada github dengan hati-hati atau menggunakan buruh pelabuhan kami . Anda juga perlu mengunduh model dari tautan di atas. Kami akan menggunakan versi asli dalam artikel ini.


Mengklasifikasikan bahasa menggunakan model dari Facebook sedikit lebih rumit, untuk ini kita memerlukan tiga baris kode:


Menentukan bahasa menggunakan model FastText
 from pyfasttext import FastText model = FastText('../model/lid.176.bin') model.predict_proba(["Bonjour, Habr!"], 3) #[[('fr', 0.7602248429835308), # ('en', 0.05550386696556002), # ('ca', 0.04721488914800802)]] 

Model FastText'a memungkinkan memprediksi probabilitas untuk n-bahasa, di mana secara default n = 1, tetapi dalam contoh ini kami telah menyimpulkan hasil untuk 3 bahasa teratas. Untuk model ini, ini sudah merupakan probabilitas umum prediksi bahasa untuk teks, dan bukan jumlah karakter yang dimiliki bahasa tertentu, seperti yang terjadi pada model cld2. Kecepatannya juga cukup tinggi - lebih dari 60.000 pesan per detik.


3. Penilaian kualitas


Kami akan mengevaluasi kualitas algoritma menggunakan data dari jejaring sosial untuk waktu acak yang diambil dari sistem YouScan (sekitar 500 ribu referensi), oleh karena itu, sampel akan memiliki lebih banyak bahasa Rusia dan Inggris, masing-masing 43% dan 32%, masing-masing, Ukraina, Spanyol dan Portugis - tentang 2% dari masing-masing, dari bahasa yang tersisa kurang dari 1%. Untuk target yang benar, kami akan mengambil markup melalui google translate, karena saat ini Google sangat baik dalam mengelola tidak hanya terjemahan, tetapi juga definisi bahasa teks. Tentu saja, markupnya tidak ideal, tetapi dalam banyak kasus itu dapat dipercaya.


Metrik untuk menilai kualitas definisi bahasa adalah akurasi, kelengkapan, dan f1. Mari kita hitung dan ditampilkan di tabel:


Perbandingan kualitas dua algoritma
 with open("../data/lang_data.txt", "r") as f: text_l, cld2_l, ft_l, g_l = [], [], [], [] s = '' for i in f: s += i if ' |end\n' in s: text, cld2, ft, g = s.strip().rsplit(" ||| ", 3) text_l.append(text) cld2_l.append(cld2) ft_l.append(ft) g_l.append(g.replace(" |end", "")) s='' data = pd.DataFrame({"text": text_l, "cld2": cld2_l, "ft": ft_l, "google": g_l}) def lang_summary(lang, col): prec = (data.loc[data[col] == lang, "google"] == data.loc[data[col] == lang, col]).mean() rec = (data.loc[data["google"] == lang, "google"] == data.loc[data["google"] == lang, col]).mean() return round(prec, 3), round(rec, 3), round(2*prec*rec / (prec + rec),3) results = {} for approach in ["cld2", "ft"]: results[approach] = {} for l in data["google"].value_counts().index[:20]: results[approach][l] = lang_summary(l, approach) res = pd.DataFrame.from_dict(results) res["cld2_prec"], res["cld2_rec"], res["cld2_f1"] = res["cld2"].apply(lambda x: [x[0], x[1], x[2]]).str res["ft_prec"], res["ft_rec"], res["ft_f1"] = res["ft"].apply(lambda x: [x[0], x[1], x[2]]).str res.drop(columns=["cld2", "ft"], inplace=True) arrays = [['cld2', 'cld2', 'cld2', 'ft', 'ft', 'ft'], ['precision', 'recall', 'f1_score', 'precision', 'recall', 'f1_score']] tuples = list(zip(*arrays)) res.columns = pd.MultiIndex.from_tuples(tuples, names=["approach", "metrics"]) 

modelcld2ftans
metrikprecrekf1precrekf1precrekf1
ar0,9920,7250,8380,9180,6970,7930,9680,7880,869
az0,950,7520.8390,8880,5470,6770,9140,7870,845
bg0,5290,1360,2170,2860,1780,2190,4080,2140,281
id0,9490.8440,8940,8850,8690,8770,9120,9250,918
es0,9870,6530,7860,7090.8140,7580,8280.8340,831
fr0,9910,7130,8290,530,8030,6380,7130,810,758
id0,7630,5430,6340,4810,4040,4390,6590,6030,63
itu0,9750,4660,6310,5190,7780,6220,6660,7520,706
ja0,9940,8990,9440,6020.8420,7020,8470,9050,875
ka0,9620,9950,9790,9590,9050,9310,9580,9950,976
kk0,9080,6530,7590,8040,5840,6770,8310,7130,767
ko0,9840,8860,9330,940,7040,8050,9660,910,937
ms0,8010,5780,6720,3690,1010,1590,730,5860,65
pt0,9680,7530,8470,8050,7710,7880,8670,8640,865
ru0,9870,8090,8890,9360,9330,9350,9530,9480,95
sr0,0930,1140,1030,1740,1030,130,1060,160,128
th0,9890,9860,9870,9730,9270,950,9790,9860,983
tr0,9610,6390,7680,6070,730,6630,7690,7640,767
uk0,9490,6710,7860,6150,7330,6690,7740,7770,775
uz0,6660,5120,5790,770,1690,2780,6550,5410,592

Hasilnya jelas menunjukkan bahwa pendekatan cld2 memiliki akurasi yang sangat tinggi dalam menentukan bahasa, hanya untuk bahasa yang tidak populer itu jatuh di bawah 90%, dan dalam 90% kasus hasilnya lebih baik daripada fasttext. Dengan kelengkapan yang kurang lebih sama untuk kedua pendekatan, f1 lebih cepat di cld2.
Keunikan dari model cld2 adalah bahwa ia memberikan perkiraan hanya untuk pesan-pesan yang cukup percaya diri, ini menjelaskan akurasi yang tinggi. Model fasttext'a memberikan jawaban untuk sebagian besar pesan, oleh karena itu akurasinya jauh lebih rendah, tetapi aneh bahwa kelengkapannya tidak jauh lebih tinggi, dan dalam setengah kasus lebih rendah. Tetapi jika Anda "memutar" ambang batas untuk model fasttext, maka Anda dapat meningkatkan akurasi.


4. Kesimpulan


Secara umum, kedua model memberikan hasil yang baik dan dapat digunakan untuk memecahkan masalah menentukan bahasa di domain yang berbeda. Keuntungan utama mereka adalah kecepatan tinggi, yang memungkinkan untuk membuat apa yang disebut "ensemble" dan menambahkan preprocessing yang diperlukan untuk meningkatkan kualitas.


Anda dapat menemukan semua kode untuk mereproduksi eksperimen dan menguji pendekatan di atas dalam repositori kami .


Anda juga dapat melihat pengujian solusi ini di artikel lain , yang membandingkan akurasi dan kecepatan dalam 6 bahasa Eropa Barat.

Source: https://habr.com/ru/post/id423569/


All Articles