movie recmmender system

Membuat Movie Recommender System Dengan Python

Pada artikel sebelumnya telah saya bahas sekilas serba-serbi recommender system. Kali ini kita akan coba membuat movie recommender system yang akan merekomendasikan film yang belum pernah ditonton seorang user berdasarkan riwayat film yang telah dia rating sebelumnya (Content-Based Filtering). Implementasi recommender system ini akan menggunakan Python.

Step by Step Content-Based Recommender System

Sebelum kita mulai coding, saya akan tunjukkan perhitungan Content-based recommender system langkah per langkah. Sebenarnya ada banyak pengembangan dan metode lain yang dapat digunakan tapi untuk kali ini saya akan tunjukkan konsep dasar yang paling sederhana.

1. Buat matrix riwayat user

Content-based menggunakan riwayat user dan profil item sebagai bahan dasar saat merekomendasikan. Untuk movie recommender, pertama-tama kita buat matrix atau tabel yang barisnya merupakan daftar semua film yang telah dirating oleh user, dan kolomnya ada semua “fitur” atau profil dari sebuah film.

Continue reading

Sekilas tentang Recommender System

Beberapa waktu lalu saya dapat ajakan untuk memberi pengenalan AI ke teman-teman di prodi Komputer dan Sistem Informasi, Sekolah Vokasi UGM. Dengan durasi yang singkat dan background yang “baru” untuk belajar AI, istri saya mengusulkan untuk memberi materi yang sederhana tapi bisa langsung mengena dan diaplikasikan. Tercetuslah untuk mengisi materi tentang Recommender System, menurut saya ini adalah salah satu topik di AI yang bisa dipelajari sekaligus di-coding dalam waktu kurang dari 3 jam.

Apa itu Recommender System?

Recommender system adalah sistem yang perekomendasi sesuatu item yang sering kita temui sehari-hari, misalnya di amazon.com atau e-commerce lain, kita sering mendapat rekomendasi tentang item yang seharusnya kamu beli. Di youtube atau spotify, kita juga mendapat rekomendasi tentang video atau lagu yang harusnya kita mainkan. Contoh lain lagi adalah (salah satu favorit saya) Movielens. Salah satu pioneer dalam riset sistem rekomendasi yang merekomendasikan film berdasarkan rating-rating film yang telah kita berikan.

Tentu saja metode yang digunakan pada platform-platform tersebut bukanlah algoritma yang di-coding dalam 3 jam. Mereka terus memperbarui menggunakan algoritma-algoritma terbaik mereka untuk merekomendasikan suatu item. Dengan menggunakan algoritma yang tepat, beberapa platform seperti amazon atau youtube dapat meningkatkan profit menggunakan recommender system.

Algoritma

Secara umum terdapat dua “sudut pandang” dalam pembuatan recommender system, yakni Content-Based dan Collaborative Filtering. Definisinya kira-kira seperti ini:

Content-Based Filtering: Kita buat profil user, misal melalui riwayat aktivitasnya terhadap item-item lain (like/dislike/rating, dsb.). Lalu ketika kita akan merekomendasikan sebuah item, kita lihat profil sebuah item apakah akan disukai atau tidak berdasarkan profil user tersebut.

Content-Based Recommender System

Collaborative Filtering: Kita merekomendasikan suatu item, berdasarkan kecocokan profil user dengan profil user yang lain. Misalnya, kebanyakan user yang suka produk A juga suka produk B, maka jika ada user lain yang suka produk A, kita bisa rekomendasikan produk B.

Collaborative Recommender System

Jika diperhatikan terdapat perbedaan yang mencolok antara kedua sudut pandang tersebut, masing-masing mempunyai plus dan minusnya. Beberapa catatan yang saya miliki:

  • Content-Based Filtering membutuhkan profil dari sebuah item. Artinya kita butuh fitur / karakteristik sebuah item. Misalnya, untuk buku ini bisa berarti Tema, Genre, Penulis, Tahun Terbit, dsb. Terkadang pada beberapa item hal ini sulit untuk dicari. Misalnya kita ingin merekomendasikan suatu “Tempat/Lokasi”
  • Collaborative Filtering membutuhkan profil dari user lain. Jika sistem yang kita buat masih “baru” mendapatkan profil user lain akan sulit dan kurangnya informasi bisa jadi menghasilkan hasil yang tidak sesuai. Bisa dibayangkan ketika sistem kita hanya ada dua user. Lalu user 1 beli item A dan item B, dan user 2 beli item A. Karena hanya terdiri dari dua user, tentu kita tidak bisa langsung bilang user 2 akan suka item B kan? karena bisa jadi item B yang dibeli user sama sekali tidak ada “hubungan” dengan item A.
  • Masalah kurangnya data di awal disebut dengan Cold Start Problem. Masalah tersebut dapat lebih diminimalkan (bukan dihilangkan) pada Content-Based Filtering karena kita tidak membutuhkan banyak riwayat user. User yang telah melakukan aktivitas “sebentar” sudah bisa mendapat rekomendasi yang cukup baik.
  • Seperti yang disinggung sebelumnya, Collaborative Filtering dapat memunculkan relasi dua buah item yang memiliki perbedaan profil yang tinggi tapi memiliki kedekatan secara “makna” misalnya, Payung dan Obat Flu sering dibeli secara bersamaan walaupun keduanya memiliki profil yang berbeda.
  • Content Based juga cocok untuk merekomendasikan suatu item yang sangat jarang di-“sentuh” semua user. Misalnya item yang tidak laku-laku. Hal ini bisa membantu meningkatkan profit dengan merekomendasikan item tersebut yang cocok dengan profil user tertentu.
  • Terdapat lebih banyak metode atau algoritma yang dapat digunakan pada Collaborative Filtering. Berbeda dengan algoritma Content-Based yang kebanyakan adalah “searching dan matching” pada Collaborative Filtering terdapat beragam metode dari yang sederhana hingga rumit.

Pada kenyataannya kebanyakan orang menggunakan teknik hybrid pada sistem rekomendasinya. Menggabungkan Content-Based dan Collaborative Filtering dengan rule-rule yang sesuai.

Pada post selanjutnya saya akan tunjukkan implementasi movie recommender system menggunakan Python. Codingannya tidak terlalu panjang tapi hasilnya sudah cukup baik untuk sistem rekomendasi.

Catatan: Beberapa waktu lalu saya sempat mendapat task recommender system yang cukup menarik, yakni Implicit Feedback. Implicit Feedback adalah kasus pada recommender system di mana kita tidak mengetahui aksi yang dilakukan positif atau negatif, misalnya “view” atau “click”. Pendekatan solusi kasus ini bisa menggunakan salah satu algoritma collaborative filtering yang disebut Alternating Least Square (ALS). Task ini menunjukkan masih banyak hal yang dapat di eksplor di recommender system

Sumber gambar:
– cover dari compfight.com
– icon dari flaticon.com

Word Embedding Bahasa Indonesia menggunakan Fasttext (Part 1.5)

Updated 11 Juli 2019: Fasttext released version 0.9.1

Pada artikel sebelumnya saya sempat menuliskan bagaimana menggunakan Gensim untuk me-load pre-trained model word embedding FastText. Ternyata metode tersebut “kebetulan” mudah digunakan untuk data bahasa Indonesia. Ketika kita memilih bahasa lain yang memiliki ukuran data lebih besar, menggunakan Gensim bisa jadi memunculkan masalah karena untuk me-load pre-trained model FastText, Gensim membutuhkan resource RAM yang cukup tinggi

Sebagai contoh jika kita coba me-load pre-trained model bahasa Inggris di Google Colab yang memiliki kapasitas RAM 12GB, Google Colab akan crash karena notebook kita menggunakan sumberdaya melebihi yang disediakan.

Berikut contoh program untuk me-load model bahasa Inggris menggunakan Gensim (detail sintaks program sebelumnya sudah sempat saya bahas di post sebelumnya)

Dan hasilnya, RAM kita yang 12GB itu secara perlahan akan habis digunakan. Lalu berakhir Google Colab kita akan mengalami crash dengan pesan berikut:

Untuk itu ada cara lain yang ingin saya bahas singkat di post ini bagaimana cara me-load pre-trained model Fasttext jika RAM kita terbatas

Menggunakan Fasttext Python Library

Seperti yang telah saya singgung di artikel sebelumnya, terdapat dua library yang dapat kita gunakan saat ingin menerapkan FastText di Python. Yang pertama adalah menggunakan Gensim, dan yang kedua adalah menggunakan package resmi dari FastText. Dokumentasinya dapat dibaca di halaman github ini.

Sedikit trivia, sebenarnya package FastText hanya tersedia untuk bahasa C++ dan dijalankan menggunakan command line. Sedangkan versi Python ini awalnya dibuat lebih dulu oleh orang Indonesia, yakni Bayu Aldiansyah. Lalu package ini dilanjutkan pengembangannya oleh tim Facebook AI Research.

Proses Instalasi

Di versi terbaru, yakni 0.9.1, Proses instalasi cukup dilakukan melalui pip dengan menjalankan perintah di bawah.

Setelah terinstall, kita dapat me-load library fastText pada program python kita menggunakan perintah

Yang menurut saya kurang dari package ini adalah dokumentasinya yang masih sederhana. Saya perlu beberapa kali membaca kode sumber aslinya untuk melihat fitur-fitur yang ada pada package ini.

Load Pre-trained Model

Untuk proses me-load pre-trained model, package python fastText juga sama meminta kita untuk menyiapkan file *.bin nya bukan file *.vec nya. (bedanya apa? bisa baca post sebelumnya) Ya, walapun kita sebenarnya bisa saja mengconvert file *.vec menjadi *.bin. Sintaks untuk me-load adalah berikut:

Proses loading akan membutuhkan waktu lama, tapi tenang, RAM yang akan digunakan totalnya akan lebih sedikit dibanding saat menggunakan Gensim. Total RAM yang saya gunakan untuk me-load menggunakan package python FastText hanya sekitar 7GB

Sehingga proses mengubah kata menjadi vektor pun dapat dilakukan tanpa mengalami crash. Untuk dokumentasi lengkap fungsi-fungsi yang ada bisa lihat di file kode sumbernya. Misalnya, untuk mendapatkan vektor dari sebuah kata kita cukup menginputkan kata tersebut layaknya dictionary pada Python:

Selain itu, menggunakan Python FastText ini kita tidak hanya bisa mendapatkan vektor dari sebuah kata, tetapi juga seluruh kalimat, menggunakan method get_vector_sentence:

Sekian, semoga bermanfaat.

Word Embedding Bahasa Indonesia menggunakan Fasttext (Part 1)

Mengenal Word Embedding

Word embedding mudahnya adalah istilah yang digunakan untuk teknik mengubah sebuah kata menjadi sebuah vektor atau array yang terdiri dari kumpulan angka.

Ketika kita akan membuat model machine learning yang menerima input sebuah teks, tentu machine learning tidak bisa langsung menerima mentah-mentah teks yang kita miliki. Cara “tradisional” untuk membaca teks tersebut adalah sebagai berikut:

  1. Buat kamus kata dengan cara mendaftar semua kata yang ada di dataset
  2. Setiap menerima sebuah string kata, string tersebut diubah menjadi sebuah integer dengan memberinya nomor. Penomoran ini bisa ditentukan berdasarkan urutan di kamus kata yang kita miliki. Misalnya pada ilustrasi di bawah, string “Makan” menjadi angka 3, string “Lari” menjadi angka 5, dst.
  3. Angka-angka tersebut kita ubah lagi menjadi sebuah vektor (array 1 dimensi) yang memiliki panjang sepanjang banyak kata yang kita miliki di kamus. Array tersebut hanya akan bernilai 1 atau 0 (disebut one hot encoding). Nilai 1 diposisikan pada indeks yang merupakan nomor kata tersebut sedangkan elemen lainnya bernilai 0. Contohnya untuk kata “makan”, dengan banyak kosakata yang kita miliki adalah 100 kata, maka dari kata tersebut kita akan memperoleh sebuah vektor dengan panjang 100 yang berisi 0 semua kecuali pada posisi ke 3 yang bernilai 1.
Ilustrasi mengubah string menjadi one-hot encoding

Nah coba saja bayangkan kamus kita ukurannya mencapai 10,000 kata, maka untuk setiap katanya akan di-convert menjadi vektor ukuran 10,000 yang hampir semua elemennya bernilai 0 semua. Metode ini selain kurang efisien dalam memori juga tidak memberikan banyak informasi.

Dengan metode word embedding kita dapat mengubah kata menjadi sebuah vektor yang berisi angka-angka dengan ukuran yang cukup kecil untuk mengandung informasi yang lebih banyak. Informasi yang diperoleh akan cukup banyak sampai-sampai vektor kita akan dapat mendeteksi makna, seperti kata “marah” dan “mengamuk” itu lebih memiliki kedekatan nilai ketimbang kata “marah” dengan “bahagia”.

Apa itu FastText?

FastText adalah library yang dikeluarkan oleh Facebook yang dapat digunakan untuk word embedding. Sebenarnya, FastText sendiri adalah pengembangan dari library Word2Vec yang telah lebih lama terkenal sebagai library untuk word embedding.

FastText memiliki keunggulan dibanding Word2Vec. Salah satunya adalah kemampuan FastText untuk menangani kata yang tidak pernah kita jumpai sebelumnya (Out Of Vocabulary word atau dikenal OOV). Misalnya kata-kata yang tidak baku seperti “Pengoptimalisasian” tetap akan diperoleh vektornya. Library Word2Vec ataupun teknik one hot encoding tradisional yang seperti dijelaskan sebelumnya akan menghasilkan eror ketika menerima kata yang tidak pernah ada di kamus.

FastText memberikan opsi untuk menggunakan salah satu dari dua algoritma utama, yakni CBOW dan Skipgram. Kedua algoritma tersebut menggunakan bantuan Neural network untuk mendapatkan model terbaik yang mampu merepresentasikan sebuah kata dalam vektor.

PreTrained FastText Bahasa Indonesa

Ada banyak cara menggunakan library FastText untuk kasus Bahasa Indonesia, cara paling mudah adalah dengan menggunakan Pretrained model, atau model yang telah dilatih oleh seseorang sehingga kita tinggal menggunakannya tanpa harus melatihnya terlebih dahulu.

Model resmi (terdapat lebih dari 150 bahasa) bisa di download di sini. Model tersebut dibuat berdasarkan paper oleh Edouard Grave, dkk yang berjudul Learning Word Vectors for 157 Languages. Bersyukurnya, bahasa Indonesia ada di antara 157 bahasa tersebut.

Saat akan mendownload, kalian akan sadar terdapat 2 jenis model yang disediakan oleh FastText, yakni cc.id.300.vec.gz dan cc.id.300.bin.gz. Jika diperhatikan sekilas dari nama filenya, tampak simbol id berarti itu adalah model bahasa Indonesia dan angka 300 menunjukkan besar dimensi vektornya.

Untuk bagian vec/bin menunjukkan tipe model tersebut, vec menunjukkan model tersebut hanyalah berupa text file yang berisi kamus daftar vector untuk setiap kata (perlu membuat program sendiri untuk mengatasi OOV), sedangkan bin menunjukkan file tersebut adalah file binary siap pakai dengan termasuk di dalamnya file .vec, algoritma untuk mengatasi OOV, catatan hyperparameter untuk melatih ulang, dsb.

Perlu diketahui, FastText hanya menyediakan pretrained model berupa model binary FastText (.bin) atau text file kumpulan kata beserta vektornya (.vec). Untuk menggunakan model atau text file tersebut pada proses word embedding kita akan menggunakan library lain lagi, yakni Gensim.

Menggunakan Gensim

Bagi pengguna Python, sebenarnya terdapat dua libray besar yang bisa kita gunakan untuk word embedding menggunakan FastText, yang pertama adalah library Python FastText bawaan asli, dan yang kedua adalah Gensim, library yang lebih umum untuk word embedding namun juga telah support FastText.

Di sini kita akan menggunakan Gensim untuk menggunakan model FastText. Install terlebih dahulu menggunakan perintah berikut:

Lalu import di program python menggunakan perintah:

Dalam Gensim saat ini cara paling mudah untuk me-load pretrained model FastText adalah menggunakan load_fasttext_format (lihat bagian Catatan). Fungsi tersebut membutuhkan file *.bin dari pretrained model. Kita bisa download terlebih dahulu file *.bin tersebut (~4-5GB) dari halaman resmi FastText.

Setelah berhasil terdownload, unzip file tersebut terlebih dahulu, lalu kita bisa memanggil model tersebut dengan perintah berikut:

Dan kita bisa uji model yang telah kita load dengan kode berikut:

Dapat dilihat pada program di atas kata “algoritmatik” tidak ada di kamus model yang kita gunakan (False), tetapi FastText tetap bisa menghasilkan nilai vektor untuk kata tersebut sehingga bisa dicari kata mirip terdekatnya (algoritma).

Untuk melihat nilai vektor dari kata “algoritmatik” kita bisa memunculkan dengan cara:

Penutup

Salah satu kekurangan menggunakan pretrained model adalah ukuran yang luar biasa besar (~7GB setelah di ekstrak), hal ini membuat kita pengguna komputer yang memiliki RAM kecil kesulitan untuk menggunakannya.

Kita bisa menggunakan Google Colab untuk menangani masalah tersebut, tetapi ada metode lain yang bisa kita gunakan, yakni kita coba melatih model kita sendiri. Dengan melatih sendiri kita bisa lebih mengatur ukuran model menyesuaikan kebutuhan. InsyaAllah proses melatih word embedding akan berlanjut di Part 2. Baca juga kelanjutan penggunaan Fasttext dengan library aslinya di Part 1.5

Catatan Seputar Gensim:

Di versi terbaru Gensim (> 3.7.2), kita disarankan menggunakan dua metode lain untuk me-load pretrained model, yakni menggunakan load_facebook_vectors atau load_facebook_model. Kedua fungsi tersebut merupakan fungsi yang telah diperbarui dari fungsi load_fasttext_format sehingga seharusnya lebih cepat.

Namun, ketika tulisan ini di tulis masih ada sebuah bug yang membuat belum bisa digunakannya fungsi tersebut. Jika bug ini sudah diperbaiki insyaAllah akan ada update untuk tulisan ini

Sumber featured image Pexels.com

Belajar Machine Learning via StackExchange

Salah satu yang menantang menurut saya untuk belajar Artificial Intelligence/Machine Learning/Data Mining adalah untuk belajar saja, kadang kita perlu menuliskan sintaks kode yang lumayan panjang dan kompleks. Mulai dari merapikan data, preprocessing, feature extraction, sampai proses utamanya sendiri. Kadang hal ini yang bikin jadi down dulu sebelum memulai belajar, apalagi bagi kita yang kesulitan meluangkan banyak waktu untuk sekadar latihan.

Nah, salah satu solusi belajar yang saya temui cukup membantu saya adalah dengan aktif di ruang diskusi yang membahas Machine Learning di internet. Salah satu forum diskusi yang cukup baik menurut saya adalah forum-forum terbitan StackExchange, seperti Stackoverflow, CrossValidated, atau AIStackExchange. Bagi kita programmer, saya yakin nama-nama itu bukanlah nama yang asing. Walau bukan benar-benar “forum diskusi” (situs StackExchange adalah situs tanya jawab atau QA site) situs-situs tersebut cukup baik untuk digunakan sebagai sarana belajar.

Salah satu sisi positif yang saya rasakan dari aktif di StackExchange kita bisa belajar dengan memperdalam logika dan teori dengan waktu yang relatif lebih singkat, tanpa harus membuat kode yang cukup panjang.

Note: aktif di forum hanyalah salah satu alternatif bagi teman-teman yang kesulitan meluangkan waktu banyak tapi tetap ingin belajar. Namun, bagi teman-teman yang ingin serius mendalami bidang ini, saya tetap sangat menyarankan untuk meluangkan waktu khusus untuk belajar untuk menyelesaikan kasus-kasus dan coding dari scratch.

Belajar Machine Learning via StackExchange

Ada beberapa cara bagi yang ingin belajar machine learning via stackexchange. Bisa dengan cara membaca-baca pertanyaan yang telah dijawab, aktif bertanya, ataupun aktif menjawab.

Belajar dari Pertanyaan Orang Lain

Cobalah mencari pertanyaan yang setopik dengan materi yang ingin kalian perlajari. Telusuri satu persatu pertanyaan yang sudah pernah ditanyakan, siapa tahu kalian menemukan pertanyaan atau jawaban yang menarik yang sebenarnya cukup penting untuk ditanyakan tapi kita tidak pernah terpikirkan.

Seperti pertanyaan yang baru-baru ini saya temui: kenapa kita menggunakan istilah “Machine Learning”, bukan “Program Learning” atau Bisakah kita menggunakan Neural Network untuk mendeteksi suatu bilangan ituΒ  prima atau bukan.

Dengan melihat jawaban orang lain kita juga jadi bisa menambah wawasan dengan menemukan solusi solusi menarik bagaimana orang menyelesaikan masalahnya.

Berani Bertanya

Tidak ada salahnya untuk bertanya asal dengan cara yang baik. Ada dua cara untuk kita bertanya di StackExchange, yang pertama kita bisa membuat pertanyaan baru, dan yang kedua adalah bertanya untuk meminta kejelasan jawaban via kolom komentar (ini butuh reputasi).

Untuk membuat pertanyaan baru, pastikan terlebih dahulu pertanyaan itu belum pernah ditanyakan sebelumnya. Untuk lebih yakin, cobalah googling kembali pertanyaan itu, atau bahkan lakukan parafrase jika perlu. Selain itu, pastikan juga kalian sudah membaca aturan singkat di halaman tour yang selalu ada di situs StackExchange manapun.

Contohnya di StackOverflow kalian akan mengenal istilah MVCE (Minimum Veriviable Complete Example), yakni sebuah aturan bagaimana memberikan contoh program kita yang eror secara minimalis. Secara tidak langsung, kita akan belajar bagaimana menjelaskan eror pada program kita secara baik kepada orang lain.

Note: Ingat, jika ingin mendapat jawaban yang baik, maka bertanyalah dengan cara baik.

Mencoba Memberi Jawaban

Selalu ada ilmu yang bisa kita bagi! Cobalah cari pertanyaan-pertanyaan sederhana yang sekiranya bisa kita jawab. Dengan mencoba menjawab beberapa pertanyaan, kita akan belajar untuk memahami lebih dalam materi yang kita pelajari. Kalau ada orang bilang, dengan mengajar ilmu kita bertambah, maka benar saja, dengan mencoba menjawab pertanyaan-pertanyaan di sana kita akan semakin bertambah wawasannya. Kita akan belajar bagaimana menjelaskan dan memberi contoh yang menjawab pertanyaan pengguna lain.

Takut di-downvote πŸ™

Ketika memberi jawaban atau pertanyaan, tentunya kita akan mendapat beragam feedback entah dari pengguna lain atau dari si-penanya. Mulai dari komentar, flag, atau downvote. Jangan minder jika ada feedback negatif, toh, namanya juga belajar dan diskusi πŸ™‚ Manusia tidak ada yang sempurna untuk luput dari kesalahan dan juga tidak semua manusia baik dan ramah untuk berdiskusi. Gunakan hal tersebut sebagai pengalaman untuk menjawab di kemudian hari.

Saya juga masih beberapa kali dapat komentar pedas atau “flag” pada pertanyaan saya karena tidak sesuai topik, tetapi bukan berarti lalu saya akan menghakimi forum tersebut tidak ramah dan melepas kesempatan saya belajar di sana.

Mulai Belajar!

Banyak pengalaman dan ilmu yang saya peroleh dengan aktif di StackExchange. Saya ingat bagaimana StackExchange telah membantu saya tidak hanya menyelesaikan skripsi saya, tetapi juga memahami lebih dalam tools yang saya gunakan. Selain itu semenjak aktif di StackExchange, saya juga merasa banyak terlatih untuk berkomunikasi dengan bahasa inggris secara natural. Jadi, Jangan ragu untuk memulai πŸ˜‰ Semoga Bermanfaat!

Sumber gambar: Pexels