Bagaimana saya bisa mengelompokkan string berdasarkan tema umum?

10

Saya mencoba mengelompokkan, misalnya, string tentang pemrograman dengan string lain tentang pemrograman, string tentang fisika dengan string lain tentang fisika, dll., Untuk berbagai topik. Terlepas dari aspek linguistik teoretis yang menyolok dari masalah, saya mencari untuk benar-benar melakukan ini menggunakan pemrograman / perangkat lunak.

Ikhtisar: Diberikan sejumlah besar string, bagaimana cara mengelompokkan mereka berdasarkan tema semantik?

Aplikasi khusus: Saya punya ~ 200 ribu pertanyaan trivia yang ingin saya kategorikan ke dalam pengelompokan bersama (mobil, komputer, politik, Kanada, makanan, Barack Obama, dll.).

Apa yang saya teliti: Wikipedia memiliki daftar toolkit pemrosesan bahasa alami (dengan asumsi bahwa apa yang saya coba lakukan sebenarnya disebut NLP) jadi saya telah melihat beberapa tetapi tidak ada yang melakukan sesuatu yang mirip dengan kebutuhan saya.

Catatan: Telah ditunjukkan bahwa melakukan hal ini membutuhkan pengetahuan tambahan (mis. Porsche menjadi mobil, C ++ menjadi bahasa pemrograman). Saya berasumsi bahwa data pelatihan diperlukan, tetapi jika saya hanya memiliki daftar pertanyaan dan jawaban, bagaimana saya bisa menghasilkan data pelatihan? Lalu bagaimana cara saya menggunakan data pelatihan?

Lebih banyak catatan: Jika pemformatan saat ini dari bantuan Tanya Jawab (meskipun terlihat seperti JSON, pada dasarnya ini adalah file teks mentah):

// row 1: is metadata
// row 2: is a very specific kind of "category"
// row 3: is the question
// row 4: is the answer
{
  15343
  A MUSICAL PASTICHE
  Of classical music's "three B's", he was the one born in Hamburg in 1833
  Johannes Brahms
}

Tetapi sebelum seseorang menunjukkan bahwa sudah ada kategori, perhatikan bahwa ada ~ 200 ribu pertanyaan dan jawaban seperti ini, dan pada dasarnya sebanyak "kategori". Saya mencoba mengelompokkan ini ke dalam kelompok yang lebih luas seperti yang tercantum di atas. Juga, format ini dapat diubah untuk semua pertanyaan dengan sangat mudah, saya melakukannya secara terprogram.

Dan lebih banyak catatan: Saya sebenarnya tidak tahu berapa banyak kategori yang saya perlukan (setidaknya 10-20), karena saya belum membaca semua pertanyaan itu sendiri. Saya mengharapkan sebagian untuk menentukan jumlah hingga entah bagaimana selama kategorisasi. Bagaimanapun, saya selalu dapat secara manual membuat sejumlah kategori.

Whymarrh
sumber
Bagaimana Anda menggunakan wortel? Dari bacaan singkat saya tentang itu, sepertinya ia harus dengan mudah menangani catatan 200 ribu.
Hanya butuh waktu lebih lama dari yang saya kira, dan memaksa saya untuk meningkatkan alokasi memori awal JVM menjadi 1024m, dan memori maks menjadi 2048m. Itu tidak seburuk yang saya katakan.
Anda hanya perlu data pelatihan yang cukup, dan kemudian Anda harus dapat mengklasifikasikan pertanyaan ke dalam kategori ini. Pendekatan yang sepenuhnya otomatis kemungkinan akan mengelompokkan mereka dengan cara lain, misalnya pertanyaan yang mengandung kata "mobil". Anda tidak dapat mempelajari sinonim pada saat yang sama dengan membuat grup.
Memiliki QUIT - Anony-Mousse
Eh, Anda sedang melakukan pemrosesan massal; memberikan JVM sebenarnya bukan masalah. Berapa lama waktu yang diperlukan? Dari mana Anda memuat dokumen? Sumber khusus?
Saya mengambil mungkin 10 menit, tapi saya setuju, pemrosesan massal menurut definisi memakan waktu dan memori intensif. Meskipun seluruh masalah tentang tersedak itu bukan masalah, lebih dari catatan.

Jawaban:

4

Ini adalah masalah yang cukup standar di NLP, dan kata-kata ajaib Google yang Anda cari adalah "pemodelan topik". Meskipun string Anda cukup pendek, Anda mungkin berhasil dengan Alokasi Dirichlet Latent , atau metode serupa. Ada posting blog yang bagus oleh Edwin Chen di sini , yang menjabarkan gagasan umum di balik algoritma. Detail implementasi dicakup dalam catatan ini oleh Yi Wang.

Jika Anda mencari solusi off-the-shelf, saya sarankan mencoba topicmodelspaket untuk R, karena ini menyediakan antarmuka yang cukup bagus untuk LDA dan Model Topik Korelasi yang lebih canggih. Ada juga daftar implementasi yang dikelola oleh David Mimno di sini .

Martin O'Leary
sumber
Terima kasih, posting blog Chen tampaknya tepat pada apa yang saya coba lakukan. Apakah ada kemungkinan Anda telah menggunakan apa yang Anda daftarkan / lakukan ini sebelumnya? Saya dengan alasan yang benar-benar baru di sini dan akan menghargai langkah-langkah apa yang harus saya lakukan (menggunakan salah satu solusi yang tersedia). Bagaimana saya harus memformat "dokumen" saya? Haruskah saya menerapkan ID untuk setiap Q&A agar saya dapat mengidentifikasi dokumen mana di kelompok mana? Bagaimana cara menggunakan data yang dikeluarkan? Seperti yang saya katakan, saya tidak mengerti banyak detailnya.
Whymarrh
Saya telah menggunakan paket R topicmodels cukup sedikit. Saya pasti akan merekomendasikan ini daripada menggulirkan kode Anda sendiri - ada beberapa dokumentasi dengan contoh yang berhasil di cran.r-project.org/web/packages/topicmodels/vignettes/… . Format spesifik dari setiap dokumen tidak terlalu penting, karena semuanya akan direduksi menjadi representasi "kantong kata". Hanya membuang semua teks yang terkait ke dalam satu string.
Martin O'Leary
4

Anda mencoba menyelesaikan dua masalah di sini.

Masalah 1: Kategorikan string pertanyaan dalam kategori yang tepat.

Masalah 2: Buat kategori yang tepat.

Masalah pertama dapat dilakukan oleh apa yang disebut algoritma terawasi, banyak pengklasifikasi dapat memberikan akurasi dan kinerja yang sangat baik. Namun, masalah 2, membuat kategori keluar dari udara tipis (berton-ton data), jauh lebih rumit. Ini adalah masalah yang tidak terawasi, mengingat banyak data, komputer secara otonom memutuskan kategori dengan beberapa kriteria. Idealnya, kriteria dan algoritme ini harus mengatur data Anda menjadi cluster dengan rapi. Ini kemudian dapat diberi label. Namun, karena ini adalah tugas yang jauh lebih sulit, saya akan mengatakan bahwa tidak ada solusi drop-in yang dapat diterima di sini yang akan memberikan hasil yang baik tanpa banyak upaya penyesuaian yang kemungkinan besar akan membutuhkan para ahli.

Jadi, saya khawatir belum ada tombol ajaib di sini. Apa yang dapat Anda lakukan adalah membantu mesin sedikit keluar. Misalnya, Anda dapat memutuskan set kategori. Ketika Anda telah memutuskan kategori, Anda dapat membuat data pelatihan. Dalam pengaturan ini, data pelatihan hanya pertanyaan dan pasangan kategori yang benar.

Semakin banyak data pelatihan semakin baik. Namun, karena tugasnya masih untuk sesuatu secara otomatis, pada awalnya tidak masuk akal untuk melakukan sesuatu secara manual. Sekarang mengapa Anda ingin memiliki data pelatihan? Evaluasi akurasi. Jika Anda menginginkan hasil yang baik, sangat penting bagi Anda untuk dapat melakukan semacam evaluasi tentang seberapa baik pengaturan yang dilakukan. Dan satu-satunya cara lakukan untuk yang agak sistematis adalah dengan secara manual melabeli beberapa questiosn sendiri. Kalau tidak, Anda berada di buta.

Kemudian, beberapa pertanyaan baru muncul. Pertama: Berapa banyak data pelatihan yang saya butuhkan? "Tergantung". Tanpa melihat data atau kategori Anda, saya tidak yakin saya akan menebak; tapi saya bisa mengambil "perkiraan rata-rata" dan mengatakan sekitar 500 pertanyaan. Perhatikan bahwa saya dapat dimatikan dengan urutan besarnya.

Apakah ini benar-benar berarti bahwa Anda harus menandai 500 pertanyaan dengan tangan? Iya dan tidak. Dimungkinkan untuk menggunakan hasil antara dan beberapa kepintaran untuk "bootstrap" pengklasifikasi. Ini masih pekerjaan manual, dan ketika Anda memikirkannya 500 pertanyaan tidak akan butuh waktu lama untuk menandai. Menjadi pintar di sini dapat dengan cepat memberikan hasil yang lebih buruk daripada menjadi rajin.

Ketika Anda memiliki data pelatihan dalam jumlah yang cukup, ambil 75% darinya dan buat classifier menggunakan alat favorit Anda (mis. Yang disebutkan di sini atau yang lainnya). Sekarang, biarkan classifier mencoba memberi label 25% dari data yang ada dan mengukur akurasi yang dihasilkan. Jika hasilnya bagus, maka sampanye pop. Jika tidak maka buat lebih banyak data pelatihan atau coba klasifikasi lain.

TL; DR

Singkatnya, inilah cara saya akan melakukannya.

0) Use a supervised learner.
1) Create a category set yourself. 
2) Label manually about 500 questions
3) Use 75% of those to train a classifier.
4) Check performance.
5) If good then cheers else goto 2.

sumber
Satu pertanyaan kecil: Anda mengatakan "sekitar 500 pertanyaan" untuk data pelatihan dan untuk menandai secara manual, tetapi juga "Saya bisa tidak aktif dengan urutan besarnya", jadi jika saya menggunakan pertanyaan 5k atau 50k sebagai gantinya, apakah saya akan tetap secara manual menandai sebanyak itu?
Permasalahannya adalah; tanpa melihat data Anda atau memiliki gagasan yang sangat jelas tentang semua detail kecil dalam proyek Anda, sulit untuk memberikan perkiraan yang baik. Namun, dan ini penting untuk diingat, jika 500 terlalu rendah, upaya penandaan tidak sia-sia. Anda masih memerlukan pertanyaan yang berlabel secara manual untuk evaluasi. Semakin banyak data evaluasi yang Anda miliki, penilaian yang lebih baik dapat Anda buat.
Dengan satu urutan besarnya yang saya maksud adalah 50-500-5000. Saya tidak berpikir Anda harus mengklasifikasikan 50k. Itu 1/4 dari seluruh korpus Anda! Jika 500 pertanyaan terlalu rendah, dimungkinkan untuk bootstrap classifier. Idenya di sini adalah bahwa Anda melatih classifier pada korpus awal kecil (misalnya 500 Anda) dan kemudian menandai sisanya. Sekarang, Anda dapat menggunakan beberapa case di mana classifier sangat percaya diri untuk melatih ulang classifier baru yang lebih besar.
Hal penting lain yang perlu diingat; kinerja banyak pengklasifikasi tidak linier dalam jumlah data pelatihan, tetapi biasanya akan menjadi kurva seperti sigmoid. Itu berarti lebih dari 500 pertanyaan yang ditandai dapat manfaatnya sama baiknya dengan 5000. Saran saya adalah bekerja dalam langkah-langkah kecil.
Rincian apa yang akan memberikan wawasan tambahan tentang proyek saya? Saya dapat membagikan beberapa contoh pertanyaan untuk menunjukkan pemformatan saya, tetapi saya bersedia menyesuaikan format Tanya Jawab agar sesuai dengan proses kategorisasi. Saya menghargai bantuannya.