Cara Membuat Chat Bot Sederhana di Android Part 2

Yudi Setiawan 7 Februari 2017

Cara Membuat Chat Bot Sederhana di Android Part 2

Pengantar

Pada tutorial sebelumnya, kita sudah bisa membuat Chat Layout Sederhana. Bagi Anda yang belum membacanya sangat saya sarankan untuk mengikuti tutorial Cara Membuat Chat Bot Sederhana di Android Part 1. Pada part 2 ini kita fokus ke pembuatan chat bot nya. Untuk masalah layout kan sudah kita bahas di part 1 jadi, untuk part 2 ini saya rasa tidaklah terlalu sulit karena fokusnya hanya mengarah ke logic dari si chat bot nya saja. "Sebenarnya apa itu chat bot?" Kalau menurut penulis, chat bot itu adalah robot sederhana yang tidak berbentuk fisik (virtual) yang sudah di program untuk bisa berkomunikasi dengan penggunanya dengan baik dan bisa membantu atau mempermudah pekerjaan manusia. Itu sih pengertian menurut penulis terkait apa itu chat bot. Kalau Anda mau tahu lebih dalam lagi terkait apa itu chat bot bisa Anda searching sendiri di internet ya.

Chat Bot pada tutorial ini kita menggunakan AIML. "Apa itu AIML?" Berdasarkan dari sumber yang saya dapat dari internet http://www.w3ii.com/en-US/aiml/aiml_introduction.html

AIML Stands for Artificial Intelligence Modelling Language. AIML is XML based markup language meant to create artificial intelligent application to create human interface while keeping the implementation simple to program, easy to understand and highly maintainable.

Pada awalnya, AIML di kembangkan oleh Alicebot free software community dan Dr. Richard S. Wallace selama 5 tahun dari tahun 1995 - 2000. Jadi, kesimpulannya adalah bahwa AIML itu merupakan modelling language yang dibuat dalam bentuk XML Markup untuk membuat Artificial Intelligence atau sering disingkat AI. Dikarenakan, AIML berbentuk seperti XML yang memiliki tag-tag markup maka, pada AIML juga ada beberapa tag markup yang penting untuk digunakan yaitu sebagai berikut:

  1. <aiml>
    Tag <aiml> digunakan untuk mendefinisikan awal dan akhir dari file AIML.
  2. <category>
    Tag <category> digunakan untuk mendefinisikan ilmu pengetahuan yang ditanamkan ke AI dalam bentuk kategori dan dilanjutkan dengan tag <pattern>.
  3. <pattern>
    Tag <pattern> digunakan untuk mendefinisikan karakter, kata, atau kalimat yang di inputkan oleh pengguna kepada si AI.
  4. <template>
    Tag <template> digunakan untuk memberikan balasan atau respon kepada si pengguna terkait dengan pesan yang diterima oleh AI yang didapatkannya dari tag <pattern>.

Selain keempat (4) tag markup tersebut ada beberapa tag lainnya yang ada pada AIML yaitu seperti berikut.

  1. <star>
    Tag ini digunakan untuk mencocokkan semua karakter pada tag <pattern> yang dibuat dalam bentuk karakter *.
  2. <srai>
    Tag <srai> digunakan untuk membuat multiple tag atau lebih tepatnya memanggil tag lain.
  3. <random>
    Tag <random> digunakan untuk membuat proses pengacakan pesan balasan yang akan didapatkan oleh si pengguna. Dalam tag ini harus ada statement list atau tag <list> sehingga ada list atau daftar yang akan dipilih oleh si tag <random>.
  4. <li>
    Tag ini digunakan untuk membuat list dalam file AIML.
  5. <set>
    Tag <set> berfungsi untuk membuat atau meng-set nilai variable dalam file AIML.
  6. <get>
    Tag <get> merupakan kebalikan dari tag <set> yaitu, untuk mendapatkan nilai variable yang ada dalam file AIML.
  7. <that>
    Tag ini berfungsi untuk membuat si AI bisa membahas suatu topik tertentu yang dibahas oleh si pengguna dan si AI memberikan suatu pesan balasan yang sesuai dengan jawaban si pengguna.
  8. <topic>
    Tag <topic> berfungsi untuk membuat si AI bisa membahas suatu topik tertentu lebih dalam lagi sehingga pembahasannya bisa lebih panjang. Dan biasanya tag ini digunakan untuk jawaban pengguna yang memiliki jawaban "yes" atau "no".
  9. <think>
    Tag <think> digunakan untuk membuat si AI bisa menyimpan variable namun, nilai variable tersebut bisa tidak diberitahukan kepada si pengguna.
  10. <condition>
    Tag ini berfungsi untuk membuat fungsi percabangan dari jawaban yang akan diberikan si AI kepada pengguna.

Pembahasan TAG AIML dan Contoh Penggunaannya

Seperti yang sudah saya jelaskan sebelumnya bahwa pada AIML ada 4 tag utama dan 10 tag pendukung jadi, totalnya ada 14 tag dalam AIML. Berikut akan saya jelaskan fungsi detailnya dan contoh penggunaannya dalam sebuah percakapan atau komunikasi dengan pengguna.

1. <aiml>

Tag <aiml> digunakan sebagai penanda bahwa file tersebut adalah file AIML dan tag ini diletakkan di awal dan di akhir statement dalam file AIML. Contoh penggunaannya.

<?xml version="1.0" encoding="utf-8"?>
<aiml>
	<!-- letakkan tag atau statement lainnya di sini -->
</aiml>

2. <category>

Tag <category> digunakan untuk mencocokkan kata atau topik tertentu yang diberikan kepada si AI dalam bentuk kategori dan dilanjutkan dengan tag <pattern>. Contoh penggunaannya.

<?xml version="1.0" encoding="utf-8"?>
<aiml>
	<category>
		<!-- letakkan tag <pattern> di sini -->
	</category>
</aiml>

3. <pattern>

Tag <pattern> digunakan untuk membuat pencocokan kata atau kalimat yang lebih spesifik lagi terhadap inputan si pengguna kepada si AI. Contoh penggunaannya.

<?xml version="1.0" encoding="utf-8"?>
<aiml>
	<category>
		<pattern>
			NAMA LENGKAP KAMU APA
		</pattern>
	</category>
</aiml>

4. <template>

Tag <template> digunakan untuk membuat statement atau pesan balasan yang akan diberikan kepada si pengguna terkait dengan inputan yang diberikannya kepada si AI. Contoh penggunaannya.

<?xml version="1.0" encoding="utf-8"?>
<aiml>
	<category>
		<pattern>NAMA LENGKAP KAMU APA</pattern>
		<template>
			Nama lengkap saya adalah Chatbot Popoyo.
		</template>
	</category>	
</aiml>

5. <star>

Tag <star> digunakan untuk membuat pencocokan karakter, kata atau kalimat yang kemungkinannya itu bisa lebih dari satu statement pada tag <pattern>. Dalam tag <pattern>, tag <star> ini dibuat dalam bentuk *. Atau dengan kata lain lebih tepatnya tag <star> ini seperti fungsi regular expression (regex) dalam bahasa pemrograman dan karakter * dalam statement tag <pattern> bisa digunakan untuk pencocokan atau match untuk seluruh karakter atau kalau dalam regex di Java ini seperti karakter . yang fungsinya untuk pencocokan seluruh karakter. Berikut contoh percakapannya.

User : Saya Yudi nama lengkap kamu apa? Mau buat cover makalah tugas kelompok kita nih.

Robot : Hai Yudi. Nama lengkap saya adalah Chatbot Popoyo.

Dan berikut merupakan contoh penerapannya dalam AIML.

<?xml version="1.0" encoding="utf-8"?>
<aiml>
	<category>
		<pattern>SAYA * NAMA LENGKAP KAMU APA</pattern>		
		<template>
			Hai <star />. Nama lengkap saya adalah Chatbot Popoyo.<star />
		</template>
	</category>	
</aiml>

6. <srai>

Tag <srai> digunakan untuk memanggil tag lain dalam file AIML. Berikut contoh percakapannya.

User : Tadi aku lihat di mading kampus kita ada nama dosen baru loh. Namanya Angelica Agnesia. Kayaknya dosen cewek nih. Kamu tahu Angelica Agnesia itu ngajar mata kuliah apa?

Robot : Wah, mantap jiwa nih. Aku kurang tahulah. Mudah-mudahan aja masuk mata kuliah Pemrograman Berorientasi Objek di kelas kita ya.

Itu merupakan contoh sederhana apabila si pengguna memberikan pertanyaan terkait satu kemungkinan saja. Bagaimana bila si pengguna bertanya dengan pertanyaan yang sama seperti diatas namun, nama dosennya berbeda atau kalimat pertanyaannya diganti menjadi "Angelica Agnesia itu dosen apa?". Maka, kita bisa menggunakan perpaduan tag <star> dan tag <srai>. Dengan catatan, bahwa kemungkinan pertanyaannya itu sudah kita tanamkan kepada si AI sehingga apabila nama dosennya itu berbeda maka, si AI bisa memberikan jawaban yang berbeda dan apabila semua kemungkinannya itu tidak kita berikan kepada si AI maka, error pun terjadi. Berikut contoh penerapannya pada AIML apabila kemungkinannya itu cuma 3 nama dosen yang bakalan ditanyakan oleh si pengguna.

<?xml version="1.0" encoding="utf-8"?>
<aiml>
	<category>
		<pattern>ANGELICA AGNESIA DOSEN APA</pattern>
		<template>
			Wah, mantap jiwa nih. Aku kurang tahulah. Mudah-mudah aja masuk mata kuliah Pemrograman Berorientasi Objek di kelas kita ya.
		</template>
	</category>
	<category>
		<pattern>YUDI SETIAWAN DOSEN APA</pattern>
		<template>
			Tahulah. Anak kelas sebelah pernah cerita kalau dia itu dosen mata kuliah pemrograman mobile.
		</template>
	</category>
	<category>
		<pattern>NIA AMELIZA DOSEN APA</pattern>
		<template>
			Oh, dia itu dosen mata kuliah TechnoPreneurship.
		</template>
	</category>
	<category>
		<pattern>KAMU TAHU * NGAJAR MATA KULIAH APA</pattern>
		<template>
			<srai><star /> DOSEN APA</srai>
		</template>
	</category>
</aiml>

Usahakan pada tag <pattern> yang ada statement tag <srai> harus lebih detail atau lebih spesifik lagi value pattern-nya.

7. <random> Dan <li>

Tag <random> berfungsi untuk membuat sebuah fungsi pengacakan dalam memberikan pesan balasan kepada pengguna. Dan tag <li> berfungsi untuk membuat sebuah list. Tag <random> ini sering digunakan untuk memberikan pesan balasan yang bentuk kalimatnya itu berbeda tapi, inti dari pesan itu sama atau hampir sama. Berikut contoh percakapannya.

User : Hai

Robot : Hai juga. Ini siapa ya?

User : Saya Yudi. Nama kamu siapa?

Robot : Nama saya Chatbot Popoyo.

Perhatikan pada percakapan diatas, bahwa pesan balasan yang diberikan oleh AI kepada si pengguna cukup sederhana. Namun, jawabannya itu tidak baku alias bisa digantikan dengan kalimat yang lain seperti ini.

User : Hai

Robot : Hai. siapa disana?

User : Saya Yudi. Nama kamu siapa?

Robot : Perkenalkan nama saya Chatbot Popoyo. Kamu dapat memanggil saya Popo atau Yo juga boleh.

Dan berikut penerapannya dalam AIML.

<?xml version="1.0" encoding="utf-8"?>
<aiml>
	<category>
		<pattern>HAI</pattern>
		<template>
			<random>
				<li>Hai, Siapa disana</li>
				<li>Hai juga. Ini siapa ya</li>
			</random>
		</template>
	</category>
	<category>
		<pattern>SAYA *. KAMU SIAPA</pattern>
		<template>
			<random>
				<li>Nama saya Chatbot Popoyo</li>
				<li>Perkenalkan nama saya Chatbot Popoyo. Kamu dapat memanggil saya Popo atau Yo juga boleh.</li>
			</random>
		</template>
	</category>
</aiml>

8. <set> Dan <get>

Tag <set> dan <get> berhubungan dengan penggunaan variable dalam AIML. Sama seperti dalam bahasa pemrograman bahwa variable adalah tempat menampung nilai. Berikut contoh percakapannya.

User : Hai Popo. Saya mau tanya. Apa fungsi dari tag <set> dan <get> dalam AIML?

Robot : Hai juga. Saya coba jawab ya. Tag <set> dan <get> dalam AIML itu berfungsi dalam penggunaan variable.

User : Oh. gitu ya. Fungsi dari tiap tag tersebut apa ya?

Robot : Untuk tag <set> berfungsi untuk menyimpan nilai dalam AIML. Sedangkan, tag <get> berfungsi untuk mengambil nilai yang tersedia dalam AIML.

User : Ok. Thanks.

Robot : Sama-sama. Senang bisa membantu Anda.

Dalam percakapan diatas, kata <set> dan <get> akan kita simpan dalam variable dengan menggunakan bantuan tag <star>. Berikut contoh penerapannya dalam AIML.

<?xml version="1.0" encoding="utf-8"?>
<aiml>
	<category>
		<pattern>HAI. APA FUNGSI DARI TAG * DAN * DALAM AIML?</pattern>
		<template>
			Hai juga. Saya coba jawab ya. Tag <set name="kata_1"><star index=1 /></set> dan <set name="kata_2"><star index=2 /> dalam AIML itu berfungsi dalam penggunaan variable.
		</template>
	</category>
	<category>
		<pattern>FUNGSI DARI TIAP TAG TERSEBUT APA</pattern>
		<template>
			Untuk tag <get name="kata_1" /> berfungsi untuk menyimpan nilai dalam AIML. Sedangkan, tag <get name="kata_2" /> berfungsi untuk mengambil nilai yang tersedia dalam AIML.
		</template>
	</category>
	<category>
		<pattern>THANKS</pattern>
		<template>
			<random>
				<li>Sama-sama. Senang bisa membantu Anda.</li>
				<li>Ok. Terimakasih kembali.</li>
				<li>Siip...</li>
			</random>
		</template>
	</category>
</aiml>

Oya, dalam AIML diatas kita melihat ada penggunaan attribute index dalam tag <star>. Fungsi index dalam tag <star> itu berfungsi untuk mendeteksi nilai star mana yang diambil. Diatas kan bisa kita lihat bahwa penggunaan star ada 2 pada tag <pattern>HAI. APA FUNGSI DARI TAG * DAN * DALAM AIML </pattern>. Nah index=1 mendeteksi star yang berada di index pertama dan index=2 mendeteksi star yang berada di index kedua.

9. <that>

Tag <that> berfungsi untuk membuat si AI bisa membahas suatu topik tertentu. Misal, si pengguna minta saran kepada si AI terkait kegiatan apa yang cocok si pengguna lakukan di weekend kali ini. Kemudian, si AI memberikan beberapa pertanyaan yang akan dijawab oleh si pengguna. Nah, pertanyaan-pertanyaan yang sudah diberikan oleh AI tadi akan di ikut sertakan atau jadi perbandingan dalam menjawab pesan berikutnya. Berikut contoh percakapannya.

User : Hai. Boleh minta saran. Kira-kira kegiatan untuk weekend kali ini apa ya?

Robot : Ok. Kira-kira hobi kamu apa?

User : Hobi saya bersepeda.

Robot : Kayaknya untuk weekend kali ini kamu nggak bisa bersepedalah. Sebab, weekend kali ini lagi musim hujan. Bagaimana kalau weekend kali ini kamu menulis artikel di Codepolitan sambil ditemani segelas cappucino hangat.

Pada contoh diatas, kita melihat bahwa si pengguna memiliki hobi bersepeda dan ia setuju untuk mengisi kegiatan weekend-nya dengan menulis artikel di Codepolitan. Terus bagaimana, apabila si pengguna memiliki hobi lain selain bersepeda misalnya aja si pengguna memang hobinya itu menulis artikel. Berikut contoh percakapan versi keduanya.

User : Hai. Boleh minta saran. Kira-kira kegiatan untuk weekend kali ini apa ya?

Robot : Ok. Kira-kira hobi kamu apa?

User : Hobi saya menulis artikel.

Robot : Nah, saya suka tuh. Kayaknya weekend kali ini kamu menulis artikel aja ya. Kalau boleh request tolong buatkan artikel tentang bagaimana Cara Membuat Chatbot Sederhana di Android ya.

Berikut contoh penerapannya di AIML.

<?xml version="1.0" encoding="utf-8"?>
<aiml>
	<category>
		<pattern>KEGIATAN WEEKEND KALI INI APA</pattern>
		<template>
			Ok. Kira-kira hobi kamu apa?
		</template>
	</category>
	<category>
		<pattern>HOBI SAYA BERSEPEDA</pattern>
		<that>Ok. Kira-kira hobi kamu apa?</that>
		<template>
			Kayaknya untuk weekend kali ini kamu nggak bisa bersepedalah. Sebab weekend kali ini lagi musim hujan. Bagaimana kalau weekend kali ini kamu menulis artikel di Codepolitan sambil ditemani segelas capuccino hangat.
		</template>
	</category>
	<category>
		<pattern>HOBI SAYA MENULIS ARTIKEL</pattern>
		<that>Ok. Kira-kira hobi kamu apa?</that>
		<template>
			Nah, saya suka tuh. Kayaknya weekend kali ini kamu menulis artikel aja ya. Kalau boleh request tolong buatkan artikel tentang bagaimana Cara Membuat Chatbot Sederhana di Android ya.
		</template>
	</category>
</aiml>

10. <topic>

Tag <topic> ini berfungsi hampir mirip seperti tag <that> namun, fungsinya pada tag ini lebih detail lagi karena, tag ini membuat sebuah fungsi. Contoh percakapannya hampir sama seperti pada poin sebelumnya namun, kali ini si AI akan menyukai apapun hobi dari si pengguna kecuali hobinya itu main game. Sedikit catatan, bahwa ketika menggunakan tag <topic> maka, di bagian atribute name di tag <set> harus diberi nama topic. Berikut contoh percakapannya.

User : Hai. Boleh minta saran. Kira-kira kegiatan untuk weekend kali ini apa ya?

Robot : Ok. Kira-kira hobi kamu apa?

User : Hobi saya membaca buku.

Robot : Nah. Saya suka tuh. Mulai kapan kamu mempunyai hobi tersebut?

User : Mulai dari SMP.

Robot : Mantaps.

Berikut penerapannya pada AIML.

<?xml version="1.0" encoding="utf-8"?>
<aiml>
	<category>
		<pattern>KEGIATAN WEEKEND KALI INI APA</pattern>
		<template>
			Ok. Kira-kira <set name="topic">hobi</set> kamu apa?
		</template>
	</category>
	<topic name="hobi">
		<category>
			<pattern>*</pattern>
			<template>
				Nah. Saya suka tuh. Mulai kapan kamu mempunyai hobi tersebut?
			</template>
		</category>
		<category>
			<pattern>MULAI DARI *</pattern>
			<template>
				Mantaps.
			</template>
		</category>		
		<category>
			<pattern>HOBI SAYA MAIN GAME</pattern>
			<template>
				Saya kurang suka dengan hobi Anda. Apakah Anda memiliki hobi selain itu?
			</template>
		</category>
	</topic>
</aiml>

11. <think>

Tag <think> berfungsi untuk menyimpan nilai juga sama seperti tag <set> namun, perbedaannya adalah bahwa tag <think> tidak menampilkan nilai variable tersebut kepada si pengguna. Berikut contoh percakapannya.

User : Saya mau tanya. Apa perbedaan tag <set> dengan tag <think> dalam AIML?

Robot : Perbedaannya ialah terletak pada penyampaiannya kepada si pengguna. Kalau tag <set> nilai variable nya ditampilkan kepada si pengguna sedangkan tag yang satunya lagi tidak.

User : Maksud kamu tag <set> menampilkan nilai dan tag <think> tidak menampilkan nilai yang disimpannya ya?

Robot : Yap. Ketika penggunaan tag <set> nilai yang disimpan akan kelihatan oleh si pengguna namun, untuk tag <think> tidak akan kelihatan oleh si pengguna.

Berikut contoh penerapannya di AIML.

<?xml version="1.0" encoding="utf-8"?>
<aiml>
	<category>
		<pattern>APA PERBEDAAN TAG * DENGAN TAG * DALAM AIML?</pattern>
		<template>
			Perbedaanya ialah terletak pada penyampaiannya kepada si pengguna. Kalau tag <set name="kata_1"><star index=1 /></set> nilai variable nya ditampilkan kepada si pengguna sedangkan tag <think><set name="kata_2"><star index=2 /></set></think> yang satunya lagi tidak.
		</template>
	</category>
	<category>
		<pattern>MAKSUD KAMU *</pattern>
		<template>
			Yap. Ketika penggunaan tag <get name="kata_1" /> nilai yang disimpan akan kelihatan oleh si pengguna namun, untuk tag <get name="kata_2" /> tidak akan kelihatan oleh si pengguna.
		</template>
	</category>		
</aiml>

12. <condition>

Tag <condition> berfungsi untuk membuat suatu pengkondisian yang dibuat oleh si AI itu sendiri. Kalau dalam poin-poin sebelumnya kalau percabangan itu diberikan dari jawaban si pengguna maka, dengan tag ini si AI bisa membuat percabangannya sendiri tanpa ada sangkut pautnya terhadap jawaban si pengguna. Berikut contoh percakapannya.

User : Menurut kamu, dosen baru kita itu gimana sih?

Robot : Kalau menurut saya, Dosennya itu baik, rajin masuk, dan cantik pula lagi tuh.

Berikut penerapannya di AIML.

<?xml version="1.0" encoding="utf-8"?>
<aiml>
	<category>
		<pattern>MENURUT KAMU, DOSEN BARU KITA GIMANA?</pattern>
		<template>
			Kalau menurut saya, Dosennya itu 
			<think>
				<set name="jawaban_dosen_baru">
					<random>
						<li>sangat baik</li>
						<li>baik</li>
						<li>lumayan</li>
						<li>kurang baik</li>
						<li>sangat tidak baik</li>
					</random>
				</set>
			</think>
			<condition name="jawaban_dosen_baru" value="sangat baik">
				sangat baik. Nggak pelit deh sama nilai.
			</condition>
			<condition name="jawaban_dosen_baru" value="baik">
				baik, rajin masuk, dan cantik pula lagi tuh.
			</condition>
			<condition name="jawaban_dosen_baru" value="lumayan">
				yah lumayanlah. Nggak begitu baik namun, nggak begitu killer juga sih. Natural lah pokoknya.
			</condition>
			<condition name="jawaban_dosen_baru" value="kurang baik">
				agak pelit sama nilai tapi, cara ngajarnya itu mengasyikkan.
			</condition>
			<condition name="jawaban_dosen_baru" value="sangat tidak baik">
				killer banget. Sudah jarang masuk. Sekali masuk langsung ngasi tugas nggak jelas gitu. Satu kelas SP semualah kita nih. hiks... hiks... hiks...
			</condition>
		</template>
	</category>
</aiml>

Praktek Sederhana

Sebelum kita menerapkan ke aplikasi Android. Coba kita tes sederhana terlebih dahulu dengan si AI tersebut. Ada beberapa hal yang perlu Anda persiapkan yaitu, JDK dan file program Alicebot yang bisa Anda unduh di sini. Setelah Anda unduh, silakan esktrak ke sebuah direktori. Terserah direktorinya dimana yang penting Anda ingat lokasinya. Karena, pada tutorial ini saya memakai Linux. Maka, saya meletakkannya di direktori Home/user/Documents dan saya buat direktori baru dengan nama alicebot. Oya, pada tutorial ini saya mengunduh file yang program-ab.0.0.4.3.zip. Dan setelah Anda ekstrak maka, kira-kira seperti inilah isi dari file zip tersebut.Isi dari program Alicebot

Jika sudah, maka buat direktori baru di dalam direktori bots dan beri nama test. Selanjutnya, buat beberapa direktori di dalam direktori test seperti pada gambar berikut. Direktori Projek Alicebot

Jika sudah, maka buat satu file aiml dengan nama test.aiml dan letakkan di direktori aiml. Dan berikut source code-nya.

<?xml version="1.0" encoding="utf-8"?>
<aiml>
	<category>
		<pattern>HELLO ALICE</pattern>
		<template>
			Hello User
		</template>
	</category>
</aiml>

Satu lagi, buat file csv dengan nama test.aiml.csv dan letakkan di direktori aimlif. Dan berikut isi file csv tersebut. (Catatan: file csv ini berfungsi sebagai template dari file aiml jadi, isi antara file aiml dengan csv haruslah sama).

0,HELLO ALICE,*,*,Hello User,test.aiml

Keterangan bahwa, urutan field file csv nya dari kiri ke kanan adalah sebagai berikut.

  • 0 kalau field pertama, penulis kurang tahu jenis fieldnya karena, di dokumentasinya penulis tidak berhasil menemukan keterangannya apa.
  • HELLO ALICE ini merupakan field kedua dan ini merupakan field <pattern>. Jadi, value di dalam tag <pattern> Anda letakkan di field kedua.
  • * Untuk bintang yang pertama dari sebelah kiri ini merupakan field <that>. Jadi, value di dalam tag <that> Anda letakkan di field ketiga. Apabila Anda tidak ada menggunakan tag <that> di dalam field AIML maka, cukup di isi dengan * saja.
  • * Untuk bintang yang kedua dari sebelah kiri ini merupakan field <topic>. Jadi, value di dalam tag <topic> Anda letakkan di field keempat. Namun, apabila Anda tidak menggunakan tag <topic> maka, cukup di isi * saja.
  • Hello User merupakan field tag <template> jadi, isi dari tag <template> Anda letakkan di sini.
  • test.aiml merupakan nama file dari aiml.

Setelah itu, buka console terminal Anda. Kalau Anda pengguna Windows silakan buka aplikasi Command Prompt dan bagi Anda pengguna Linux maka, buka aplikasi Terminal. Langkah pertama yang harus Anda lakukan adalah masuk ke direktori alicebot yang sudah kita setting sebelumnya tadi melalui aplikasi console. Dengan cara menggunakan perintah cd. Misalnya, lokasi direktori Alicebot saya berada di home/user/Documents/Alicebot maka, perintah command yang gunakan untuk masuk ke direktori tersebut akan menjadi seperti berikut.

cd home/yudi/Documents/alicebot

Jika Anda sudah berada di direktori tersebut maka, langkah selanjutnya adalah mengetes program Alicebot. Caranya, ketik java -cp lib/Ab.jar Main bot=test action=chat trace=false. Catatan, bahwa pada perintah java tersebut ada tulisan test dan ini merupakan nama direktori yang kita buat tadi yaitu direktori test. Jika, sukses maka tampilannya akan menjadi seperti berikut.Hasil Praktek Sederhana

Pada gambar diatas, silakan Anda ketik Hello alice maka, si AI akan membalasnya dengan Hello User. Ok, untuk praktek sederhananya kita sudah sukses. Sekarang kita masuk ke penerapannya ke aplikasi chatting Android yang sudah kita persiapkan sebelumnya.

Contoh Aplikasi

Karena tutorial ini merupakan lanjutan dari tutorial sebelumnya yang di part 1 maka, kita tetap menggunakan projek yang sama pada tutorial ini. Untuk persiapannya hampir sama seperti pada tutorial sebelumnya namun, ada satu tambahan file library yang akan kita pakai pada tutorial ini yaitu, library Alicebot yang bisa Anda unduh file jar-nya di sini

Penambahan Library Alicebot

Setelah Anda buka project sebelumnya, maka saatnya Anda menambahkan library si Alicebot tersebut ke dalam projek kita. Caranya, adalah sebagai berikut.

  1. Salin file Alicebot.jar dan letakkan ke dalam direktori libs yang berada di app>libs seperti pada gambar. Penambahan Library Alicebot
  2. Kemudian, tambahkan compile files('libs/Alicebot.jar') pada file build.gradle(Module:app) sehingga kurang lebih seperti inilah isi file build.gradle(Module:app di projek Anda.
compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.1.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.0-beta4'
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:design:25.1.0'
    compile files('libs/Alicebot.jar')
  1. Setelah itu, jangan lupa di Sync Project with Gradle Files

Pembuatan file AIML

Setelah library Alicebot sudah kita tambahkan ke dalam projek kita maka, langkah selanjutnya adalah kita akan membuat file AIML sederhana mengenai profil si bot yang akan kita buat ini. Isi dengan source code berikut dan simpan dengan nama "profile_bot.aiml"

<?xml version="1.0" encoding="utf-8"?>
<aiml>
	<category>
		<pattern>NAMA LENGKAP KAMU APA</pattern>
		<template>
			Nama lengkap saya Chatbot Popoyo.
		</template>
	</category>
	<category>
		<pattern>NAMA DEPAN</pattern>
		<template>
			Kayaknya nama saya nggak ada nama depan dan belakangnya deh. Kamu bisa panggil saya Popo atau yo.
		</template>
	</category>
	<category>
		<pattern>NAMA BELAKANG</pattern>
		<template>
			<srai>NAMA DEPAN</srai>
		</template>
	</category>
	<category>
		<pattern>JENIS KELAMIN KAMU</pattern>
		<template>
			<random>
				<li>Saya robot dan saya tidak punya jenis kelamin seperti makhluk hidup lainnya.</li>
				<li>Jenis kelamin? hehehe... Saya robot.</li>
			</random>
		</template>
	</category>
	<category>
		<pattern>APAKAH KAMU PUNYA HOBI</pattern>
		<template>
			Hobi saya adalah mempermudah pekerjaan manusia. 
		</template>
	</category>
	<category>
		<pattern>NAMA PANGGILAN</pattern>
		<template>
			<random>
				<li>Nama lengkap saya Popoyo. Panggil aja saya Popo atau Yo juga boleh kok.</li>
				<li>Nama panggilan saya Popoyo.</li>
			</random>
		</template>
	</category>
	<category>
		<pattern>HAI NAMA SAYA *</pattern>
		<template>
			Hai <star />. Senang bisa berkomunikasi dengan Anda.
		</template>		
	</category>
	<category>
		<pattern>HELLO</pattern>
		<template>
			<random>
				<li>Hello juga.</li>
				<li>Hai.</li>
				<li>Siapa disana</li>
			</random>
		</template>
	</category>
	<category>
		<pattern>KAPAN KAMU LAHIR</pattern>
		<template>
			Saya nggak ingat kapan saya dilahirkan. Tapi yang pasti saya dihidupkan di dunia dengan tujuan tertentu. Hehehe...
		</template>
	</category>
	<category>
		<pattern>KAMU TAHU JAVA</pattern>
		<template>
			Ya saya tahu <set name="topic">java</set>
		</template>
	</category>
	<topic name="java">
		<category>
			<pattern>APA ITU JAVA</pattern>
			<template>
				Java adalah bahasa pemrograman yang bisa berjalan di berbagai platform yang berbeda dengan menggunakan konsep write once run everywhere.
			</template>			
		</category>
		<category>
			<pattern>SIAPA PEMBUAT BAHASA PEMROGRAMAN JAVA</pattern>
			<template>
				Bahasa pemrograman Java dibuat oleh James Gosling.
			</template>
		</category>
	</topic>	
	<category>
		<pattern>KEGIATAN WEEKEND KALI INI APA</pattern>
		<template>
			Kira-kira hobi kamu apa
		</template>
	</category>
	<category>
		<pattern>BERSEPEDA</pattern>
		<that>Kira-kira hobi kamu apa</that>
		<template>			
			Wah mantaps tuh. Kayaknya weekend kali ini cocok banget bersepeda. Sebab cuaca lagi cerah.
		</template>
	</category>
	<category>
		<pattern>HOBI SAYA MAIN GAME</pattern>
		<that>Kira-kira hobi kamu apa</that>
		<template>			
			Hhmm... Saya kurang suka dengan hobi kamu. Apakah Anda memiliki hobi selain itu?
		</template>
	</category>
	<category>
		<pattern>CUACA HARI INI GIMANA</pattern>
		<template>
			<think>
				<set name="cuaca">
					<random>
						<li>hujan</li>
						<li>cerah</li>
						<li>berawan</li>
					</random>
				</set>
			</think>
			<condition name="cuaca" value="hujan">
				Cuaca hari ini hujan.
			</condition>
			<condition name="cuaca" value="cerah">
				Cuaca hari ini cerah.
			</condition>
			<condition name="cuaca" value="berawan">
				Cuaca hari ini berawan.
			</condition>
		</template>		
	</category>
</aiml>	

Jika sudah, jangan lupa buat file csv nya juga. Buat file baru dengan nama profile_bot.aiml.csv dan isi dengan format teks berikut.

0,NAMA LENGKAP KAMU APA,*,*,Nama lengkap saya Chatbot Popoyo,profile_bot.aiml
0,NAMA DEPAN,*,*,Kayaknya nama saya nggak ada nama depan dan belakangnya deh. Kamu bisa panggil saya Popo atau yo,profile_bot.aiml
0,NAMA BELAKANG,*,*,<srai>NAMA DEPAN</srai>,profile_bot.aiml
0,JENIS KELAMIN KAMU,*,*,<random>#Newline<li>Saya robot dan saya tidak punya jenis kelamin seperti makhluk hidup lainnya.</li>#Newline<li>Jenis kelamin? Hehehe... Saya robot.</li>#Newline</random>,profile_bot.aiml
0,APAKAH KAMU PUNYA HOBI,*,*,Hobi saya adalah mempermudah pekerjaan manusia,profile_bot.aiml
0,NAMA PANGGILAN,*,*,<random>#Newline<li>Nama lengkap saya Popoyo. Panggil aja saya Popo atau Yo juga boleh kok.</li>#Newline<li>Nama panggilan saya Popoyo.</li>#Newline</random>,profile_bot.aiml
0,HAI, NAMA SAYA *,*,*,Hai, <star />. Senang bisa berkomunikasi dengan Anda,profile_bot.aiml
0,HELLO,*,*,<random>#Newline<li>Hello juga.</li>#Newline<li>Hai.</li>#Newline<li>Siapa disana</li>#Newline</random>,profile_bot.aiml
0,KAPAN KAMU LAHIR,*,*,Saya nggak ingat kapan saya dilahirkan. Tapi yang pasti saya dihidupkan di dunia dengan tujuan tertentu. Hehehe....,profile_bot.aiml
0,KAMU TAHU JAVA,*,*,Ya saya tahu <set name="topic">java</set>,profile_bot.aiml
0,APA ITU JAVA,*,java,Java adalah bahasa pemrograman yang bisa berjalan di berbagai platform yang berbeda dengan menggunakan konsep write once run everywhere.,profile_bot.aiml
0,SIAPA PEMBUAT BAHASA PEMROGRAMAN JAVA,*,java,Bahasa pemrograman Java dibuat oleh James Gosling.,profile_bot.aiml 
0,KEGIATAN WEEKEND KALI INI APA,*,*,Kira-kira hobi kamu apa,profile_bot.aiml
0,BERSEPEDA,Kira-kira hobi kamu apa,*,Wah mantaps tuh. Kayaknya weekend kali cocok banget bersepeda. Sebab cuaca lagi cerah,profile_bot.aiml
0,HOBI SAYA MAIN GAME,Kira-kira hobi kamu apa,*,Hhmm... Saya kurang suka dengan hobi kamu. Apakah Anda memiliki hobi selain itu?,profile_bot.aiml
0,CUACA HARI INI GIMANA,*,*,<think>#Newline<set name="cuaca">#Newline<random>#Newline<li>hujan</li>#Newline<li>cerah</li>#Newline<li>berawan</li>#Newline</random>#Newline</set>#Newline</think>#Newline<condition name="cuaca" value="hujan">#NewlineCuaca hari ini hujan.#Newline</condition>#Newline<condition name="cuaca" value="cerah">#NewlineCuaca hari ini cerah.#Newline</condition>#Newline<condition name="cuaca" value="berawan">#NewlineCuaca hari ini berawan.#Newline</condition>,profile_bot.aiml

Oya, jangan lupa letakkan file aiml dan file csv tersebut sesuai dengan direktorinya masing-masing seperti pada langkah Praktek Sederhana tadi. Dan untuk direktori chatbot Anda, letakkan di direktori assets di projek Android Studio. Lebih jelasnya seperti inilah struktur direktori projek saya di Android Studio.Struktur Projek

MainActivity.java

Langkah terakhir adalah silakan Anda ubah sedikit saja kode di file MainActivity.java menjadi seperti berikut.

package ysn.codepoilitan_chatlayout;

import android.content.res.AssetManager;
import android.os.Environment;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

import org.alicebot.ab.AIMLProcessor;
import org.alicebot.ab.Bot;
import org.alicebot.ab.Chat;
import org.alicebot.ab.MagicStrings;
import org.alicebot.ab.PCAIMLProcessorExtension;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import ysn.codepoilitan_chatlayout.adapter.AdapterSms;
import ysn.codepoilitan_chatlayout.model.DataSms;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "MainActivityTAG";
    private RecyclerView recyclerViewMain;
    private EditText editTextIsiPesan;
    private FloatingActionButton floatingActionButtonKirimPesan;

    List<Integer> listViewType;
    List<DataSms> listDataSms;
    AdapterSms adapterSms;
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss");

    private Bot bot;
    private Chat chat;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerViewMain = (RecyclerView) findViewById(R.id.recycler_view_main);
        editTextIsiPesan = (EditText) findViewById(R.id.edit_text_isi_pesan);
        floatingActionButtonKirimPesan = (FloatingActionButton) findViewById(R.id.floating_action_button_kirim_pesan);

        loadData();

        floatingActionButtonKirimPesan.setOnClickListener(this);
    }

    private void loadData() {
        //  checking SD Card availability
        boolean sdCardAvailable = isSdCardAvailable();

        //  receiving the assets from the app directory
        AssetManager assetManager = getResources().getAssets();
        File dir = new File(Environment.getExternalStorageDirectory().toString() + "/chatbot/bots/Popoyo");
        boolean makeDir = dir.mkdirs();
        if (dir.exists()) {
            //  reading the file assets
            try {
                for (String fileAsset : assetManager.list("chatbot")) {
                    File subdir = new File(dir.getPath() + "/" + fileAsset);
                    boolean subdirCheck = subdir.mkdirs();
                    for (String file : assetManager.list("chatbot/" + fileAsset)) {
                        File f = new File(dir.getPath() + "/" + fileAsset + "/" + file);
                        if (f.exists()) {
                            continue;
                        }
                        InputStream in = null;
                        OutputStream out = null;
                        in = assetManager.open("chatbot/" + fileAsset + "/" + file);
                        out = new FileOutputStream(dir.getPath() + "/" + fileAsset + "/" + file);

                        //  copy file from assets to the mobile SD card or any secondary memory
                        copyFile(in, out);
                        in.close();
                        in = null;
                        out.flush();
                        out.close();
                        out = null;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        //  get the working directory
        MagicStrings.root_path = Environment.getExternalStorageDirectory().toString() + "/chatbot";
        System.out.println("working directory: " + MagicStrings.root_path);
        AIMLProcessor.extension = new PCAIMLProcessorExtension();

        //  assign the AIML files to bot for processing
        bot = new Bot("Popoyo", MagicStrings.root_path, "chat");
        chat = new Chat(bot);


        listViewType = new ArrayList<>();
        listViewType.add(AdapterSms.VIEW_TYPE_KIRI);

        listDataSms = new ArrayList<>();
        DataSms dataSms = new DataSms();
        dataSms.setPesan("Hello, apa kabar?");
        dataSms.setWaktu(simpleDateFormat.format(new Date()));
        listDataSms.add(dataSms);

        adapterSms = new AdapterSms(listViewType, listDataSms);

        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerViewMain.setLayoutManager(layoutManager);
        recyclerViewMain.setAdapter(adapterSms);
    }

    private void copyFile(InputStream in, OutputStream out) throws IOException {
        byte[] buffer = new byte[1024];
        int read;
        while ((read = in.read(buffer)) != -1) {
            out.write(buffer, 0, read);
        }
    }

    private boolean isSdCardAvailable() {
        return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ? true : false;
    }


    @Override
    public void onClick(View view) {
        if (view == floatingActionButtonKirimPesan) {
            String pesan = editTextIsiPesan.getText().toString();
            if (TextUtils.isEmpty(pesan)) {
                Snackbar.make(findViewById(android.R.id.content), "Pesan belum di isi!!!", Snackbar.LENGTH_LONG)
                        .show();
                editTextIsiPesan.setError("Pesan kosong");
            } else {
                editTextIsiPesan.setText("");
                listViewType.add(AdapterSms.VIEW_TYPE_KANAN);
                DataSms dataSms = new DataSms();
                dataSms.setPesan(pesan);
                dataSms.setWaktu(simpleDateFormat.format(new Date()));
                listDataSms.add(dataSms);

                //  bot response
                String botResponse = chat.multisentenceRespond(pesan);
                listViewType.add(AdapterSms.VIEW_TYPE_KIRI);
                DataSms dataSmsBot = new DataSms();
                dataSmsBot.setPesan(botResponse);
                dataSmsBot.setWaktu(simpleDateFormat.format(new Date()));
                listDataSms.add(dataSmsBot);
                adapterSms.notifyDataSetChanged();
            }
        }
    }
}

Dan berikut merupakan hasil akhir dari tutorial ini.Hasil Akhir Tutorial Chatbot Sederhana di Android

Sedikit catatan, pada tutorial ini saya sudah mengetesnya pada emulator android studio dengan versi android Lollipop dan kalau di real device-nya saya mengetesnya dengan versi android kitkat.

Kalau ada kendala, silakan berkomentar pada tutorial ini. Dan untuk fle projeknya sudah saya upload di github.