Terapkan embeddings kata ke seluruh dokumen, untuk mendapatkan vektor fitur

38

Bagaimana cara saya menggunakan kata embedding untuk memetakan dokumen ke vektor fitur, cocok untuk digunakan dengan pembelajaran yang diawasi?

Sebuah embedding kata memetakan setiap kata ke vektor , dimana adalah beberapa nomor yang tidak terlalu besar (misalnya, 500). Kata embeddings yang populer termasuk word2vec dan Glove .wvRdd

Saya ingin menerapkan pembelajaran terawasi untuk mengklasifikasikan dokumen. Saat ini saya memetakan setiap dokumen ke vektor fitur menggunakan representasi bag-of-words, kemudian menerapkan klasifikasi off-the-shelf. Saya ingin mengganti vektor fitur bag-of-words dengan sesuatu yang didasarkan pada embedding kata pra-terlatih yang ada, untuk mengambil keuntungan dari pengetahuan semantik yang terkandung dalam kata embedding. Apakah ada cara standar untuk melakukan itu?

Saya bisa membayangkan beberapa kemungkinan, tetapi saya tidak tahu apakah ada sesuatu yang paling masuk akal. Pendekatan kandidat yang telah saya pertimbangkan:

  • Saya bisa menghitung vektor untuk setiap kata dalam dokumen, dan rata-rata semuanya. Namun, ini sepertinya kehilangan banyak informasi. Misalnya, dengan representasi bag-of-words, jika ada beberapa kata yang sangat relevan dengan tugas klasifikasi dan sebagian besar kata tidak relevan, pengklasifikasi dapat dengan mudah mempelajarinya; jika saya rata-rata vektor untuk semua kata dalam dokumen, classifier tidak memiliki peluang.

  • Menggabungkan vektor untuk semua kata tidak berfungsi, karena tidak mengarah ke vektor fitur ukuran tetap. Juga sepertinya ide yang buruk karena terlalu sensitif terhadap penempatan kata tertentu.

  • Saya dapat menggunakan kata embedding untuk mengelompokkan kosakata dari semua kata ke dalam kumpulan cluster yang tetap, katakanlah, 1000 cluster, di mana saya menggunakan persamaan cosinus pada vektor sebagai ukuran kesamaan kata. Kemudian, alih-alih sekumpulan kata-kata, saya dapat memiliki sekumpulan cluster: vektor fitur yang saya suplai ke pengklasifikasi dapat berupa 1000-vektor, di mana komponen ke- menghitung jumlah kata dalam dokumen yang adalah bagian dari cluster .ii

  • Diberi kata , kata embeddings ini membuat saya menghitung satu set dari 20 kata paling mirip dan skor kesamaan mereka . Saya bisa mengadaptasi vektor fitur bag-of-words-like menggunakan ini. Ketika saya melihat kata , selain menambah elemen yang sesuai dengan kata oleh , saya juga bisa menambah elemen yang sesuai dengan kata dengan , menambah elemen yang sesuai dengan kata dengan , dan seterusnya.ww1,,w20s1,,s20ww1w1s1w2s2

Apakah ada pendekatan khusus yang mungkin bekerja dengan baik untuk klasifikasi dokumen?


Saya tidak mencari paragraf2vec atau doc2vec; mereka memerlukan pelatihan tentang korpus data besar, dan saya tidak punya korpus data besar. Sebagai gantinya, saya ingin menggunakan embedding kata yang sudah ada.

DW
sumber
1
Sudahkah Anda memutuskan metode khusus untuk mewakili dokumen menggunakan embeddings yang sudah dilatih sebelumnya? Mungkin ini bisa membantu sedikit?
turdus-merula
1
@ user115202, rapi! Itu tidak cukup menyelesaikan masalah yang saya miliki, tetapi itu adalah ide yang cerdas yang terdengar layak untuk diketahui - terima kasih telah menunjukkannya! Saya tidak pernah menemukan solusi yang sangat baik untuk masalah ini yang secara signifikan lebih baik daripada hanya menggunakan kata-kata. Mungkin ini bukan keahlian embat kata yang bagus. Terima kasih!
DW
Yang ini juga terkait dengan masalah Anda, mungkin sedikit lebih dari yang sebelumnya: Representasi belajar untuk teks yang sangat singkat menggunakan agregasi embedding kata tertimbang .
turdus-merula
1
Mengapa tidak menggunakan RNN? Dokumen panjang variabel tidak menjadi masalah bagi RNN. wildml.com/2015/09/...
kalu

Jawaban:

23

Salah satu teknik sederhana yang tampaknya bekerja dengan cukup baik untuk teks-teks pendek (misalnya, kalimat atau tweet) adalah menghitung vektor untuk setiap kata dalam dokumen, dan kemudian menggabungkannya menggunakan rata-rata koordinat, min, atau maks.

Berdasarkan hasil dalam satu makalah baru-baru ini, tampaknya menggunakan min dan max bekerja dengan cukup baik. Ini tidak optimal, tetapi sederhana dan sekitar sebagus atau lebih baik dari teknik sederhana lainnya. Secara khusus, jika vektor untuk kata-kata dalam dokumen yang , maka Anda menghitung dan . Di sini kita mengambil minimum koordinat, yaitu minimum adalah vektor sehingga , dan juga untuk maks. Vektor fitur adalah gabungan dari dua vektor ini, jadi kami memperoleh vektor fitur dinv1,v2,,vnRdmin(v1,,vn)max(v1,,vn)uui=min(vi1,,vin)R2d. Saya tidak tahu apakah ini lebih baik atau lebih buruk daripada representasi bag-of-words, tetapi untuk dokumen pendek saya curiga ini mungkin berkinerja lebih baik daripada bag-of-words, dan memungkinkan menggunakan embeddings kata pra-terlatih.

TL; DR: Anehnya, gabungan min dan max bekerja dengan cukup baik.

Referensi:

Representasi belajar untuk teks yang sangat singkat menggunakan agregasi embed kata tertimbang. Cedric De Boom, Steven Van Canneyt, Thomas Demeester, Bart Dhoedt. Pengenalan Pola Surat; arxiv: 1607.00570. abstrak , pdf . Lihat khususnya Tabel 1 dan 2.

Penghargaan: Terima kasih kepada @ user115202 karena telah membawa makalah ini kepada saya.

DW
sumber
4
untuk teks pendek, avg / min / max mungkin berfungsi dengan baik, tetapi bagaimana jika teksnya panjang, seperti artikel berita?
alpukat
1
Bagi siapa saja yang membaca makalah itu dan menjadi sama bingungnya dengan saya: makalah ini tidak fokus pada pendekatan yang disebutkan oleh @DW, mereka hanya menyebutkannya secara singkat di bawah "5.1. Baseline" sebagai pendekatan dasar. Isi makalah ini berfokus pada teknik mereka sendiri, yang melibatkan pelatihan pengklasifikasi menggunakan embeddings, yang jauh lebih kompleks daripada pendekatan yang diuraikan di sini!
Migwell
16

Anda dapat menggunakan doc2vec mirip dengan word2vec dan menggunakan model pra-terlatih dari corpus besar. Kemudian gunakan sesuatu seperti .infer_vector()di gensim untuk membuat vektor dokumen. Pelatihan doc2vec tidak perlu datang dari set pelatihan.

Metode lain adalah dengan menggunakan jaringan RNN, CNN atau umpan maju untuk mengklasifikasikan. Ini secara efektif menggabungkan vektor kata ke dalam vektor dokumen.

Anda juga dapat menggabungkan fitur jarang (kata) dengan fitur padat (kata vektor) untuk saling melengkapi. Jadi matriks fitur Anda akan menjadi gabungan dari matriks kata yang jarang dengan rata-rata vektor kata. https://research.googleblog.com/2016/06/wide-deep-learning-better-together-with.html

Metode lain yang menarik adalah dengan menggunakan algoritma yang mirip dengan word2vec tetapi alih-alih memprediksi kata target, Anda dapat memprediksi label target. Ini secara langsung menyetel vektor kata ke tugas klasifikasi. http://arxiv.org/pdf/1607.01759v2.pdf

Untuk metode ad hoc lainnya, Anda dapat mencoba menimbang kata-kata secara berbeda tergantung pada sintaksis. Misalnya, Anda dapat menimbang kata kerja lebih kuat daripada penentu.

tokestermw
sumber
6

Jika Anda bekerja dengan teks bahasa Inggris dan ingin embedding kata pra-dilatih untuk mulai, maka silakan lihat ini: https://code.google.com/archive/p/word2vec/

Ini adalah versi C asli dari word2vec. Bersamaan dengan rilis ini, mereka juga merilis model yang dilatih pada 100 miliar kata yang diambil dari artikel Google News (lihat subbagian berjudul: "Pra-terlatih vektor kata dan frasa").

Menurut pendapat dan pengalaman saya bekerja pada embeddings kata, untuk klasifikasi dokumen, model seperti doc2vec (dengan CBOW) bekerja jauh lebih baik daripada kantong kata.

Karena, Anda memiliki corpus kecil, saya sarankan, Anda menginisialisasi kata Anda menanamkan matriks oleh embeddings pra-terlatih yang disebutkan di atas. Kemudian latih untuk vektor paragraf dalam kode doc2vec. Jika Anda merasa nyaman dengan python, Anda dapat checkout versi gensimnya, yang sangat mudah untuk dimodifikasi.

Periksa juga makalah ini yang merinci cara kerja bagian dalam word2vec / doc2vec: http://arxiv.org/abs/1411.2738 . Ini akan membuat memahami kode gensim sangat mudah.

Petualang
sumber
1
Terima kasih atas sarannya. Saya tidak meminta kata embedding; Saya sudah tahu cara mendapatkan embedding kata pra-terlatih (saya sebutkan word2vec dalam pertanyaan saya). Pertanyaan saya adalah bagaimana membuat vektor fitur dari penyisipan kata yang sudah dilatih sebelumnya. Saya menghargai referensi ke doc2vec, tapi corpus saya cukup kecil dan saya curiga / takut bahwa mencoba untuk melatih kode doc2vec akan berpakaian berlebihan dan berkinerja buruk (bahkan jika saya menginisialisasi matriks dengan embeddings pra-terlatih).
DW