2016-08-07 2 views
0

나는 맥주 추천 엔진을 만들려고 노력했다. 나는 간단히 tf-idf와 Cosine 유사성을 사용하기로 결정했다. 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. 를 사용하는 방법
  3. 최대 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'] 
관련 문제