Laman Utama : https://fasttext.cc/
Klasifikasi teks
Klasifikasi teks adalah masalah inti pada banyak aplikasi, seperti deteksi spam, analisis sentimen, atau balasan cerdas. Dalam tutorial ini, kami menjelaskan cara membuat pengklasifikasi teks dengan alat fastText.
Apa itu klasifikasi teks?
Tujuan klasifikasi teks adalah untuk menetapkan dokumen (seperti email, postingan, pesan teks, ulasan produk, dll…) ke satu atau beberapa kategori. Kategori tersebut dapat berupa skor ulasan, spam vs non-spam, atau bahasa yang digunakan untuk mengetik dokumen. Saat ini, pendekatan dominan untuk membangun pengklasifikasi tersebut adalah pembelajaran mesin, yaitu mempelajari aturan klasifikasi dari contoh. Untuk membuat pengklasifikasi seperti itu, kita memerlukan data berlabel, yang terdiri dari dokumen dan kategori (atau tag, atau label) yang sesuai.
Sebagai contoh, kami membuat pengklasifikasi yang secara otomatis mengklasifikasikan pertanyaan stackexchange tentang memasak ke dalam salah satu dari beberapa tag yang mungkin, seperti pot, bowlatau baking.
Menginstal fastText
Langkah pertama tutorial ini adalah menginstal dan membangun fastText. Ini hanya membutuhkan kompiler c++ dengan dukungan c++11 yang baik.
Mari kita mulai dengan mengunduh rilis terbaru :
$ wget https://github.com/facebookresearch/fastText/archive/v0.9.2.zip
$ unzip v0.9.2.zip
Pindah ke direktori fastText dan buatlah:
$ cd fastText-0.9.2
# for command line tool :
$ make
# for python bindings :
$ pip install .
Garis komandoular piton
Menjalankan biner tanpa argumen apa pun akan mencetak dokumentasi tingkat tinggi, menunjukkan berbagai kasus penggunaan yang didukung oleh fastText:
>> ./fasttextusage: fasttext <command> <args>The commands supported by fasttext are: supervised train a supervised classifier quantize quantize a model to reduce the memory usage test evaluate a supervised classifier predict predict most likely labels predict-prob predict most likely labels with probabilities skipgram train a skipgram model cbow train a cbow model print-word-vectors print word vectors given a trained model print-sentence-vectors print sentence vectors given a trained model nn query for nearest neighbors analogies query for analogies
Dalam tutorial ini, kami terutama menggunakan sub-perintah supervised, testdan predict, yang berhubungan dengan mempelajari (dan menggunakan) pengklasifikasi teks. Untuk pengenalan fungsi fastText lainnya, silakan lihat tutorial tentang mempelajari vektor kata .
Mendapatkan dan menyiapkan data
Seperti disebutkan dalam pendahuluan, kita memerlukan data berlabel untuk melatih pengklasifikasi terawasi kita. Dalam tutorial ini, kami tertarik untuk membuat pengklasifikasi untuk secara otomatis mengenali topik pertanyaan stackexchange tentang memasak. Mari unduh contoh pertanyaan dari bagian memasak di Stackexchange , dan tag terkaitnya:
>> wget https://dl.fbaipublicfiles.com/fasttext/data/cooking.stackexchange.tar.gz && tar xvzf cooking.stackexchange.tar.gz
>> head cooking.stackexchange.txt
Setiap baris file teks berisi daftar label, diikuti dengan dokumen terkait. Semua label dimulai dengan __label__awalan, yang merupakan cara fastText mengenali apa itu label atau kata. Model tersebut kemudian dilatih untuk memprediksi label yang diberikan pada kata dalam dokumen.
Sebelum melatih pengklasifikasi pertama kita, kita perlu membagi data menjadi pelatihan dan validasi. Kami akan menggunakan set validasi untuk mengevaluasi seberapa bagus pengklasifikasi yang dipelajari pada data baru.
>> wc cooking.stackexchange.txt
15404 169582 1401900 cooking.stackexchange.txt
Kumpulan data lengkap kami berisi 15404 contoh. Mari kita bagi menjadi kumpulan pelatihan yang terdiri dari 12404 contoh dan kumpulan validasi yang terdiri dari 3000 contoh:
>> head -n 12404 cooking.stackexchange.txt > cooking.train
>> tail -n 3000 cooking.stackexchange.txt > cooking.valid
Pengklasifikasi pertama kami
Kami sekarang siap untuk melatih pengklasifikasi pertama kami:Garis komandoular piton
>> ./fasttext supervised -input cooking.train -output model_cookingRead 0M wordsNumber of words: 14598Number of labels: 734Progress: 100.0% words/sec/thread: 75109 lr: 0.000000 loss: 5.708354 eta: 0h0m
Opsi -inputbaris perintah menunjukkan file yang berisi contoh pelatihan, sedangkan opsi -outputmenunjukkan tempat menyimpan model. Di akhir pelatihan, sebuah file model_cooking.bin, yang berisi pengklasifikasi terlatih, dibuat di direktori saat ini.
Sekarang, kita dapat menguji pengklasifikasi kita, dengan:Garis komandoular piton
>> ./fasttext predict model_cooking.bin -
lalu mengetik sebuah kalimat. Mari kita coba dulu kalimatnya:
Loyang mana yang terbaik untuk memanggang roti pisang?
Tag yang diprediksi baking cocok untuk pertanyaan ini. Sekarang mari kita coba contoh kedua:
Mengapa tidak memasukkan pisau ke dalam mesin pencuci piring?
Label yang diprediksi oleh model adalah food-safety, dan ini tidak relevan. Entah bagaimana, model tersebut tampaknya gagal pada contoh sederhana.
Untuk lebih memahami kualitasnya, mari kita uji pada data validasi dengan menjalankan:Garis komandoular piton
>> ./fasttext test model_cooking.bin cooking.validN 3000P@1 0.124R@1 0.0541Number of examples: 3000
Output dari fastText adalah presisi pada satu ( P@1) dan penarikan kembali pada satu ( R@1).
Kita juga dapat menghitung presisi pada angka lima dan mengingat pada angka lima dengan:Garis komandoular piton
>> ./fasttext test model_cooking.bin cooking.valid 5N 3000P@5 0.0668R@5 0.146Number of examples: 3000
Pembaca tingkat lanjut: presisi dan ingatan
Presisinya adalah jumlah label yang benar di antara label yang diprediksi oleh fastText. Penarikan kembali adalah jumlah label yang berhasil diprediksi, di antara seluruh label sebenarnya. Mari kita ambil contoh agar lebih jelas:
Mengapa tidak memasukkan pisau ke dalam mesin pencuci piring?
Di Stack Exchange, kalimat ini diberi label dengan tiga tag: equipment, cleaningdan knives. Lima label teratas yang diprediksi oleh model dapat diperoleh dengan:Garis komandoular piton
>> ./fasttext predict model_cooking.bin - 5
adalah food-safety, baking, equipment, substitutionsdan bread.
Jadi, satu dari lima label yang diprediksi oleh model tersebut benar, sehingga memberikan presisi sebesar 0,20. Dari tiga label sebenarnya, hanya satu yang diprediksi oleh model, sehingga menghasilkan recall sebesar 0,33.
Untuk lebih jelasnya, lihat halaman Wikipedia terkait .
Membuat model menjadi lebih baik
Model yang diperoleh dengan menjalankan fastText dengan argumen default sangat buruk dalam mengklasifikasikan pertanyaan baru. Mari kita coba meningkatkan kinerja dengan mengubah parameter default.
memproses data terlebih dahulu
Melihat data tersebut, kami mengamati bahwa beberapa kata mengandung huruf besar atau tanda baca. Salah satu langkah pertama untuk meningkatkan performa model kami adalah dengan menerapkan beberapa pra-pemrosesan sederhana. Normalisasi kasar dapat diperoleh dengan menggunakan alat baris perintah seperti seddan tr:
>> cat cooking.stackexchange.txt | sed -e "s/\([.\!?,'/()]\)/ \1 /g" | tr "[:upper:]" "[:lower:]" > cooking.preprocessed.txt
>> head -n 12404 cooking.preprocessed.txt > cooking.train
>> tail -n 3000 cooking.preprocessed.txt > cooking.valid
Mari kita latih model baru pada data yang telah diproses sebelumnya:Garis komandoular piton
>> ./fasttext supervised -input cooking.train -output model_cookingRead 0M wordsNumber of words: 9012Number of labels: 734Progress: 100.0% words/sec/thread: 82041 lr: 0.000000 loss: 5.671649 eta: 0h0m>> ./fasttext test model_cooking.bin cooking.validN 3000P@1 0.164R@1 0.0717Number of examples: 3000
Kami mengamati bahwa berkat pra-pemrosesan, kosakata menjadi lebih sedikit (dari 14 ribu kata menjadi 9 ribu). Presisinya juga mulai meningkat sebesar 4%!
lebih banyak zaman dan kecepatan pembelajaran yang lebih besar
Secara default, fastText melihat setiap contoh pelatihan hanya lima kali selama pelatihan, jumlah yang cukup kecil, mengingat set pelatihan kami hanya memiliki 12 ribu contoh pelatihan. Frekuensi setiap contoh terlihat (juga dikenal sebagai jumlah zaman), dapat ditingkatkan menggunakan -epochopsi:Garis komandoular piton
>> ./fasttext supervised -input cooking.train -output model_cooking -epoch 25Read 0M wordsNumber of words: 9012Number of labels: 734Progress: 100.0% words/sec/thread: 77633 lr: 0.000000 loss: 7.147976 eta: 0h0m
Mari kita uji model baru:Garis komandoular piton
>> ./fasttext test model_cooking.bin cooking.validN 3000P@1 0.501R@1 0.218Number of examples: 3000
Ini jauh lebih baik! Cara lain untuk mengubah kecepatan pembelajaran model kita adalah dengan menambah (atau menurunkan) kecepatan pembelajaran algoritme. Hal ini sesuai dengan seberapa banyak model berubah setelah memproses setiap contoh. Kecepatan pembelajaran 0 berarti model tidak berubah sama sekali, sehingga tidak mempelajari apa pun. Nilai kecepatan pemelajaran yang baik berada dalam kisaran tersebut 0.1 - 1.0.Garis komandoular piton
>> ./fasttext supervised -input cooking.train -output model_cooking -lr 1.0Read 0M wordsNumber of words: 9012Number of labels: 734Progress: 100.0% words/sec/thread: 81469 lr: 0.000000 loss: 6.405640 eta: 0h0m>> ./fasttext test model_cooking.bin cooking.validN 3000P@1 0.563R@1 0.245Number of examples: 3000
Bahkan lebih baik! Mari kita coba keduanya bersama-sama:Garis komandoular piton
>> ./fasttext supervised -input cooking.train -output model_cooking -lr 1.0 -epoch 25Read 0M wordsNumber of words: 9012Number of labels: 734Progress: 100.0% words/sec/thread: 76394 lr: 0.000000 loss: 4.350277 eta: 0h0m>> ./fasttext test model_cooking.bin cooking.validN 3000P@1 0.585R@1 0.255Number of examples: 3000
Sekarang mari kita tambahkan beberapa fitur lagi untuk lebih meningkatkan kinerja kita!
kata n-gram
Terakhir, kita dapat meningkatkan performa model dengan menggunakan kata bigram, bukan hanya unigram. Hal ini sangat penting untuk masalah klasifikasi yang mengutamakan urutan kata, seperti analisis sentimen.Garis komandoular piton
>> ./fasttext supervised -input cooking.train -output model_cooking -lr 1.0 -epoch 25 -wordNgrams 2Read 0M wordsNumber of words: 9012Number of labels: 734Progress: 100.0% words/sec/thread: 75366 lr: 0.000000 loss: 3.226064 eta: 0h0m>> ./fasttext test model_cooking.bin cooking.validN 3000P@1 0.599R@1 0.261Number of examples: 3000
Dengan beberapa langkah, kami dapat beralih dari presisi 12,4% menjadi 59,9%. Langkah-langkah penting termasuk:
- memproses data sebelumnya;
- mengubah jumlah zaman (menggunakan opsi
-epoch, rentang standar[5 - 50]) ; - mengubah kecepatan pemelajaran (menggunakan opsi
-lr, rentang standar[0.1 - 1.0]) ; - menggunakan kata n-gram (menggunakan opsi
-wordNgrams, rentang standar[1 - 5]).
Pembaca tingkat lanjut: Apa itu Bigram?
‘Unigram’ mengacu pada satu unit yang tidak terbagi, atau token, biasanya digunakan sebagai masukan ke model. Misalnya unigram bisa berupa kata atau huruf tergantung modelnya. Di fastText, kami bekerja pada tingkat kata dan dengan demikian unigram adalah kata-kata.
Demikian pula, kami menunjukkan dengan ‘bigram’ rangkaian 2 token atau kata yang berurutan. Demikian pula kita sering membicarakan n-gram untuk merujuk pada rangkaian n token yang berurutan.
Misalnya, dalam kalimat ‘Last donut of the night’, unigramnya adalah ‘last’, ‘donut’, ‘of’, ‘the’ dan ‘night’. Bigramnya adalah: ‘Donat terakhir’, ‘donat dari’, ‘dari’ dan ‘malam’.
Bigram sangat menarik karena, untuk sebagian besar kalimat, Anda dapat menyusun ulang urutan kata hanya dengan melihat sekumpulan n-gram.
Mari kita ilustrasikan hal ini dengan latihan sederhana, dengan memperhatikan bigram berikut, coba rekonstruksi kalimat aslinya: ‘all out’, ‘I am’, ‘of bubblegum’, ‘out of’ dan ‘am all’. Adalah umum untuk menyebut sebuah kata sebagai unigram.
Meningkatkan skalanya
Karena kami melatih model kami pada beberapa ribu contoh, pelatihan hanya memerlukan waktu beberapa detik. Namun melatih model pada kumpulan data yang lebih besar, dengan lebih banyak label bisa menjadi terlalu lambat. Solusi potensial untuk mempercepat pelatihan adalah dengan menggunakan softmax hierarki , bukan softmax biasa. Hal ini dapat dilakukan dengan opsi -loss hs:Garis komandoular piton
>> ./fasttext supervised -input cooking.train -output model_cooking -lr 1.0 -epoch 25 -wordNgrams 2 -bucket 200000 -dim 50 -loss hsRead 0M wordsNumber of words: 9012Number of labels: 734Progress: 100.0% words/sec/thread: 2199406 lr: 0.000000 loss: 1.718807 eta: 0h0m
Pelatihan sekarang akan memakan waktu kurang dari satu detik.
Pembaca tingkat lanjut: softmax hierarki
Softmax hierarki adalah fungsi kerugian yang mendekati softmax dengan komputasi yang jauh lebih cepat.
Idenya adalah untuk membangun pohon biner yang daunnya sesuai dengan labelnya. Setiap node perantara memiliki aktivasi keputusan biner (misalnya sigmoid) yang dilatih, dan memprediksi apakah kita harus ke kiri atau ke kanan. Probabilitas unit keluaran kemudian diberikan oleh produk dari probabilitas node perantara di sepanjang jalur dari akar ke kiri unit keluaran.
Untuk penjelasan detailnya bisa dilihat pada video ini .
Di fastText, kami menggunakan pohon Huffman, sehingga waktu pencarian lebih cepat untuk keluaran yang lebih sering sehingga waktu pencarian rata-rata untuk keluaran menjadi optimal.
Klasifikasi multi-label
Saat kita ingin menetapkan suatu dokumen ke beberapa label, kita masih bisa menggunakan softmax loss dan bermain-main dengan parameter prediksi, yaitu jumlah label yang akan diprediksi dan ambang batas probabilitas yang diprediksi. Namun bermain-main dengan argumen ini bisa jadi rumit dan tidak intuitif karena probabilitasnya harus berjumlah 1.
Cara mudah untuk menangani banyak label adalah dengan menggunakan pengklasifikasi biner independen untuk setiap label. Hal ini dapat dilakukan dengan -loss one-vs-allatau -loss ova.Garis komandoular piton
>> ./fasttext supervised -input cooking.train -output model_cooking -lr 0.5 -epoch 25 -wordNgrams 2 -bucket 200000 -dim 50 -loss one-vs-allRead 0M wordsNumber of words: 14543Number of labels: 735Progress: 100.0% words/sec/thread: 72104 lr: 0.000000 loss: 4.340807 ETA: 0h 0m
Sebaiknya turunkan kecepatan pemelajaran dibandingkan dengan fungsi kerugian lainnya.
Sekarang mari kita lihat prediksi kita, kita ingin prediksi sebanyak mungkin (argumen -1) dan kita hanya ingin label dengan probabilitas lebih tinggi atau sama dengan 0.5:Garis komandoular piton
>> ./fasttext predict-prob model_cooking.bin - -1 0.5
lalu ketik kalimatnya:
Loyang mana yang terbaik untuk memanggang roti pisang?
kita mendapatkan:
__label__baking 1.00000 __label__bananas 0.939923 __label__bread 0.592677
Garis komandoular piton
Kami juga dapat mengevaluasi hasil kami dengan testperintah:
>> ./fasttext test model_cooking.bin cooking.valid -1 0.5N 3000P@-1 0.702R@-1 0.2Number of examples: 3000
dan bermain dengan ambang batas untuk mendapatkan metrik presisi/penarikan yang diinginkan:
>> ./fasttext test model_cooking.bin cooking.valid -1 0.1N 3000P@-1 0.591R@-1 0.272Number of examples: 3000
Kesimpulan
Dalam tutorial ini, kami memberikan gambaran singkat tentang cara menggunakan fastText untuk melatih pengklasifikasi teks yang kuat. Kami memiliki ikhtisar singkat tentang beberapa opsi terpenting untuk disesuaikan.