Klasifikasi dokumen menggunakan jaringan saraf convolutional

11

Saya mencoba menggunakan CNN (jaringan saraf convolutional) untuk mengklasifikasikan dokumen. CNN untuk teks / kalimat pendek telah dipelajari di banyak makalah. Namun, tampaknya tidak ada kertas yang menggunakan CNN untuk teks atau dokumen yang panjang.
Masalah saya adalah bahwa ada terlalu banyak fitur dari suatu dokumen. Dalam dataset saya, setiap dokumen memiliki lebih dari 1000 token / kata. Untuk memberi makan setiap contoh ke CNN, saya mengubah setiap dokumen menjadi matriks dengan menggunakan word2vec atau sarung tangan yang menghasilkan matriks besar. Untuk setiap matriks, tingginya adalah panjang dokumen, dan lebarnya adalah ukuran dari kata embedding vektor. Dataset saya memiliki lebih dari 9000 contoh dan dibutuhkan banyak waktu untuk melatih jaringan (seminggu penuh) yang membuatnya sulit untuk menyempurnakan parameter.
Metode ekstraksi fitur lain adalah dengan menggunakan vektor satu-panas untuk setiap kata, tetapi ini akan membuat matriks yang sangat jarang. Dan tentu saja, metode ini bahkan membutuhkan lebih banyak waktu untuk berlatih daripada metode sebelumnya.
Jadi apakah ada metode yang lebih baik untuk mengekstraksi fitur tanpa membuat matriks input besar?
Dan bagaimana kita harus menangani panjang variabel dokumen? Saat ini, saya menambahkan string khusus untuk membuat dokumen memiliki panjang yang sama, tapi saya pikir itu bukan solusi yang baik.

lenhhoxung
sumber
2
Apakah menggunakan vektorizer TfIdf tampaknya cocok? Mungkin dikombinasikan dengan word2vec hanya menyisakan x kata teratas untuk setiap dokumen?
Diego
Yah, saya tidak tahu apa itu Tfldf. Saya akan memeriksanya untuk melihat apakah itu berfungsi. Terima kasih
lenhhoxung
Saya baru saja memeriksanya dan saya pikir itu tidak membantu saya. Pada dasarnya, kelas pembantu itu menciptakan matriks untuk satu set dokumen. Setiap vektor baris (biner atau wordcount) dalam matriks sesuai dengan dokumen, tetapi untuk CNN, kita membutuhkan matriks untuk setiap dokumen.
lenhhoxung
Intinya adalah hanya menyisakan x kata-kata non-sepele per dokumen yang diberi peringkat oleh TfIdf mereka. Kemudian gunakan pengodean asli Anda untuk membangun matriks dokumen. Tidak yakin apakah ide pendekatan dua langkah ini muncul.
Diego

Jawaban:

8

Anda dapat mengurangi panjang data input Anda dengan merepresentasikan dokumen Anda sebagai serangkaian vektor kalimat dan bukan serangkaian vektor kata yang lebih panjang. Doc2vec adalah salah satu cara untuk melakukan ini (setiap kalimat akan menjadi "dokumen").

Jika Anda tidak ingin menggunakan Doc2vec, salah satu cara untuk membuat vektor kalimat adalah dengan rata-rata vektor kata untuk setiap kalimat, memberi Anda satu vektor dengan lebar yang sama untuk setiap kalimat. Ini mungkin tidak setepat beberapa metode yang tersedia melalui Doc2Vec tapi saya telah menggunakannya dengan cukup sukses untuk pemodelan topik.

Either way begitu Anda memiliki vektor kalimat Anda, berbaris secara berurutan untuk setiap dokumen seperti Anda sudah melakukan untuk vektor kata Anda dan jalankan kemudian melalui model Anda. Karena panjang urutan untuk setiap dokumen lebih pendek, model Anda harus berlatih lebih cepat daripada dengan vektor kata.

Ngomong-ngomong, metode ini bisa bekerja ketika ditingkatkan atau diturunkan untuk memenuhi akurasi dan kebutuhan kecepatan Anda. (mis. jika CNN Anda masih berlatih terlalu lambat dengan vektor kalimat, Anda bisa membuat vektor paragraf sebagai gantinya).

Salah satu cara untuk menangani dokumen dengan panjang yang berbeda adalah melalui padding. Urutan dokumen Anda semua harus sama panjangnya dengan dokumen terpanjang Anda. Jadi, jika dokumen terpanjang Anda adalah 400 kalimat maka semua urutan dokumen akan menjadi 400 vektor. Dokumen yang lebih pendek dari panjang maks akan diisi dengan vektor yang diisi dengan nol.

Andrew
sumber
Ide yang menarik. Saya akan mencobanya :)
lenhhoxung
Bolehkah saya mengajukan pertanyaan? Bagaimana saya bisa berurusan dengan dokumen yang panjangnya sangat berbeda (5 kalimat / dok, 500 kalimat / dok) bahkan saya wakili dalam vektor kalimat? Padding di sini sepertinya aneh ...
stackunderflow
1
Dalam pemrosesan wicara, beberapa orang memesan urutan berdasarkan panjangnya sehingga urutan dengan panjang yang sama akan berada di batch yang sama. Ini mungkin berfungsi untuk urutan teks.
suthee
4

Anda bisa menggunakan embeddings wilayah. Daripada mengonversi "token" individual menjadi vektor, Anda dapat menggunakan strategi untuk mengonversi wilayah teks menjadi vektor. Pendekatan ini digunakan di sini: https://arxiv.org/abs/1504.01255

Jika Anda tidak terbatas pada CNN, Anda dapat menggunakan model perhatian hierarkis seperti ini: https://www.cs.cmu.edu/~diyiy/docs/naacl16.pdf di mana Anda memiliki pipa jenis ini: word vectors (combined into) sentence vectors (combined into) final document vector

Perhatikan bahwa, dengan metode ini, Anda masih harus mengonversi semua vektor kata menjadi embeddings, tetapi tidak semuanya sekaligus.

Untuk menangani dokumen dengan panjang berbeda, bantalan / pemotongan adalah satu-satunya solusi sejauh ini.

Akhirnya, untuk meningkatkan kecepatan, Anda dapat mencoba mengurangi dimensi teks dengan hanya memasukkan bagian-bagian penting (mungkin hanya awal dokumen yang cukup untuk memiliki akurasi klasifikasi yang baik)

pygabriel
sumber
1
Terima kasih atas tautan referensi Anda. Penanaman wilayah ini menarik. Mengenai dokumen berukuran variabel, seperti yang disebutkan dalam artikel ini arxiv.org/ab/1412.1058 (penulis yang sama), kita dapat menggunakan beberapa unit penyatuan bukan padding / cutting.
lenhhoxung