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