Showing posts sorted by relevance for query content-based. Sort by date Show all posts
Showing posts sorted by relevance for query content-based. Sort by date Show all posts

Sunday, November 1, 2020

Membangun Sistem Rekomendasi dengan teknik Content-based Filtering

Di artikel ini kita akan belajar lebih detail lagi bagaimana membangun sistem rekomendasi menggunakan teknik Content-based filtering dengan menggunakan python. Pada artikel sebelumnya, telah kita pelajari apa itu sistem rekomendasi atau recommender system dan beberapa teknik  yang digunakannya.

Teknik Content-based filtering di Sistem rekomendasi

Content-based filtering(CB)

Ide dasar dari teknik CB adalah melakukan tag pada suatu produk dengan kata kunci tertentu, memahami apa yang pengguna sukai, mengambil data berdasar kata kunci di database dan memberikan rekomendasi kepada pengguna berdasarkan kesamaan atribut.

Sistem rekomendasi CB bekerja menggunakan data yang tersedia di pengguna, apakah itu data explisit(rating) atau implisit(klik pada link). Berdasarkan data tersebut, profile pengguna akan dibentuk, kemudian akan digunakan untuk memberikan produk rekomendasi. 

Sebagai contoh pada aplikasi Google Play, ketika seorang pengguna menginstall aplikasi tertentu(kategori Entertainment apps) yang diterbitkan oleh Science R Us, maka sistem akan menyimpan informasi tersebut dan selanjutnya sistem akan memberi rekomendasi berdasarkan kategori atau publisher yang sama. Pada teknik ini produk/item atribut yang dijadikan sebagai referensi kesamaan untuk hasil rekomendasi, model tidak memperhatikan informasi dari user lainnya.

TF-IDF dan Cosine similarity

Bagaimana kita dapat mengetahui kemiripan suatu produk/item? 

Secara umum, kemiripan dokumen didapatkan dari deskripsi suatu dokumen tersebut dengan konsep TF-IDF. TF-IDF merupakan sub-area dari Natural Language Processing(NLP) yang digunakan dalam information retrievel dengan tujuan untuk ekstrasi data. Sederhananya, bagaimana menghitung kemunculan setiap kata dalam dokumen dan memberi bobot pada setiap kata, dan menghitung skor untuk dokumen itu.

TF (term frequency) suatu kata adalah berapa kali kata itu muncul dalam dokumen.

TF(t) = (banyaknya term t muncul di dokumen) / (jumlah total terms di suatu dokumen)

IDF (inverse document frequency) dari sebuah kata adalah ukuran seberapa signifikan istilah tersebut di seluruh korpus.

IDF(t) = log_e(jumlah dari dokumen / jumlah dokumen dengan term t didalamnya)


Di python, kita dapat menggunakan library scikit-learn dengan pre-built function TF-IDF vectorizer yang akan menghitung score dari setiap deskrispi document.

Untuk menghitung kemiripan dari vector yang telah terbentuk, kita dapat menggunakan beberapa metode yaitu:

  1. Cosine similarity
  2. Euclidean distance
  3. Pearson's correlation
Setelah score kemiripan dari matrix dokumen terbentuk, kita bisa melakukan sorting berdasarkan score tersebut untuk dijadikan item rekomendasi.

Berikut ini contoh kode di jupyter notebook untuk domain data hotel description yang diperoleh dari challenge pada platform ecourse data science di DQLab dengan menggunakan TF-IDF dan cosine similarity untuk model sistem rekomendasinya.

Dari code python di jupyter notebook tersebut, hasil rekomendasi hotel beserta score-nya adalah seperti di bawah ini:

 
 ['Gunawangsa Manyar Hotel - 1.000000000000000',
 'Midtown Hotel Surabaya - 0.17992312860891296',
 'Aria Gajayana Hotel - 0.14461427726403756',
 'GP Mega Kuningan Hotel - 0.12367390420720603',
 'Le Polonia Medan managed by Topotels - 0.12049561758006845',
 'Swiss-Belinn Manyar Surabaya - 0.11731929279752672',
 'Hotel Santika Premiere Dyandra Hotel & Convention - 0.11442553936688896',
 'Best Western Plus Kemayoran Hotel - 0.10975989716138217',
 'Swiss-Belinn Malang - 0.09085670933358225',
 'Quest Hotel Darmo - Surabaya by ASTON - 0.08833161676427399',
 'Narita Classic Hotel Surabaya - 0.08833161676427399',
 'Premier Place Surabaya Airport - 0.08833161676427399',
 'Zoom Hotel Jemursari - 0.08833161676427399',
 'Cleo Hotel Basuki Rahmat - 0.0749975275102063',
 'Grand Darmo Suite by AMITHYA - 0.07174383261974006',
 'Varna Culture Hotel Surabaya - 0.06823993211613247']
 

Jika anda membutuhkan dataset hotel dan kode lengkap dalam file ipynb silahkan bisa download di github dengan alamat url berikut ini: https://github.com/ariflaksito/tfidf-cb-recsys

Referensi

  1. https://medium.com/@bindhubalu/content-based-recommender-system-4db1b3de03e7
  2. https://www.analyticsvidhya.com/blog/2015/08/beginners-guide-learn-content-based-recommender-systems/
  3. https://developers.google.com/machine-learning/recommendation/content-based/basics
  4. https://towardsdatascience.com/introduction-to-two-approaches-of-content-based-recommendation-system-fc797460c18c

Monday, November 23, 2020

Improvisasi Sistem Rekomendasi teknik Content-based

Diagram content-based filtering dengan metadata


Tulisan kali ini merupakan kelanjutan dari pembahasan sebelumnya yaitu bagaimana membangun sistem rekomendasi menggunakan teknik content-based filtering. Setelah kita perhatikan kembali pada hasil rekomendasi yang saya tulis di artikel sebelumnya tampak beberapa item yang tidak relevan, dimana saat merekomendasikan suatu item terpilih misalkan "Gunawangsa Manyar Hotel" yang berlokasi di Surabaya terdapat beberapa item hotel yang direkomedasikan berada di Jakarta atau Malang. 

Hal tersebut bisa terjadi karena teknik yang digunakan untuk pencarian kemiripan item hanya berdasarkan pada deskripsi hotel saja, jadi saat ada kemiripan text pada deskripsi hotel tersebut maka akan mendapatkan score yang bagus sebagai item yang muncul di rekomendasi tanpa memperhatikan lokasi hotel tersebut.

Untuk itu perlu adanya improvisasi dari teknik tersebut, salah satunya adalah dengan menambahkan beberapa properties/metada item untuk di mix dengan properties deskripsi hotel supaya meningkatkan kemiripan antara item hotel satu dengan lainnya.

Di python kita dapat menggunakan fungsi agg( ) dengan parameter join pada beberapa kolom dataframe yang akan digabungkan.

df[['col1 ','col2 ',' col3']].agg(' '.join, axis=1)

Analisis Metadata

Disini akan digunakan dataset dari review hotel dimana data tersebut mempunyai relasi dengan data hotel sebelumnya. Setelah kita melihat struktur data yang ada pada dataset review dan hotel, kita akan lakukan beberapa analisis untuk menambahkan metadata untuk membangun sistem rekomendasi.

Tahap pertama kita tambahkan informasi province dan city untuk setiap hotel.

Selanjutnya kita bisa juga tambahkan informasi dari harga hotel yang kita kelompokan menjadi beberapa bagian. Dalam hal ini akan dibagi menjadi 3 kategori yaitu "low", "medium", dan "high". Kita bisa gunakan fungsi cut( ) di pandas dataframe.

pd.cut(hotel_review_df['price_per_night'], 
            bins=3, labels=['low','medium','high'])

Berikutnya kita bisa juga menambahkan metadata untuk mengkategorikan hotel termasuk family room atau single room dengan menggunakan conditional dari informasi rata-rata children dan adults.

def set_family_room(x):
    if((x['children']>=1.0) | (x['adults']>1.0)):
        return "family room"
    else:
        return "single room"
hotel_review_df.apply(lambda x : set_family_room(x), axis=1)

Membangun Sistem rekomendasi

Setelah kita mendapatkan metadata dari dataset hotel dan review, kita dapat membangun sistem rekomendasi menggunakan cara sebelumnya yaitu TF-IDF dan Cosine similarity yang sudah dibahas secara singkat di artikel berikut ini.

Sebelum kita ubah dokumen text ke dalam vektor menggunakan TF-IDF, kita lakukan join masing-masing metadata tersebut ke dalam satu kolom menggunakan fungsi agg( ) seperti yang telah dibahas diatas.

Berikut ini code detail di python yang dapat dijalankan di Jupyter notebook

Jika kita perhatikan hasil dari rekomendasi saat ini lebih relevan dibandingkan sebelumnya, dimana saat kita menampilkan rekomendasi dari hotel "Gunawangsa Manyar Hotel" makan akan muncul beberapa hotel yang berlokasi di Surabaya dengan kategori harga yang sama dan juga kategori family room.

Semoga bermanfaat tulisan ini, inshaAllah selanjutnya akan saya bahas tentang Sistem rekomendasi menggunakan weight rating yang bisa kita gabungkan dengan teknik content-based sebagai hybrid sistem rekomendasi.

Referensi

  1. Saket Garodia, Metadata-based Recommender Systems in Python, https://medium.com/analytics-vidhya/metadata-based-recommender-systems-in-python-c6aae213b25c
  2. JCOp Untuk Indonesia, Course 9 -Recommendation System, https://www.youtube.com/playlist?list=PLGn1wRmlR3MvcgYgTp71QXnJaFNUsQga2

Thursday, July 8, 2021

Memahami Collaborative filtering di Sistem rekomendasi

Collaborative filtering adalah teknik dalam sistem rekomendasi yang populer digunakan saat ini. Banyak penelitian yang membahas tentang teknik ini karena beberapa keunggulannya seperti: menghasilkan serendipity(tak terduga) item,  sesuai trend market, mudah diimplementasikan dan memumgkinkan diterapkan pada beberapa domain (book, movies, music, dll). 

Pengenalan sistem rekomendasi dan teknik lainnya bisa anda temukan pada artikel berikut:

Cara kerja teknik ini adalah dengan memanfaatkan data pada komunitas dengan cara mencari kemiripan atar pengguna, yaitu mengasumsikan bahwa pengguna yang memiliki preferensi serupa di masa lalu cenderung memiliki preferensi yang sama di masa depan. Pada dasarnya kita akan lebih percaya dengan rekomendasi dari orang yang memiliki preferensi sama dengan kita, inilah dasar yang digunakan oleh collaborative filtering dalam mengenerate item rekomendasi.


Dalam menghasilkan rekomendasi, sistem perlu mengumpulkan data. Tujuan dari pengumpulan data ini adalah untuk mendapatkan ide preferensi pengguna, dimana nantinya akan dibuat suatu rekomendasi berdasarkan preferensi tersebut. Terdapat 2 cara dalam mengumpulkan data, yaitu: Implicit dan Explicit.

Explicit merupakan cara pengumpulan informasi yang membutuhkan effort dari pengguna dengan memberikan feedback terhadap sistem, seperti mengisikan rating pada item (skala 1-5 atau skala lainnya) dan memilih tombol like atau dislike. Di sisi lain, implisit tidak membutuhkan interaksi dari pengguna ke sistem. Dengan kata lain, sistem secara otomatis mempelajari behavior dari pengguna saat menggunakan sistem, seperti melakukan perekaman informasi lama waktu saat melihat item, genre/kategori apa saja yang sering dilihat dan item apa saja yang pernah dibeli. Cara explisit lebih susah diterapkan, karena tidak semua pengguna melakukan penilaian terhadap item, hal ini yang akan menyebabkan kendala pada teknik collaborative filtering karena banyaknya rating kosong.

Collaborative filtering sendiri terbagi menjadi 2 bagian, yaitu Memory-based dan Model-based. Memory-based melakukan komputasi secara real-time, sedangkan Model-based menggunakan beberapa teknik di machine learning atau matrix factorization untuk melakukan training model terlebih dahulu dan bisa dilakukan secara offline. Memory-based memiliki keunggulan dalam hal kemudahan implementasi tetapi terkendala pada ukuran matrix besar yang menyebabkan scalablity dalam perhitungan. Teknik Memory-based terbagi ke dalam 2 class, yaitu: User-based dan Item-based. Teknik lain yaitu Model-based dengan beberapa metode seperti: Matrix factorization, Neural network, Bayesian, dll akan saya bahas di artikel lain. Kali ini saya akan detail bahas untuk yang Memory-based Collaborative filtering.

Kategori collaborative filtering


User-based vs Item-based CF

Memory-based collaborative filtering sering disebut juga dengan neighborhood-based collaborative filtering algorithms. Berikut ini penjelasan detail dari kedua class dalam Memory-based:

1. User-based collaborative filtering

Merupakan teknik yang digunakan untuk memprediksi item yang mungkin disukai pengguna berdasarkan penilaian yang diberikan pada item tersebut oleh pengguna lain yang memiliki selera yang sama dengan pengguna target. Berikut ini contoh penerapan dalam excel:



Pada matrix diatas, pengguna target adalah Arif, dimana kita akan memprediksi rating pada item_5. Tahap awal yang dilakukan adalah mencari pengguna yang memiliki preferensi sama dengan Arif. Lakukan perhitungan rata-rata rating dari setiap pengguna untuk item selain item_5, dihasilkan seperti berikut:



Kolom terakhir tersebut merupakan rata-rata dari tiap pengguna, misalkan Arif = (5+4+1+4)/4 = 3.50. Jika anda gunakan excel maka akan sangat cepat melakukan hitungan tersebut. Selanjutnya kita buat matrix baru yang berisi selisih dari rating asal dengan nilai rata-rata dari tiap pengguna.


Jika anda perhatikan rating Arif - item_1 didapatkan dari rating asal dikurangkan nilai rerata pengguna, yaitu:  5 - 3.5 = 1.5, rating Arif - item_2, yaitu:  4 - 3.5 = 0.5, dan seterusnya. Tahapan berikutnya adalah kita menghitung nilai similarity antar Arif dengan pengguna lainnya. Disini akan digunaan rumus cosine similarity yaitu seperti ini:

Misalkan kita akan hitung nilai similarity Arif dan Bob, maka didapatkan hasil seperti dibawah:

Dengan bantuan excel cukup kita drag saja rumus tersebut dan hasil dari similarity dari Arif dan ketiga pengguna lainnya adalah sebagai berikut:


Dari hasil perhitungan tersebut terlihat bahwa nilai similarity paling tinggi adalah antar Arif dengan Don yaitu 0.707. Nilai cosine similarity semakin besar nilai nya (mendekati 1) maka semakin mirip kedua vektor tersebut. Selanjutnya adalah prediksi rating untuk pengguna Arif pada item_5. Untuk menentukan prediksi ini kita bisa tentukan threshold/batas nilai kemiripan dari similarity pengguna, misalkan kita asumsikan similarity di dataset ini jika nilainya lebih dari 0.3, maka yang akan kita lakukan perhitungan data dari Arif, Bob dan Don. Clark tidak masuk perhitungan karena nilai similarity dibawah 0.3 (threshold yang kita tentukan). Untuk penentuan nilai threshold ini tidak ada aturan baku, jadi jika anda melakukan eksperimen silahkan di uji coba beberapa nilai threshold yang akan digunakan.

Dari rumus diatas kita bisa melakukan perhitungan untuk prediksi rating Arif ke item_5 dengan menggunakan neighbor Bob dan Don, yaitu nilai rerata Arif dijumlahkan dengan sigma dari nilai similarity antar pengguna dikalikan selisih rating dan rerata dibagi nilai absolute dari similarity beberapa pengguna tersebut.


Hasil dari prediksi rating tersebut (Arif - item_5) adalah 4.425. Bagaimana selanjutnya untuk mengenerate item rekomendasinya? Simulasi diatas hanya prediksi satu rating saja, untuk menghasilkan item rekomendasi kita bisa gunakan data real dengan jumlah data yang besar. Misalkan pada dataset real, rating Arif masih kosong di sejumlah item, misalkan item_5, item_13, item_104, item_451, item_533, dst. Dari hasil perhitungan prediksi pada rating-rating kosong tersebut, kita bisa urutkan dari rating besar ke kecil, kemudian iem-item berdasar rating tersebut bisa kita jadikan list sebagai item rekomendasi, kita juga bisa batasi sejumlah item saja(misal 5 item atau 10 item), atau biasa disebut Top-N recommendations.

2. Item-based collaborative filtering

Item-based collaborative filtering pertama kali digunakan oleh Amazon pada tahun 1998. Teknik ini tidak mencocokan kemiripan antar pengguna, tetapi melakukan pencocokan setiap item yang dinilai/rating pengguna dengan item serupa, lalu menggabungkan item serupa tersebut ke dalam daftar rekomendasi. Secara detail proses nya sebagai berikut:



Pada contoh dataset diatas, kita akan melakukan prediksi dari 3 rating kosong, yaitu: Arif - item_2, Bob - item_3 dan Don - item_1. Rumus yang kita gunakan masih sama pada user-based collaborative filtering, yaitu cosine similarity. Tahap awal adalah kita lakukan proses similarity dari ketga item tersebut, yaitu:

similarity item_1 dan item_2
i1 = 5(B1) + 3(C1)
i2 = 2(B2) + 3(C2)
sim(i1, i2) = (5*2)+(3*3)/sqrt(5^2 + 3^2) . sqrt(2^2 + 3^2) = 0.90

Perhatikan pada perhitungan diatas, hanya rating yang tidak kosong pada kedua item diatas yang dilakukan untuk perhitungannya, yaitu rating pada item_1 dan item_2 yang dinilai oleh Bob dan Clark.


Tabel diatas adalah hasil perhitungan di excel dari similarity ketiga item tersebut. Selanjutnya adalah kita lakukan prediksi untuk rating-rating kosong diatas. Berikut ini contoh perhitungan prediksi untuk rating(Arif, item_2) 

Dari hasil perhitungan di excel dari ketiga rating kosong tersebut didapatkan hasil seperti ini


Proses berikutnya dalam menghasilkan item rekomendasi sama seperti pada proses user-based diatas, yaitu dengan menghitung similarity antar item, melakukan prediksi rating kosong, kemudian melakukan ordering untuk dijadikan item rekomendasi.

Kesimpulan

Collaborative filtering merupakan teknik/paradigma yang populer digunakan dalam sistem rekomendasi. Terdapat 2 metode yang digunakan dalam collaborative filtering yaitu: memory-based dan model-based. Memory-based memiliki keunggulan dalam kemudahan proses perhitunganya tetapi memiliki kendala dalam scalabilty, karena metode ini berjalan secara real-time dan terkendala jika matrix user-item berukuran besar. Dua cara dalam perhitungan di memory-based, yaitu: user-based dan item-based, kedua teknik tersebut sama-sama memanfaatkan rating pengguna terhadap item dalam proses perhitungannya. Pada user-based dilakukan proses perhitungan similarity/kesamaan atara pengguna, sedangkan item-based melakukan proses perhitungan similarity antar item.

Bagaimana kita melakukan siimulasi perhitungan data berukuran besar, pastinya menggunakan excel akan sangat merepotkan. InshaAllah pada artikel berikutnya saya akan bahas cara perhitungan nya menggunakan python di jupyter notebook atau google colab.

Jika anda membutuhkan file excel dari perhitungan diatas, silahkan tuliskan alamat email pada kolom komentar, segera akan saya kirimkan file excel tersebut. Semoga bermanfaat!

Referensi

  1. Recommender System, A Computer Science Comprehensive Exercise, Carleton College, https://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/collaborativefiltering.html
  2. Pengantar Recommender System, Yotube: Mas Baizal, https://www.youtube.com/watch?v=gu-tf3tzMgA&t=20s
  3. F.O.Isinkaye, et al, Recommendation systems: Principles, methods and evaluation, Egyptian Informatics Journal Volume 16, Issue 3, November 2015, Pages 261-273
  4. User-based collaborative filtering, https://www.geeksforgeeks.org/user-based-collaborative-filtering/
  5. Item-to-item based collaborative filtering, https://www.geeksforgeeks.org/item-to-item-based-collaborative-filtering/
  6. Item-based collaborative filtering in Python, https://predictivehacks.com/item-based-collaborative-filtering-in-python/


Wednesday, March 4, 2020

Mengenal Sistem Rekomendasi


Artikel kali ini berkaitan dengan posting saya sebelumnya, saat itu saya tiba-tiba mendapatkan video rekomendasi dari youtube yaitu "[GUIDE] Pebble Screen Tearing Fix". Padahal ketika itu saya sedang exploring video-video smartwatch... Naah kebetulan sekali muncul video tersebut.

Yang jadi pertanyaan adalah.., koq bisa ya Youtube tau apa yang saya butuhkan, atau apa yang bermanfaat buat saya. Teknik ini lah yang disebut dengan Recommendation System atau Sistem Rekomendasi, dimana pengguna akan disuguhkan informasi yang berkaitan dengan item atau karakteristik pengguna tersebut. Menurut saya faktor kebetulan atau Serendipity pada teknik ini sangat kereen, dimana pengguna di tawarkan suatu item/produk yang tak terduga.

Awal mula sistem rekomendasi


Berdasar artikel tahun 1995 tentang social information filtering, saat itu telah ada penelitian di bidang rekomendasi pada database musik yang bernama Ringo, dimana telah dilakukan teknik personalized recommendations. Setelah era berkembangnya internet dan maraknya e-commerce, search engine,  social media dan teknologi berbasis web lainnya, beberapa teknik pada sistem rekomendasi banyak bermuculan untuk menghasilkan item rekomendasi yang lebih baik.

Contoh penggunaan sistem rekomendasi

Peran sistem rekomendasi menjadi penting seiring dengan pertumbuhan data di internet yang sangat pesat dan besar. Dengan meledaknya data-data tersebut, filtering/penyaringan informasi yang berguna/bermanfaat secara personal menjadi bagian yang penting. Disinilah peran sistem rekomendasi dalam melakukan filtering untuk menghasilkan rekomendasi yang baik.

Beberapa perusahaan e-commerce menggunakan sistem rekomendasi untuk menunjang bisnis mereka, seperti: Netflix, Amazon, YouTube, Facebook, Google, MovieLens, Last.fm, Alibaba, eBay, dll.  Dari sejumlah artikel menyebutkan tujuan dari implementasi sistem rekomendasi ini adalah menampilkan list item/produk yang relevan, terbarukan/novelty, kebetulan/serendipity dan beragam/diversity.

MovieLens merupakan salah satu gudang data yang menyediakan data movie, users dan ratings dalam jumlah besar yang sering digunakan oleh banyak peneliti untuk pengujian performa atau membentuk model baru dalam sistem rekomendasi.

Dashboard MovieLens setelah user login
Beberapa sistem rekomendasi pada aplikasi Iflix, Blibli, GoFood dan GrabFood yang memeberikan rekomendasi terkait preference dari pengguna atau item/produk.

Rekomendasi dari iflix beberapa film kartun 😆

Di Blibli saya direkomendasikan membeli Sneakers & Tab ✌😁


Di GrabFood saya disarankan membeli dari resto-resto tersebut

Umumnya terdapat dua pendekatan dalam membangun sistem rekomendasi, yaitu: content-based filtering(CB) dan collaborative filtering(CF), kurang lebih berikut ini detailnya.. 

1. Content-based filtering(CB)

Metode ini memberikan rekomendasi berdasarkan data deskripsi item/produk yang tersedia. Sistem akan mencari persamaan produk berdasarkan deskripsi yang ada. Preferensi pengguna dalam melakukan interaksi terhadap produk akan direkam dan produk dengan kemiripan tertentu akan direkomendasikan kepada pengguna tersebut. Kurang lebih ilustrasi teknik ini seperti pada gambar berikut:

Metode content-based filtering
Pada metode CB ini terdapat beberapa keunggulan, yaitu: 
  • Pengguna akan mendapatkan rekomendasi terhadap produk yang disukainya. 
  • Jika terdapat produk baru akan dengan mudah direkomendasikan jika sesuai dengan karakter produk sejenis. 
Meski demikian terdapat juga beberapa kelemahan pada metode ini: 
  • Tidak bisa memunculkan fitur serendipity, karena jenis produk yang berbeda. 
  • Ekstraksi/pengambilan informasi tipe data video, audio, image sulit dilakukan, karena membutuhkan algoritma yang rumit & kompleks. 
  • Perusahaan bisnis e-commerce tidak dapat ekspansi penjualan produknya, karena tipe produk berbeda tidak muncul sebagai rekomendasi ke pengguna.

2. Collaborative filtering(CF)

Pada CF, sistem memberikan rekomendasi berdasarkan pada karakteristik dari pengguna dengan pengguna yang lain. Oleh karena itu, data history transaksi atau rating dari pengguna menjadi komponen penting dalam metode ini. Misalkan pengguna A membeli kopi, kentang goreng dan telur mata sapi sedangkan pengguna B membeli kopi dan kentang goreng. Maka kemungkinan besar pengguna B juga akan membeli telur mata sapi, karena berdasarkan karakteristik antar pengguna terdapat kecocokan. Konsep inilah yang digunakan oleh metode CF dalam sistem rekomendasi.  Berikut ilustrasi dari metode CF:

Metode collaborative filtering

Di metode CF ini dapat mengatasi kelemahan pada metode CB, yaitu serendipity, dimana pengguna akan merasa surprise mendapatkan rekomendasi produk-produk yang tidak mereka bayangkan sebelumnya. Tetapi di metode CF sistem akan menghasilkan rekomendasi yang baik berdasarkan data rating dari pengguna, kondisi jarangnya data-data tersebut menyebabkan sistem rekomendasi berjalan tidak maksimal, atau istilahnya disebut sparse data.

Artikel terkait detail pembahasan content-based dan collaborative filtering bisa anda telusuri di link berikut ini:
  1. Membangun sistem rekomendasi dengan teknik content-based filtering
  2. Memahami collaborative filtering di sistem rekomendasi

Kesimpulan

Implementasinya kedua metode dalam sistem rekomendasi tersebut digunakan sesuai kebutuhan, misalkan pada bisnis produk yang sejenis bisa menggunakan metode CB, sedangkan untuk produk-produk beragam, metode CF bisa dipilih. Algoritma pada metode CB sebagian besar menggunakan KNN atau teknik searching dan matching, sedangkan di CF lebih beragam lagi algoritma yang digunakan, seperti: neural network atau matrix factorization.

Gabungan metode keduanya, atau biasa disebut dengan metode Hybrid telah banyak dikembangkan juga untuk menghasilkan rekomendasi yang lebih baik. Trend penelitian saat ini banyak ke arah prediksi matrix data untuk mengatasi kendala sparse data di CF atau pengembangan metode hybrid  di sistem rekomendasi dengan berbagai macam teknik.

Bagi mahasiswa yang tertarik mengambil tema penelitian ini, bisa kontak saya untuk diskusi lebih lanjut yaa.. InshaAllah artikel selanjutnya akan saya bahas beberapa teknik implementasi di metode collaborative filtering.

Tuesday, July 12, 2022

Sistem rekomendasi Content-based Filtering menggunakan PHP - MySQL (part 2)

Artikel berikut ini merupakan kelanjutan dari posting sebelumnya tentang implementasi sistem rekomendasi berbasis konten (Content-based filtering Recommender System) pada PHP. Silahkan bisa menyimak terlebih dahulu artikel bagian pertama disini: Sistem rekomendasi Content-based Filtering menggunakan PHP - MySQL (part 1).

Pada project ini, saya menggunakan library Sastrawi untuk melakukan pre-processing data, dan menggunakan library Nette/Database untuk akses ke database mysql, bisa anda cek dokumentasi lengkap di sini: https://doc.nette.org/en/database/core. Dengan menggunakan composer, kita bisa tambahkan code berikut di file composer.json:

{
"require": {
"sastrawi/sastrawi": "^1.2",
"nette/database": "^3.1"
}
}


Kemudian bisa dijalankan perintah composer update pada terminal untuk mendownload beberapa library diatas ke project kita.

Pertama kita siapkan class di PHP untuk menghitung TF-IDF dan Cosine similarity seperti yang sudah dibahas di artikel bagian 1. Kali ini, saya menggunakan nama class Cbrs dan nama file disesuaikan menjadi Cbrs.php. Berikut ini kode lengkap dari class tersebut.

Selanjutnya, kita siapkan file index.php untuk menampilkan daftar list hotel secara random dari tabel di database. Untuk tampilan HTML digunakan Bootstrap CSS supaya lebih rapi. Dan pada bagian akhir, kita buat file detail.php dimana akan menampilkan 1 hotel yang dipilih, dan kemudian akan di cari similarity/kesamaan dari sejumlah hotel dengan score paling besar berdasarkan id hotel yang dipilih tersebut.

Pada kode diatas, terdapat function pre_process() dan get_hotel_detail(), dimana kegunaan fungsi pertama untuk melakukan pembersihan data sebelum masuk ke class perhitungan TF-IDF dan cosine similarity di class Cbrs dan fungsi kedua untuk menampilkan detail hotel berdasarkan parameter id. Variabel $n digunakan untuk menyimpan jumlah item rekomendasi yang akan ditampilkan (top-n). Dan pada bagian perulangan variabel $r ditambahkan keyword continue; untuk menghilangkan item kunci, dimana nilainya = 1 dikarenakan menghitung similarity dari item yang sama. Selain itu, digunakan juga keyword break; untuk keluar dari perulangan jika jumlah n rekomendasi sesuai dengan variabel $n.

Tampilan antar muka detail hotel dan rekomendasi 8 item (beserta score similarity)

Jika anda membutuhkan kode lengkap dari project diatas beserta file database sql, silahkan tuliskan alamat email di bagian komentar. InshaAllah akan segera saya kirimkan ke email anda.


Friday, July 1, 2022

Preprocessing text bahasa Indonesia di PHP dengan Sastrawi

 

the image was taken from https://www.analyticsvidhya.com

Bismillah.. setelah sekian lama belum ada artikel lagi, semoga bisa kembali produktif menulis di blog ini lagi dan terus konsisten  ✌.

Pada beberapa artikel sebelumnya terkait content-based filtering di Sistem rekomendasi, saya menggunakan salah satu library untuk preprocessing text yaitu Sastrawi di Python. Ternyata beberapa mahasiswa menanyakan penggunaan library tersebut di pemrograman PHP. Inilah salah satu alasan adanya artikel ini.

Source code dari Sastrawi bisa anda temukan disini: https://github.com/sastrawi/sastrawi. Library ini sudah ada pada beberapa bahasa pemrograman, seperti: Java, C, Python, Go, Rudy dan tentunya di PHP. Untuk menggunakan di PHP anda bisa melakukan instalasi menggunakan Composer. Apa itu composer? Silahkan beca artikel berikut ini: https://blog.ariflaksito.net/2018/08/berkenalan-dengan-composer.html

Pada terminal atau command line anda bisa menjalankan perintah berikut ini:
php composer.phar require sastrawi/sastrawi:^1

Library ini dapat digunakan untuk melakukan stemming di bahasa Indonesia, yaitu proses untuk menemukan kata dasar dari sebuat kata, dengan menghilangkan semua imbuhan termasuk dari awalan, sisipan, akhiran dan kombinasi dari awalan dan akhiran pada kata turunan.

Contohnya:

  • Menghilang = hilang
  • Terjangkau = jangkau
Selain itu, Sastrawi dapat juga digunakan untuk menghilangkan kata-kata yang memiliki arti tidak penting(stop-words) dalam proses pengolahan text, seperti: dan, atau, yang, dll.

Berikut ini code di PHP berupa fungsi untuk melakukan stemming dan menghapus stop-words:

Output dari code diatas sebagai berikut:

Array
(
    [1] => hotel modern jangkau
    [2] => akomodasi modern nyaman tenang
    [3] => hotel bintang 3 mewah harga jangkau
)

Dari output tersebut terlihat bahwa beberapa kata stop-words dan tanda koma (,) berhasil di hapus dan kata "terjangkau" diubah menjadi bentuk kata dasar "jangkau". Tahapan ini berguna untuk beberapa case berikutnya seperti: text classification, sentiment analysis atau yang akan saya bahas berikutnya yaitu menghitung pembobotan kata dengan TF-IDF untuk sistem rekomendasi berbasis content (content-based filtering).

Selamat mencoba..

Referensi

  1. https://adinyahya.com/cara-penerapan-stemming-dengan-menggunakan-library-sastrawi/
  2. https://github.com/sastrawi/sastrawi

Saturday, March 27, 2021

Simple rekomendasi dengan Formula IMDb Weighted Rating

Alhamdulillah setelah diskusi seputar penelitian bidang sistem rekomendasi dengan rekan-rekan di kampus, akhirnya ter inisialisasi group telegram untuk kolaborasi penelitian dan belajar bersama di bidang information retrieval dan sistem rekomendasi di url berikut: https://t.me/joinchat/CH_ihoMW7XdjZTA1

Oiyaa, siapapun yang ingin belajar bersama boleh koq join di group tersebut, semoga saja bisa bermanfaat. Semoga kita bisa konsisten sharing-sharing setiap akhir pekan.. mohon doanya ya.

Langsung aja degh, kita bahas kembali tentang metode yang sangat simple pada sistem rekomendasi yaitu dengan menggunakan rumus yang ada di IMDb (Internet Movie Database). Metode ini termasuk ke dalam konsep non-personalized, jadi setiap users/costumers akan mendapatkan suatu list item rekomendasi yang sama, tidak ada interferensi dari history atau kemiripan item atau pengguna.

Ide untuk menggunakan metode rekomendasi ini adalah:

  1. Film-film yang lebih populer akan memiliki kemungkinan yang lebih besar untuk disukai juga oleh rata-rata penonton.
  2. Model ini tidak memberikan rekomendasi yang personal untuk setiap tipe user. 
  3. Implementasi model ini pun juga bisa dibilang cukup mudah, yang perlu kita lakukan hanyalah mengurutkan film-film tersebut berdasarkan rating dan popularitas dan menunjukkan film teratas dari list film tersebut.
Berikut ini formula/rumus yang digunakan untuk mengenerate score pada IMDb Weighted rating:


Dimana:
v: jumlah votes untuk film tersebut
m: jumlah minimum votes yang dibutuhkan supaya dapat masuk dalam chart
R: rata-rata rating dari film tersebut
C: rata-rata jumlah votes dari seluruh semesta film
Formula ini digunakan IMDb untuk perhitungan Top Rated 250 titles, dengan perhitungan Bayesian estimate yang menghitung jumlah vote dari setiap judul, vote minimum untuk masuk ke dalam daftar, dan rata – rata vote dari keseluruhan judul.

Berikut ini contoh kode di python (Jupyter notebook) untuk perhitungannya, disini saya masih menggunakan dataset seperti pada artikel sebelumnya untuk rekomendasi dengan metode content-based filtering yaitu di domain hotel.

Code 


Untuk kode lengkap dan dataset yang saya gunakan bisa langsung meluncuuur di github berikut ini: https://github.com/ariflaksito/imdb-wr-recsys.

Untuk skripsi ataupun TA, metode ini terlalu sederhana untuk dijadikan topik/tema penelitian. Saran saya anda bisa menggabungkan dengan metode yang lainnya, misalnya di kombinasikan dengan content-based filtering atau dengan collaborative filtering.

Referensi

  1. DQLab Academy, Building Recommedner system, https://academy.dqlab.id/main/package/practice/212
  2. IMDb, Help, https://help.imdb.com/article/imdb/track-movies-tv/ratings-faq/G67Y87TFYYP6TWAV?ref_=helpms_helpart_inline#calculatetop
 




Friday, July 8, 2022

Sistem rekomendasi Content-based Filtering menggunakan PHP - MySQL (part 1)

Sebelum menyimak dan mengikuti tutorial dalam membangun sistem rekomendasi berbasis konten (content-based filtering) di artikel ini, sebaiknya membaca terlebih dahulu 2 artikel yang saya tulis sebelumnya, karena hal tersebut berkaitan dan saya menggunakan case/domain yang sama seperti sebelumnya.

Berikut artikel yang berkaitan dengan posting ini:

  1. Preprocessing text Bahasa Indonesia di PHP dengan Sastrawi
  2. Menghitung TF-IDF menggunakan kode PHP
Domain item yang akan saya bahas disini adalah data hotel, seperti pada artikel-artikel sebelumnya. Tahapan dalam membangun aplikasi sistem rekomendasi ini diawali dengan melakukan preprocesisng menggunakan library Sastrawi yang ada di PHP, dilanjutkan dengan melakukan pembobotan kata menggunakan metode TF-IDF dan terakhir adalah mengukur jarak kedekatan(similarty) dari 1 item ke item lainnya.

Pada artikel ini akan saya bahas bagian terakhir, yaitu menghitung similarity antar item menggunakan metode cosine similarity dan membuat top-n rekomendasi berdasarkan item yang dipilih. Kedua tahapan sebelumnya sudah ada di artikel yang saya sertakan link diatas 👆.

Cosine similarity

Untuk memudahkan pemahaman cara kerja cosine similarity, saya akan gunakan Spreadsheet untuk perhitungan nya dengan menggunakan contoh data hotel seperti pada case di artikel sebelumnya. Pada contoh data ini terdapat 3 dokumen dan 10 terms/kata yang akan kita ujicoba untuk perhitungan dan sudah kita beri bobot untuk masing-masing terms. Selanjutnya untuk menghitung similarity 2 item kita gunakan rumus berikut:

Pertama kita akan hitung terlebih dahulu sumproduct dari item A dan B, selanutnya kita bagian dengan perkalian panjang vektor A dan B. Pada Spreadsheet kita bisa gunakan formula SUMPRODUCT() sendangkan panjang vektor kita gunakan rumus SQRT(SUMSQ()).

Hasil dari pembobotan kata pada setiap dokumen

Berikut ini contoh rumus dari file Spreadsheet diatas untuk mencari similarity dari item d1 dan d2:

=SUMPRODUCT(C17:L17,C18:L18)/(SQRT(SUMSQ(C17:L17))*SQRT(SUMSQ(C18:L18)))

Selanjutnya kita bisa buat matrix untuk menghitung setiap dokumen. Score cosine similarity mempunyai rentang dari 0 - 1, yang artinya nilai mendekati 1 bearti kedua item tersebut sangat mirip, sedangkan mendekati 0 artinya kedua item tidak mirip. Perhitungan kedua item yang sama akan menghasilkan nilai 1.

Matrix perhitungan similaity antar item

Silahkan tuliskan alamat email anda di bagian komentar jika ingin mendapatkan file Spreadsheet untuk perhitungan seperti pada gambar diatas.

Cosine similarity di PHP

Berdasarkan perhitungan dari Spreadsheet dan rumus diatas, di PHP kita dapat membuat fungsi baru untuk mencari similarity antara 2 item dan mengurutkan hasil kemiripan score dari yang paling besar.

# Fungsi menghitung similarity ke semua dokumen
# parameter input = id dari item
public function similarity($d1){
    $score = [];
    foreach($this->doc_weight as $ndw => $w){
        $score[$ndw] = $this->cosim($d1, $ndw);
    }
    
    arsort($score);
    return $score;
}

private function cosim($d1, $d2){
    $dw = $this->doc_weight;
    
    # sum square dari 2 doc
    $dw1 = $dw[$d1];
    $dw2 = $dw[$d2];
    
    $dx = 0;
    $dx1 = 0;
    $dx2 = 0;
    
    foreach($this->corpus_terms as $t => $terms){
        $dx += $dw1[$t] * $dw2[$t];
        $dx1 += $dw1[$t]*$dw1[$t];
        $dx2 += $dw2[$t]*$dw2[$t]; 
    }
    
    return round($dx / (sqrt($dx1) * sqrt($dx2)), 4);
    
}

Kedua fungsi diatas merupakan kelanjutan kode dari Tfidf.php pada artikel berikut ini: Menghitung TFIDF menggunakan kode PHP, yang perlu anda tambahkan di class Tfidf. Selanjutnya pada file index.php anda bisa menjalankan fungsi tersebut dengan menggunakan parameter index array sebagai dokumen kunci yang akan dicari kemiripannya.

$hotel = array();
$hotel[1] = "Hotel Modern yang Terjangkau";
$hotel[2] = "Akomodasi modern, nyaman, dan tenang";
$hotel[3] = "Hotel bintang 3 yang mewah namun dengan harga yang terjangkau";

foreach($hotel as $key=>$item){
    $hotel[$key] = pre_process($item);
}

$cbrs = new Tfidf();
$cbrs->create_index($hotel);
$cbrs->idf();
$w = $cbrs->weight();  
$r = $cbrs->similarity(1);

print '<pre>';
print_r($r);
print '</pre>';

Dari kode diatas akan menghasilkan score kemiripan dari dokumen kunci(index array) sesuai dengan parameter yang di inputkan pada fungsi similarity.

Array
(
    [1] => 1
    [3] => 0.2062
    [2] => 0.1203
)

Pada posting berikutnya akan saya bahas detail bagaimana menggunakan dataset yang sudah tersimpan di tabel pada database MySQL untuk menampilkan item rekomendasi dari dokumen yang kita pilih.



Saturday, April 17, 2021

Sistem rekomendasi Non-personalized vs Personalized

Di akhir pekan bulan Ramadhan ini kembali lagi saya akan share tentang salah satu topik menarik di sistem rekomendasi yaitu tentang personalisasi. Secara umum sistem rekomendasi terbagi menjadi tipe personalized dan non-personalized.

Sedangkan menurut Kim Falk dalam bukunya "Practical Recommender System" (silahkan bisa tulis alamat email di comment jika ingin versi PDF nya 😉), menjelaskan terdapat 3 tipe level dalam personalisasi ini, yaitu sebagai berikut:

Kim Falk - Practical Recommender System

Mari kita bahas lebih mendalam satu-persatu

1. Non-personalized

Merupakan tipe personalisasi yang sederhana, dimana hasil generate dari teknik rekomendasi ini tidak membedakan antar pengguna. Semua pengguna akan mendapatkan item rekomendasi yang sama. Biasanya digunakan untuk menampilkan item favorit pada film, produk terlaris di e-commerce atau top hits music chart di sistem rekomendasi musik. 

Pada tipe ini kita tidak perlu mengetahui informasi khusus tentang preferensi pengguna. Jadi, kita tidak mengumpulkan data historis dari penilaian atau pembelian pengguna untuk menghasilkan rekomendasi. Pada e-commerce biasanya terdapat juga mode rekomendasi seperti ini "People who buy X also buy Y", misalkan, Orang yang membeli Smartphone juga membeli Phone Cover.

Rekomendasi Non-personalized pada Amazon


Umumnya teknik rekomendasi yang digunakan pada Non-pesonalized yaitu IMDb weight rating atau Content-based filtering

2. Semi/Segment-personalized

Berikutnya adalah personalisasi dengan segmentasi khusus, sebagai contoh pengguna dengan kesamaan usia, lokasi, distinct pattern seperti pengusaha atau pelajar, akan mendapatkan rekomendasi yang sama berdasarkan segment tersebut.

Contoh lainnya adalah seperti pada sistem rekomendasi music yang dijalankan pada smartphone, dimana aplikasi tersebut dapat mendeteksi apakah pengguna sedang bergerak(jogging, running, cycling atau sedang mengemudi) atau pengguna tidak beraktifitas, seperti menikmati kopi di cafe sambil mendengarkan musik, maka item rekomendasi yang dihasilkan akan berbeda dari kedua segment tersebut.

Sistem ini tidak menggunakan history dari data anda, tetapi karena anda berada pada group atau segment tertentu maka akan mendapatkan item rekomendasi yang sama pada setiap segment. Metode yang digunakan pada tipe ini masih sama seperti pada tipe sebelumnya yaitu Non-personalized, dimana dengan tambahan filter berdasarkan segment yang bisa diambil dari informasi pengguna.

3. Personalized

Personalized recommendation ini didasarkan pada data tentang pengguna yang menunjukkan bagaimana pengguna telah berinteraksi dengan sistem sebelumnya. Dengan kata lain, pada rekomendasi ini akan dihasilkan item yang khusus pada masing-masing pengguna.

Tipe rekomendasi ini paling banyak digunakan pada beberapa layanan populer seperti Amazon, Netflix, Youtube, dsb. Hal ini dirasa paling sesuai dengan filter yang dibutuhkan setiap pengguna sehingga sangat perlu di implementasikan pada layanan tersebut. Terdapat 2 cara untuk mendapatkan interaksi dari pengguna ke sistem yaitu dengan cara implisit(browsing history) dan explisit(rating).

Collaborative filtering paling banyak digunakan pada tipe ini, dimana preferensi pengguna akan di komparasi kemiripannya dengan pengguna lain kemudian prediksi rating akan diterapkan untuk mendapatkan item rekomendasi tersebut.

Personalized recommendation di Netflix

Kesimpulan

Jika kita ingin membuat personalized recommendation, maka perhatikan data-data history rating dari pengguna. Jika terdapat pengguna baru dan belum ada history ratingnya, akan menyebabkan hasil rekomendasi kurang sesuai (biasa disebut cold start problem). Sedangkan pada tipe non-personalized dan segment-personalized tidak membutuhkan data rating tersebut, karena menggunakan atribut dari setiap item product.

Sistem rekomendasi dengan tipe Non-personalized merupakan cara yang sederhana, lebih jauh lagi dalam bukunya, Francesco Ricci - Recommender System Handbook, mengatakan bahwa tipe ini efektif dalam beberapa situasi tetapi penelitian tentang Recommender system tidak ditujukan untuk tipe ini.

Tidak perlu dishare artikel ini jika dirasa tidak bermanfaat yaa.. 

Referensi

    1. Anna Makharadze, 1) Introduction to Recommendation Systems, https://medium.com/machine-learning-and-artificial-intelligence/1-introduction-to-recommendation-systems-for-beginners-b50c86f5fccf
    2. Kim Falk, Practical Recommender System
    3. Francesco Ricci, Recommender System Handbook