Klasifikasi teks skala besar

18

Saya ingin melakukan klasifikasi pada data teks saya. Saya punya 300 classes, 200 dokumen pelatihan per kelas (jadi 60000 documents in total) dan ini cenderung menghasilkan data dimensi yang sangat tinggi (kita mungkin melihat lebih dari 1 juta dimensi ).

Saya ingin melakukan langkah-langkah berikut dalam pipa (hanya untuk memberi tahu Anda apa persyaratan saya):

  1. Mengubah setiap dokumen menjadi vektor fitur ( tf-idfatau vector space model)
  2. Feature selection( Mutual Informationlebih disukai, atau yang standar lainnya)
  3. Pelatihan classifier ( SVM, Naive Bayes, Logistic Regressionatau Random Forest)
  4. Memprediksi data yang tidak terlihat berdasarkan model classifier yang dilatih.

Jadi pertanyaannya adalah alat / kerangka kerja apa yang saya gunakan untuk menangani data dimensi tinggi seperti itu? Saya mengetahui para tersangka biasa (R, WEKA ...) tetapi sejauh pengetahuan saya (saya mungkin salah) mungkin tidak ada dari mereka yang dapat menangani data sebesar ini. Apakah ada alat rak lain yang bisa saya lihat?

Jika saya harus memparalelkannya, haruskah saya melihat Apache Mahout ? Sepertinya itu mungkin belum cukup memberikan fungsionalitas yang saya butuhkan.

Terima kasih untuk semuanya.


Pembaruan: Saya melihat-lihat situs web ini , mailing list R dan internet secara umum. Tampak bagi saya bahwa masalah berikut dapat muncul dalam situasi saya:

(1) Memproses ulang data saya menggunakan R ( khususnya paket tm ) bisa jadi tidak praktis , karena tmakan sangat lambat.

(2) Karena saya akan perlu menggunakan ansambel paket R (pra-pemrosesan, matriks jarang, pengklasifikasi, dll.) Interoperabilitas antara paket dapat menjadi masalah, dan saya dapat mengeluarkan biaya tambahan dalam mengonversi data dari satu format ke format lainnya. . Misalnya, jika saya melakukan pra-pemrosesan menggunakan tm(atau alat eksternal seperti WEKA) saya perlu mencari cara untuk mengubah data ini menjadi bentuk yang bisa dibaca oleh perpustakaan HPC di R. Dan lagi tidak jelas bagi saya apakah paket classifier akan langsung mengambil data seperti yang disediakan oleh perpustakaan HPC.

Apakah saya di jalur yang benar? Dan yang lebih penting, apakah saya masuk akal?

pengguna721975
sumber
R dapat menangani set data yang jauh lebih besar dari ini, Anda hanya perlu memanfaatkan alat yang tersedia. Tidak ada perbedaan antara apa yang dapat dicapai dalam bahasa atau lingkungan utama apa pun, meskipun Weka dan Mahout ketinggalan dalam hal apa yang tersedia. FWIW, ini adalah ukuran sampel yang cukup kecil, dan dimensi 1M bukan masalah besar, tetapi juga berlebihan secara statistik. Rekomendasi saya adalah R atau Python, karena keduanya gratis & mudah untuk pemula. Matlab tidak gratis, tetapi juga bagus. Ini juga menimbulkan pajak besar ketika Anda menggunakan banyak komputer.
Iterator
1
Poin yang jauh lebih menonjol adalah bahwa Anda memiliki lebih banyak kelas daripada contoh per kelas dan Anda menanamkannya dalam ruang dimensi yang sangat tinggi. Saya tidak yakin Anda akan mendapatkan pemisahan kelas yang sangat baik di sini. Apakah Anda memiliki beberapa hubungan struktural untuk kelas Anda? Jika demikian, mereka beberapa metode ini mungkin berjalan buruk tanpa wawasan itu.
Iterator
1
Anda dapat menggunakan foreachperpustakaan menulis kode paralel dalam R. Ini bekerja sangat baik bersama dengan hutan acak, yang secara inheren mudah diparalelkan.
Zach
2
Beberapa pertanyaan: 1) Apakah Anda tertarik untuk membandingkan semua jenis pendekatan pembelajaran yang Anda sebutkan, atau apakah Anda hanya perlu satu untuk menyelesaikan pekerjaan? 2) Apakah setiap dokumen milik 1, 1 atau lebih, atau 0 atau lebih dari kelas? 3) Apakah Anda secara khusus ingin menggunakan pemilihan fitur untuk beberapa alasan, atau apakah Anda hanya berpikir itu perlu? Saya setuju dengan komentar lain bahwa ini adalah masalah berukuran sedang menurut standar saat ini, dan pengurangan dimensi tidak diperlukan.
DavidDLewis
1
Saya sedang mengerjakan klasifikasi teks yang melibatkan hampir 10.000 topik (mis. Kelas atau kategori atau istilah apa pun yang Anda inginkan). Saat ini saya sedang mengerjakan penyempurnaan sistem klasifikasi teks ini pada skala ini. Saya tidak dapat membagikan teknik saya sendiri karena itu adalah hak milik, tetapi saya memiliki sedikit saran: sangat berhati-hati dalam mengasumsikan bahwa beberapa teknik yang disarankan berskala kecuali jika sudah terbukti melakukannya. Dalam pengalaman saya, sangat sedikit yang melakukannya.

Jawaban:

13

Ini harus dimungkinkan untuk membuatnya berfungsi selama data direpresentasikan sebagai struktur data yang jarang seperti scipy.sparse.csr_matrixmisalnya dalam Python. Saya menulis tutorial untuk mengerjakan data teks . Lebih lanjut dimungkinkan untuk mengurangi penggunaan memori lebih lanjut dengan memanfaatkan trik hashing: sesuaikan untuk menggunakan HashingVectorizeralih - alih CountingVectorizeratau TfidfVectorizer. Ini dijelaskan dalam ekstraksi fitur teks bagian dokumentasi .

Hutan Acak pada umumnya jauh lebih mahal daripada model linier (seperti mesin vektor dukungan linier dan regresi logistik) dan multinomial atau Bernoulli naive Bayes dan untuk sebagian besar masalah klasifikasi teks yang tidak membawa akurasi prediksi yang jauh lebih baik daripada model yang lebih sederhana.

Jika scikit-learning akhirnya tidak dapat mengukur masalah Anda, Vowpal Wabbit akan melakukan (dan mungkin lebih cepat dari sklearn) meskipun tidak menerapkan semua model yang Anda bicarakan.

Diedit pada bulan April 2015 untuk mencerminkan keadaan perpustakaan scikit-learn saat ini dan untuk memperbaiki tautan yang rusak.

ogrisel
sumber
Masalahnya dengan menggunakan teknik reduksi dimensi "non standar" adalah bahwa Anda kemungkinan akan mengalami masalah ketika Anda mencoba untuk menerbitkan karya Anda. Di bidang klasifikasi teks setidaknya, saya tahu pasti bahwa pengulas suka melihat teknik yang umum digunakan (membuatnya lebih mudah untuk membandingkan terhadap teknik klasifikasi yang ada juga).
user721975
Jangan khawatir - @ogrisel tidak menyebutkan sesuatu yang non-standar, setidaknya tidak berkaitan dengan klasifikasi teks yang canggih, meskipun saya belum membaca tutorialnya.
Iterator
+1 Saya pikir Python mungkin cara yang menyenangkan untuk dilakukan. Ada beberapa paket yang sangat baru dalam R untuk penambangan teks, tetapi jika seseorang memiliki lebih banyak komputasi daripada keahlian dan minat statistik, Python akan menjadi rekomendasi saya.
Iterator
@ogrisel: Kudos atas kontribusi yang Anda & orang lain lakukan untuk membaca sekilas. Saya merekomendasikannya kepada banyak orang yang bekerja dengan Python - seluruh desainnya patut dicontoh.
Iterator
Adapun pengurangan dimensi "non standar" (menggunakan proyeksi acak) dan hashing fitur memeriksa trik hashing oleh John Langford dan diskusi ini pada metaoptimize .
ogrisel
10

Gensim untuk Python adalah sihir. Dan karena menggunakan Python, Anda dapat menggunakannya bersamaan dengan saran @ ogrisel.

Jeff
sumber
1

Bukan untuk membunyikan klakson saya sendiri, tetapi saya membuat seri video yang cukup populer tentang analisis teks dengan Rapidminer. Anda bisa melihatnya di sini:

http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html

Anda mungkin dapat menghindari melakukan pemilihan fitur, cukup gunakan classifier yang tidak membuat jutaan * juta matriks dalam memori :)

Regresi logistik akan mencekik banyak dimensi itu. Naif Bayes mengasumsikan dimensi independen, sehingga Anda akan baik-baik saja. SVM tidak tergantung pada jumlah dimensi (tetapi pada jumlah vektor dukungan) sehingga akan baik-baik saja.

300 adalah banyak kelas. Saya akan mulai dengan hanya sedikit dan terus maju.

Neil McGuigan
sumber
Petunjuk dan saran yang bagus. Terima kasih. Bisakah Anda jelaskan apa yang Anda maksud dengan "mulai dengan hanya sedikit dan teruskan"?
user721975
baik, alih-alih 300 kelas (seperti "biola, biola, cello, terompet ..."), Anda dapat mengklasifikasikannya ke jumlah yang lebih kecil seperti "string, brass".
Neil McGuigan
Oke, saya mengerti sekarang.
user721975
1

Pertama, berdasarkan komentar Anda, saya akan memperlakukan ini sebagai 300 masalah klasifikasi biner (ya / tidak). Ada banyak pelajar classifier biner open source yang mudah digunakan, dan ini memungkinkan Anda berdagang waktu untuk memori.

SVM dan regresi logistik mungkin merupakan pendekatan yang paling populer untuk klasifikasi teks. Keduanya dapat dengan mudah menangani dimensi 1000000, karena implementasi modern menggunakan struktur data yang jarang, dan termasuk pengaturan regularisasi yang menghindari overfitting.

Beberapa suite pembelajaran mesin sumber terbuka, termasuk WEKA dan KNIME , termasuk SVM dan regresi logistik. Implementasi mandiri dari SVM termasuk libSVM dan SVMlight . Untuk regresi logistik, saya akan pasang BXRtrain dan BXRclassify , yang saya kembangkan bersama Madigan, Genkin, dan lainnya. BXRclassify dapat membangun indeks dalam memori dari ribuan model regresi logistik dan menerapkannya secara bersamaan.

Sedangkan untuk mengkonversi teks ke bentuk vektor atribut, saya entah bagaimana selalu akhirnya menulis Perl sedikit untuk melakukan itu dari awal. :-) Tapi saya pikir suite pembelajaran mesin yang saya sebutkan termasuk kode tokenization dan vektorisasi. Rute lain adalah menggunakan lebih banyak toolkit bahasa alami seperti LingPipe , meskipun itu mungkin terlalu berat untuk Anda.

DavidDewis
sumber
+1 Komentar bagus. Jika saya melakukan 300 klasifikasi ya / tidak, bagaimana saya memilih data pelatihan negatif untuk suatu kelas? Data positif jelas adalah dokumen milik kelas.
user721975
Komentar lain. SVM / Logistic reg pasti dapat menangani satu juta dimensi, tetapi bagaimana saya bisa menjalankan eksperimen untuk memilih parameter untuk pengklasifikasi ini? Misalnya, pada kumpulan data kecil Anda bisa menjalankan 10 kali lipat validasi silang untuk menentukan parameter, tetapi pendekatan apa yang dilakukan seseorang untuk data sebesar itu sehingga algoritme selesai berjalan dalam waktu yang wajar?
user721975
@ user721975: Untuk diskriminasi tertentu, dokumen positif adalah dokumen dengan label X, dan dokumen negatif adalah semua dokumen lainnya.
DavidDewew
@ user721975: Sulit untuk memberikan saran umum tentang waktu berjalan, karena detailnya sangat bervariasi di antara algoritma dan implementasi. Validasi silang 10 kali lipat mungkin tidak praktis untuk set data Anda: 60000 contoh bukan masalah.
DavidDLewis
1
Set pelatihan yang tidak seimbang tidak selalu menjadi masalah. Tapi sebenarnya saya menyadari ada sesuatu yang saya bingung: karena dokumen dapat menjadi milik 0, 1, atau beberapa kelas, apa maksud Anda dengan memiliki 200 dokumen pelatihan per kelas? Apakah Anda melakukan sesuatu untuk menghapus dokumen dengan 0 kelas atau 2+ kelas? Secara umum, bagaimana Anda menghasilkan set 60000 dokumen ini?
DavidDLewis
1

Sejak Sklearn 0.13 memang ada implementasi dari HashingVectorizer .

EDIT: Ini adalah contoh lengkap aplikasi semacam itu dari sklearn docs

Pada dasarnya, contoh ini menunjukkan bahwa Anda dapat mengklasifikasikan teks pada data yang tidak dapat ditampung dalam memori utama komputer (melainkan pada disk / jaringan / ...).

oDDsKooL
sumber