2016-08-07 68 views
0

我一直在試圖建立一個啤酒推薦引擎,我決定簡單地使用tf-idf和餘弦相似度。如何使用tf-idf和餘弦相似度建立推薦系統?

這裏是我到目前爲止的代碼:`

import pandas as pd  
import re 
import numpy as np 
from bs4 import BeautifulSoup 
from sklearn.feature_extraction.text import TfidfVectorizer 
from nltk.corpus import stopwords 
from nltk.stem import WordNetLemmatizer 
wnlzer = WordNetLemmatizer() 


train = pd.read_csv("labeledTrainData.tsv" , header = 0 , \ 
    delimiter = '\t' , quoting = 3) 


def raw_string_to_list_clean_string(raw_train_review): 
    remove_html = BeautifulSoup(raw_train_review).text 
    remove_punch = re.sub('[^A-Za-z ]' , "" , remove_html) 
    token = remove_punch.lower().split() 
    srm_token = [wnlzer.lemmatize(i) for i in token if not i in set(stopwords.words('english'))] 
    clean_text = " ".join(srm_token) 
    return(clean_text) 

ready_train_list = [] 
length = len(train['review']) 
for i in range(0 , length): 
    if (i%100 == 0): 
     print "doing %d of %d of training data set" % (i+1 , length) 
    a = raw_string_to_list_clean_string(train['review'][i]) 
    ready_train_list.append(a) 

vectorizer = TfidfVectorizer(analyzer = "word" , tokenizer = None , preprocessor = None , \ 
    stop_words = None , max_features = 20000) 
training_our_vectorizer = vectorizer.fit_transform(ready_train_list)` 

現在我知道如何使用餘弦相似,但我無法弄清楚:

  1. 如何利用餘弦
  2. 如何將建議限制爲最多5種啤酒
+0

你是什麼意思的「如何使用餘弦」呢?你想用它來找出用戶之間或項目之間的相似性。 關於你的第二個問題 - 簡單的答案是「前5名」。但更確切地說,你需要找到推薦的項目列表,並且它假設從最佳匹配到最差匹配 - 然後向用戶呈現僅前5個。 –

+0

我的意思是當我使用餘弦相似與一個與其餘的它是給一個非常好的矩陣。喜歡爲如果我使用這第一行然後它給[1,0.5,0.23,0.045,.........],現在我明白這個矩陣代表什麼,但我怎麼去使用這個? –

+0

我;對於這個問題抱歉:你知道關於Collaborative_filtering(https://en.wikipedia.org/wiki/Collaborative_filtering)的內容嗎?這個鏈接可以提供一些重要的信息。但無論如何 - 對於您的問題 - 對於給定的用戶,您應該選擇K個最相似的用戶(可以從您的餘弦矩陣中提取該用戶),並且預測所有項目的評分,給定用戶如果他/她必須評價他們。然後,你所要做的就是從預測的評級列表中選出前5名(這意味着這些項目可能是'最喜歡的')。 –

回答

0

一個簡單的實現方法是計算th每個使用cdist其他啤酒電子距離,然後用argsort回報您的建議:

from scipy.spatial.distance import cdist 
import numpy as np 

vec = TfidfVectorizer() 
beerlist = np.array(['heinekin lager', 'corona lager', 'heinekin ale', 'budweiser lager']) 
beerlist_tfidf = vec.fit_transform(beerlist).toarray() 
beer_tfidf = vec.transform(['heinekin lager']).toarray() 
rec_idx = cdist(beer_tfidf, beerlist_tfidf, 'cosine').argsort() 
print(beerlist[rec_idx[0][1:]]) 

#['heinekin ale' 'corona lager' 'budweiser lager']