Natural Language Processing (NLP) sederhana dari Carik Bot

Membuat BOT, sepertinya sudah biasa.
Membuat BOT dengan kemampuan NLP dan AI sepertinya sudah banyak yang bisa juga.

Sebagian ada yang membuat sendiri engine-nya, sebagian lagi ada yang menggunakan vendor-vendor yang sudah ada.
Saya sendiri dulu pernah menggunakan vendor tersebut, baik yang free maupun berbayar.
Pernah terlintas untuk menggunakan engine keren yang sudah ada sebelumnya, yang bahkan sudah ada Machine Learning-nya, seperti TensorFlow misalnya. Sayangnya … … …

Sejak deploy @Carik beberapa waktu lalu, saya cenderung untuk membuat NLP Engine sendiri. Belum terlalu bagus, tapi sudah cukup bisa untuk diimplementasikan.

Memang, sebelum mengembangkan NLP sendiri, saya menggunakan vendor-vendor yang sudah ada, misal seperti API.AI, recast.ai atau WIT.AI.
Dengan latar belakang saya yang BUKAN seorang data scientist, tools ini amat sangat membantu. Apalagi beberapa paket percakapan sudah diakomodir oleh tools ini, tinggal dipilih mana yang akan digunakan.

Hanya saja, paket yang sudah disediakan lebih banyak menggunakan bahasa Inggris. Sedangkan pada saat itu yang saya butuhkan adalah dalam bahasa Indonesia, karena Bot yang saya develop akan menggunakan percakapan dalam bahasa Indonesia. Bisa saja sih menyusun kata-kata sendiri dalam tools tersebut, tapi ternyata membutuhkan waktu yang tidak sebentar, belum lagi kualitas bandwidth yang saya pakai tidak terlalu menyenangkan.

Akhirnya, saya pertimbangkan untuk develop NLP Engine sendiri.
Tentunya saya harus membatasi proses development dengan spesifikasi tertentu, agar development tidak melebar tak tentu arah.
Seperti biasa, spesifikasi umumnya begini:
- simple, cepat
- bisa digunakan di hosting regular (tidak perlu server dgn spesifikasi khusus)
- minimal kebutuhan terhadap database (rdbms)
- instalasi mudah
- cukup untuk tahap awal edukasi
- api

Spesifikasi yang sama seperti halnya saat saya membangun FastPlaz, web framework dalam bahasa Pascal, atau tools-tools yang pernah saya bangun lainnya.

Adalah suatu “keseruan” tersendiri dalam membangun NLP ini, terlebih latar belakang saya yang bukan seorang data scientist, hanya seseorang yang hobinya koding membuat program/aplikasi, khususnya dalam bahasa Pascal (kuno banget yaa pakai bahasa pascal). Banyak istilah yang tidak/belum saya mengerti, dan bahkan saya mungkin tidak mengerti teori dasarnya sama sekali.

Dalam wawasan saya, cari paling termudah adalah dengan mengumpulkan kalimat-kalimat percakapan yang mungkin terjadi. Hanya saja, bisa terbayangkan seberapa besar database untuk menyimpan ribuan bahkan jutaan variasi kalimat ini. 
Hanya untuk sekedar menyapa “halo, apa kabar” saja sudah mungkin akan ada ratusan variasi, belum lagi jika penulisan dengan singkatan, apalagi tambahan kata2 alay. :D
Inipun belum termasuk jika aspek-aspek kedaerahan dimasukkan.

Lalu, apakah saya akan menyimpan ribuan variasi ini? Tentu saja tidak.
Hal mendasar yang paling mudah dalam membandingkan kemungkinan variasi ini adalah pattern. Jika berbicara tentang pattern, saya yakin para temen2 developer akan lebih mudah mencerna maksudnya.

Pengguna tools nlp lain mungkin akan familiar dengan istilah ‘entities’ dan ‘intents’. Di NLP Carik ini, saya menerapkan hal yang kurang lebih sama. Pattern-pattern kalimat disusun dan dialokasikan ke entities dan intents.

Materi pengetahuan tentang entities dan intents akan lebih baik jika anda mencari sendiri di media online yang sudah ada.

Carik NLP Diagram

Contoh pengalokasian entities dan intent di Carik, kurang lebih seperti ini.

entities, intent dan response

Tentunya ada penataan yang sederhana dan bahkan yang rumit. Implementasinya disesuaikan dengan tingkat kesulitan dan variasi percakapan.

OUTPUT

Dari NLP Engine Carik ini, output apa sih yang dihasilkan ?
jawabannya simple: JSON

Gambar-gambar berikut menunjukan hasil output engine ini.

Respon JSON sederhana, tanpa stemming

Perlu diingat juga, engine ini juga mempunyai kemampuan untuk melakukan stemming word terhadap kalimat yang dimasukkan. Responnya terlihat seperti gambar berikut

Respon JSON dengan menambahkan stemming word

Dan berikut adalah respon NLP Carik saat mendapatkan input berupa kalimat “carikan tempat makan di dekat menteng”,
akan seperti ini:

result json NLP Carik

Dari pencapaian ini, saya meyakini bahwa NLP engine ini sudah mencukupi untuk diimplementasikan ke dalam Carik.
Sudah mencukupi untuk sekedar merespon setiap kalimat/pertanyaan/pernyataan yang diajukan oleh pengguna Carik.
Tentunya masih banyak kekurangan dan keterbatasan, dan ini menjadi tantangan bagi saya untuk mengembangkan tools menarik ini.

Ingin tahu source code NLP ini?
silahkan download dari url github ini:
https://github.com/luridarmawan/SimpleAI
jangan lupa untuk ikuti perkembangannya di branch development.

Ingin tahu kemampuan NLP bot Carik dalam mereprentasi input free text?
silahkan coba chat langsung dengan Carik. 
Carik mudah ditemui, dia ada di 
- Telegram https://t.me/carikbot
- Facebook Messenger https://fb.me/carik.bot 
- Line, 
- Skype, dan juga 
- Slack.

Catatan penting,
tools ini masih jauh dari sempurna, masih banyak hal yang harus dibenahi dan bisa dikembangkan.
Jika ada kesalahan dan tulisan dan pemahaman, penulis sangat terbuka untuk menerima masukan.

Selamat mencoba dan Tetap Semangat!