Proyek ini awalnya ditujukan untuk kursus AI di Universitas Sofia. Selama pelaksanaannya, saya terkendala waktu dan tidak dapat mengimplementasikan semua ide yang saya miliki, namun saya berencana untuk terus mengerjakannya... dan saya mengambil topik untuk tesis Master saya, menggunakan T5 Transformers untuk menghasilkan pertanyaan- pasangan jawaban beserta pengecohnya . Lihat di repositori Question-Generation-Transformers.
Pendekatan identifikasi kata kunci yang digunakan sebagai target jawaban telah diterima dalam konferensi RANLP2021 - Pembangkit Kandidat Jawaban Kuis dan Penghasil Pertanyaan Sadar Jawaban.
Idenya adalah untuk menghasilkan jawaban pilihan ganda dari teks, dengan membagi masalah kompleks ini menjadi langkah-langkah yang lebih sederhana:
Untuk menghindari konflik dengan paket python dari proyek lain, praktik yang baik adalah membuat lingkungan virtual di mana paket akan diinstal. Jika Anda tidak menginginkannya, Anda dapat melewati perintah selanjutnya dan langsung menginstal file persyaratan.txt.
Buat lingkungan virtual:
python -m venv venv
Masuk ke lingkungan virtual:
jendela:
. .venvScriptsactivate
Linux atau MacOS
source .venvScriptsactivate
Instal ipython di dalam venv:
ipython kernel install --user --name=.venv
Instal lab jupyter di dalam venv:
pip install jupyterlab
pip install -r .requirements.txt
jupyter lab
Sebelum saya melakukan apa pun, saya ingin memahami lebih banyak tentang bagaimana pertanyaan dibuat dan kata-kata apa yang menjadi jawabannya.
Saya menggunakan kumpulan data SQuAD 1.0 yang memiliki sekitar 100.000 pertanyaan yang dihasilkan dari artikel Wikipedia.
Anda dapat membaca tentang wawasan yang saya temukan di buku catatan jupyter Eksplorasi Data .
Asumsi saya adalah bahwa kata-kata dari teks akan menjadi jawaban yang bagus untuk pertanyaan . Yang perlu saya lakukan hanyalah memutuskan kata atau frasa pendek mana yang cukup baik untuk menjadi jawaban.
Saya memutuskan untuk melakukan klasifikasi biner pada setiap kata dari teks. spaCy sangat membantu saya dengan penandaan kata.
Saya cukup perlu membuat seluruh kumpulan data untuk klasifikasi biner. Saya mengekstrak setiap kata tanpa henti dari paragraf setiap pertanyaan di kumpulan data SQuAD dan menambahkan beberapa fitur di dalamnya seperti:
Dan labelnya isAnswer - apakah kata yang diambil dari paragraf tersebut sama dan berada di tempat yang sama dengan jawaban pertanyaan SQuAD.
Beberapa fitur lain seperti skor TF-IDF dan kemiripan kosinus dengan judul akan sangat bagus, tetapi saya tidak punya waktu untuk menambahkannya.
Selain itu, terserah imajinasi kita untuk membuat fitur baru - mungkin di awal, tengah atau akhir kalimat, informasi tentang kata-kata di sekitarnya dan banyak lagi... Meskipun sebelum menambahkan lebih banyak fitur, alangkah baiknya jika memilikinya metrik untuk menilai apakah fitur tersebut akan berguna atau tidak.
Saya menemukan masalah yang mirip dengan pemfilteran spam , di mana pendekatan umum adalah menandai setiap kata dalam email sebagai berasal dari spam atau bukan email spam.
Saya menggunakan algoritma Gaussian Naive Bayes dari scikit-learn untuk mengklasifikasikan setiap kata apakah itu sebuah jawaban.
Hasilnya ternyata sangat bagus - sekilas, algoritme mengklasifikasikan sebagian besar kata sebagai jawaban. Yang tidak cocok sebenarnya tidak layak.
Hal keren tentang Naive Bayes adalah Anda mendapatkan probabilitas untuk setiap kata. Dalam demo saya telah menggunakannya untuk mengurutkan kata-kata dari jawaban yang paling mungkin hingga yang paling kecil kemungkinannya.
Asumsi lain yang saya miliki adalah kalimat jawaban dapat dengan mudah diubah menjadi pertanyaan . Hanya dengan memberi spasi kosong pada posisi jawaban di teks saya mendapatkan pertanyaan "cloze" (kalimat dengan spasi kosong untuk kata yang hilang)
Jawaban: Oksigen
Pertanyaan: _____ adalah unsur kimia dengan lambang O dan nomor atom 8.
Saya memutuskan bahwa tidak ada gunanya mengubah pertanyaan cloze menjadi kalimat yang lebih tampak seperti pertanyaan, tapi saya membayangkan itu bisa dilakukan dengan jaringan saraf seq2seq , mirip dengan cara teks diterjemahkan dari satu bahasa ke bahasa lain.
Bagian itu ternyata sangat bagus.
Untuk setiap jawaban saya menghasilkan kata-kata yang paling mirip menggunakan penyematan kata dan kesamaan kosinus .
Sebagian besar kata-katanya baik-baik saja dan dapat dengan mudah disalahartikan sebagai jawaban yang benar. Namun ada beberapa yang jelas-jelas tidak sesuai.
Karena saya tidak memiliki kumpulan data dengan jawaban yang salah, saya kembali menggunakan pendekatan yang lebih klasik.
Saya menghapus kata-kata yang bukan bagian ucapan yang sama atau nama entitas yang sama dengan jawabannya, dan menambahkan lebih banyak konteks dari pertanyaan tersebut.
Saya ingin mencari kumpulan data dengan jawaban pilihan ganda dan melihat apakah saya dapat membuat model ML untuk menghasilkan jawaban salah yang lebih baik.
Setelah menambahkan proyek Demo, pertanyaan yang dihasilkan tidak benar-benar cocok untuk langsung dimasukkan ke dalam kelas, tetapi juga tidak buruk.
Hal yang keren adalah kesederhanaan dan modularitas pendekatannya, di mana Anda dapat menemukan di mana kinerjanya buruk ( misalnya mengklasifikasikan kata kerja ) dan melakukan perbaikan ke dalamnya.
Memiliki Jaringan Neural yang kompleks ( seperti yang dilakukan semua makalah tentang topik ini ) mungkin akan memberikan hasil yang lebih baik, terutama di zaman yang kita jalani sekarang. Namun hal hebat yang saya temukan tentang pendekatan ini adalah bahwa pendekatan ini seperti pintu gerbang bagi seorang insinyur perangkat lunak , dengan pola pikir rekayasa perangkat lunaknya, untuk terjun ke bidang AI dan melihat hasil yang berarti.
Menurut saya topik ini cukup menarik dan memiliki banyak potensi. Saya mungkin akan terus bekerja di bidang ini.
Saya bahkan mendaftar di Magister Data Mining dan mungkin akan melakukan beberapa proyek serupa. Saya akan menghubungkan apa pun yang berguna di sini.
Saya telah meluangkan lebih banyak waktu untuk menyelesaikan proyek ini, namun saya ingin mengubahnya lebih ke tutorial tentang masuk ke bidang AI sambil memiliki kemampuan untuk memperluasnya dengan mudah dengan fitur-fitur khusus baru.
Pembaruan - 29.12.19: Repositori telah menjadi cukup populer, jadi saya menambahkan buku catatan baru ( Demo.ipynb ) yang menggabungkan semua modul dan menghasilkan pertanyaan untuk teks apa pun. Saya menyusun ulang buku catatan lainnya dan mendokumentasikan kodenya (sedikit lebih baik).
Pembaruan - 09.03.21: Menambahkan file persyaratan.txt dengan instruksi untuk menjalankan lingkungan virtual dan memperbaiki bug a dengan ValueError: operan tidak dapat disiarkan bersama dengan bentuk (230, 121) (83, )
Saya juga sudah mulai mengerjakan tesis Master saya dengan topik serupa yaitu Pembuatan Pertanyaan.
Pembaruan - 27.10.21: Saya telah mengunggah kode untuk tesis Master saya di repositori Question-Generation-Transformers. Saya sangat menganjurkan Anda untuk memeriksanya.
Selain itu pendekatan menggunakan classfier untuk memilih calon jawaban telah diterima sebagai makalah siswa pada konferensi RANLP2021. Kertas di sini.