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:
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:
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.
Halo, apakah saya dapat meminta file Spreadsheet ?
ReplyDeletetitoanggoro19@gmail.com
Sudah saya kirim ke email, silahkan cek inbox. Thanks
DeleteHy, Mohon DIkirim FIle Spreadsheet, fpalawa@gmail.com
ReplyDeleteCek inbox, sudah dikirim filenya
Deletepermisi pak, mohon izin minta minta file file Spreadsheet diatas
ReplyDeleteemail saya : rikyardi17@gmail.com
terima kasih banyak pak
Sudah terkirim, cek inbox yaa
DeleteIzin dikirimkan file spreadsheetnya kang Timotiusardi19@gmail.com
ReplyDeleteSudah dikirim di email
Deletepermisi pak, mohon izin minta file Spreadsheetnya , sofianaira24@gmail.com
ReplyDeletepermisi pak, boleh saya minta file spreadsheet tersebut?
ReplyDeletebalanarlynx@gmail.com
Permisi pak. Izin minta file spreadshett nya pak. firdanurfalah8@gmail.com
ReplyDeleteOk, cek email yaa
Delete