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 potbowlatau 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 supervisedtestdan 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: equipmentcleaningdan knives. Lima label teratas yang diprediksi oleh model dapat diperoleh dengan:Garis komandoular piton

>> ./fasttext predict model_cooking.bin - 5

adalah food-safetybakingequipmentsubstitutionsdan 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.