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.
sumber
Jawaban:
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.
sumber
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)
sumber