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

1 comment: