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

Monday, November 16, 2020

Menggunakan Python di Jupyter notebook

Python merupakan bahasa pemrograman yang diciptakan pada tahun 1991 oleh Guido van Russom dimana akhir-akhir ini merupakan bahasa pemrograman yang banyak dicari dan dipelajari bagi mereka yang fokus mendalami dunia data.

Python merupakan salah satu bahasa pemrograman yang berkembang dengan cepat, selain dari perkembangan library yang semakin kuat karena banyaknya library dan framework seperti scikit-learn, Tensorflow, Pytorch, dan lainnya yang membuat para pencinta Artificial Intelligence, Machine Learning, dan Deep Learning lebih memilih Python sebagai tools untuk mengembangkan riset dan penelitian mereka.

Di artikel ini akan dibahas cara singkat instalasi Python dan juga Jupyter notebook sebelum nanti akan kita pelajari lagi detail dasar-dasar pemrograman di Python khususnya untuk Data science atau Machine learning.

File instalasi Python bisa di download dari web python.org yang saat ini terdapat 2 versi yaitu 2.7.x dan versi 3.x, sebaiknya kita pilih saja yang versi 3.x 

www.python.org

Ikuti petunjuk instalasinya dan aktifkan fitur “Add python.exe to Path” saat pemilihan check fitur instal supaya perintah python dapat dapat dijalankan di command prompt nantinya. Setelah berhasil melakukan instalasi, kita dapat mencoba dengan menjalankan perintah python dan pip dari command di windows. 

The Python Package Index (PyPI) merupakan repository untuk library/paket di Python yang berada di pypi.org. Dengan menggunakan perintah pip kita bisa melakukan menajemen paket tersebut di local environment.

Jupyter notebook

Jupyter notebook merupakan tool yang populer untuk mengolah code di python. Jupyter notebook memungkinkan untuk mengintegrasikan antara kode dengan output di dalam satu dokumen secara interaktif.

Jupyter notebook dapat di install melalui command dengan perintah: 

pip install jupyter

Selain itu jupyter notebook juga dapat di install menggunakan platform Anaconda, selengkapnya bisa dibaca disini https://docs.anaconda.com/anaconda/install/

Cara menjalankan Jupyter notebook adalah dengan menuliskan perintah jupyter notebook di terminal atau command. Selanjutnya Jupyter notebook dapat diakses melalui browser. Saat servis dijalankan anda akan diarahkan ke halaman browser pada alamat http://localhost:8888/tree

Tampilan awal saat membuka Jupyter notebook

Untuk membuat notebook baru, bisa dilakukan dengan memilih menu [New] pada bagian kanan atas, kemudian bisa pilih tipenya Python3. Halaman notebook baru akan tampil seperti dibawah ini:

Tampilan notebook di browser


Hal penting yang perlu diperhatikan adalah bagian Cell, dimana nantinya kita akan menuliskan code Python atau Markdown text. Untuk judul notebok bisa kita ganti dengan cara double klik pada tulisan Untitled, kemudian tuliskan nama/judul dari notebook tersebut.

Selanjutnya kita akan gunakan beberapa shortcut di Jupyter notebook untuk mempercepat dan memudahkan dalam melakukan editing code/text di cell. Bisa perhatikan saat cell aktif akan berwarna hijau, sedangkan cell yang tidak aktif berwarna biru. Untuk keluar dari aktif cell, tekan tombol [Esc] dan kembali mengaktifkan cell tekan [Enter]. 

Untuk melihat beberapa tombol shortcut yang ada kita bisa keluar dari aktif cell kemudian tekan tombol [H].

Beberapa tombol shortcut di Jupyter notebook

Berikut beberapa shortcut yang sering digunakan: merubah ke mode code [Y] dan merubah ke mode markdown [M]. Menulis heading di Markdown dengan tombol [1] untuk heading 1, tombol [2] heading 2 dan tombol [3] heading 3. Menambahkan cell diatasnya dengan tombol [A] dan tombol [B] untuk menambah cell dibawahnya. Menghapus cell klik 2x tombol [D].

Pastikan saat menjalankan kondisi tersebut tidak berada di aktif cell, kita bisa tekan terlebih dahulu tombol [Esc]. Dan untuk menjalankan cell/Run kita lakukan dengan menekan tombol [Shift+Enter].

Share notebook

Setelah kita menuliskan code-code di notebook, kita bisa membagikan file tersebut secara statis ataupun dinamis. Kita bisa gunakan github untuk share notebook secara statis, dimana code dan hasilnya sudah ready pada file .ipynb dan bisa kita push ke repository di github. Sedangkan secara dinamis kita bisa gunakan Google colab, dengan cara upload file .ipynb dan selanjutnya kita bisa jalankan pada Google colab code-code tersebut.

Silahkan di eksplore lebih jauh lagi untuk penggunaan Jupyter notebook, semakin sering anda menggunakan maka akan semakin paham fitur-fitur didalamnya. Semoga bermanfaat..

Referensi

  1. Guntur Wicaksono, “Pengenalan Pemrograman Python Untuk Data Science”, https://medium.com/@gunturwicaksono/pengenalan-pemrograman-python- untuk-data-science-aa18ca6ff995
  2. Ahmad Muhardian, Belajar Pemrograman Python: Cara Install Python di Windows, https://www.petanikode.com/python-windows/
  3. Belajar Python Dasar : Memahami Jupyter Notebook dan cara menggunakannya, https://ngodingdata.com/memahami-jupyter-notebook- dan-cara-menggunakannya/
  4. IndoML,Pengenalan dan Panduan Jupyter Notebook untuk Pemula,https://indoml.com/2019/09/29/pengenalan-dan-panduan-jupyter-notebook-untuk-pemula/

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