Öneri Sistemleri

Öneri Sistemleri 101 – İçerik Bazlı Filtreleme

Merhaba VBO okuyucuları,

Bir önceki yazımda günümüzde çok popüler olan ‘öneri sistemleri’ konusuna bir giriş yapmıştık, yazıya bu linkten ulaşabilirsiniz. Bu yazımda biraz daha bu işin kodlama kısmına girerek, konuyu detaylandırmak ve çıktıları incelemek istiyorum. Uygulama olarak bir e-ticaret verisi üzerinde, girdi olarak verilen bir ürün için benzer içerikli ürünlerin bulunmasını amaçlıyorum.

Öncelikle teorik kısımla başlayalım:

İçerik bazlı öneri sistemlerinden bahsetmiştik. Bu sistemler, ürünün ya da hizmetin içeriğine göre benzer içerikli ürünleri önermeye dayanır. Burada ürünlerin içeriklerinin/boyutlarının iyi tanımlanıyor olması önemlidir. İçerik bazlı sistemlerin avantaj ve dezavantajlarından bahsedelim:

Avantajları

  • Sistemdeki daha az kullanıcıyla güvenilir sonuçlar elde edilebilir.
  • Özellik seviyesinde öneriler sunulur.
  • Yeni ürünler için de puanlama, satın alma olmadan da öneriler sunulabilir, bu şekilde cold-start problemi çözülmüş olur.

Dezavantajları

  • Ürüne ait yeterli bilgi yoksa, öneri sistemi geçerliliğini yitirebilir.
  • Öğe tabanlı filtreleme durumunda, yalnızca öğe profilleri oluşturulur ve kullanıcılara geçmiş hareketleri yerine derecelendirdikleri veya aradıkları şeye benzer öğeler önerilir. İçerik tabanlı filtreleme sistemi beklenmedik veya şaşırtıcı bir şey önermeyebilir.

Peki, hangi metodları kullanacağız?

2 aşamalı bir öneri sistemi üzerinde çalışacağız.

  1. TF-IDF yöntemi (Term Frequency – Inverse Document Frequency)
  2. Buradaki çıkan sonuçlarla benzerliklerin kurulması.

Öncelikle, TF-IDF  yönteminden bahsedelim:

Bir kelimenin/terimin belli bir dökümanda ne kadar geçtiği ve toplam döküman sayısının bu kelimenin geçtiği döküman sayısına oranlanmasına dayanrak, bu terimin dökümandaki ağırlığını gösteren bir yöntemdir.

TF = Dökümanda x teriminin kaç kere geçtiği / Dökümandaki toplam terim sayısı

IDF =  ln (Toplam döküman sayısı / İçinde x terimi geçen toplam döküman sayısı)

Bu rakamları çıkardık, sonrasında öneriyi nasıl sunacağız?

Öneri sunulurken Cosine benzerliği, Öklid uzaklığı, Pearson Korelasyonu gibi metodlar kullanılır. Kısaca hatırlayalım, kosinüs benzerliği iki vektör arasındaki açının kosinüs değeri, öklid uzaklığı da iki nokta arasındaki uzaklığın ölçümüdür. Pearson korelasyonu ise , iki değişkenin doğrusal olarak ne ölçüde ilişkili olduğunu gösteren -1 ile 1 arasında bir sayıdır.

Şekil 1 : Kosinüs benzerliği ve Öklid uzaklığı görselleştirmesi

Şimdi bir örnek veri seti alalım ve uygulamaya kısmına başlayalım:

Amazon & BestBuy elektronik kategorisi verisini alıyoruz, bu linkten indirebilirsiniz.

data = pd.read_csv('amazon-and-best-buy.csv',encoding = 'unicode_escape')
data.head()

Burada kullanıcı puanlamalarını içeren bir bilgimiz mevcut, puanlama başına kaç kişi kayıt olduğuna bakıyoruz:

data.reviews_rating.value_counts()

Ürün isimlerine göz atmak istersek:

Veri setimiz küçük hacimli ve yeterli ürün benzerlikleri bulamayabiliriz, bu noktada çeşitli metin madenciliği teknikleriyle ürün bilgileri ayrıştırılabilir, ama bu şu anda bizim konumuz olmadığından jenerik bir işlem yapacağız. Numerik değerlerin karışıklığa sebep olmaması için tüm numerik değerleri silebileceğimiz bir fonksiyon yazıyoruz:

data['name'] = data['name'].map(lambda x: ''.join([i for i in x if i.isalpha() or i.isspace()]))

Sklearn bize TF-IDF metodu için TdidfVectorizer paketini sağlıyor.

from sklearn.feature_extraction.text import TfidfVectorizer

Yüklememizi yaptıktan sonra, burada dil problemi ile karşılaşıyoruz, bu paket sadece İngilizce içerikleri karşılıyor. Bizim veri setimiz İngilizce olduğu için bu problem oluşturmuyor ancak yine de Türkçe verilerde kullanabilmek adına şu kodu uygulamak gerekir:

from nltk.corpus import stopwords
stopw_turkish = stopwords.words('english') + stopwords.words('turkish')

Şimdi fonksiyonumuzu işleme alabiliriz:

tf = TfidfVectorizer(analyzer='word', ngram_range=(1, 3), min_df=0, stop_words='english')

Not: Buradaki paramatreler uğraştığımız probleme/ veriye göre değişebilir. Parametre özelliklerini bu linkten inceleyebiliriz.

Sonrasında matris oluşturuyoruz:

tfidf_matrix = tf.fit_transform(data['name'])

Şimdi benzerlikleri bulmak için aşağıdaki uygulamayı yapıyoruz:

from sklearn.metrics.pairwise import linear_kernel
cos_sim = linear_kernel(tfidf_matrix, tfidf_matrix)

Burada iki vektör arasındaki açıya bağlı bir skalar değer elde etmiş oluyoruz.

Şimdi bir fonksiyon ile bu benzerliklere göre önerileri getiren bir fonksiyon kullanıyoruz.

ind = pd.Series(data['name'].index, index=data['name']).drop_duplicates()
def reco(name, cos_sim=cos_sim):
    id1 = ind[name]
    similar_sc = list(enumerate(cos_sim[id1]))
    similar_sc= sorted(similar_sc, key=lambda x: x[0:1], reverse=True)
    similar_sc= similar_sc[1:11]
    prod_ind = [i[0] for i in similar_sc]
    return data['name'].iloc[prod_ind].unique()
reco('Logitech   Harmony Ultimate One Device Universal Infrared Remote with Customizable Touch Screen Control  Black')

Sonuç olarak belirtilen ürün için önerileri almış olduk. Burada veri seti hacmi ve öncesinde veri manipülasyonlarına fazla girmediğimizden, daha farklı uygulamalarda daha efektif sonuçlar alabiliriz. Aşağıda kaynakça kısmında kullanılan uygulamaları daha detaylı inceleyebilirsiniz. Ben Datacamp üzerindeki uygulamayı uygun bulduğumdan benzer bir uygulama yaptım. Yorumlarınız için şimdiden teşekkürler!

Kaynakça:

https://scikit-learn.org/stable/modules/metrics.html

Şekil 1 : https://stackoverflow.com/questions/53173654/best-way-to-identify-dissimilarity-euclidean-distance-cosine-distance-or-simp

https://medium.com/@bindhubalu/content-based-recommender-system-4db1b3de03e7

https://www.priyanshumadan.com/posts/wayfair-product-recommendation-python/

https://jjwoo.github.io/capstone/

https://www.datacamp.com/community/tutorials/recommender-systems-python

Yazar Hakkında
Toplam 9 yazı
Sena Merter Dereli
Sena Merter Dereli
Pazarlama & Müşteri Analitiği Araştırmacısı / n11.com'da Pazarlama Analitiği Yöneticisi
Yorumlar (Yorum yapılmamış)

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara