def test_deviation(self): taylor_swift = {"Amy": 4, "Ben": 5, "Daisy": 5} PSY = {"Amy": 3, "Ben": 2, "Clara": 3.5} slope = SlopeOne() self.assertEqual(2, slope.deviation(taylor_swift, PSY)["deviation"])
def test_deviation(self): taylor_swift = {'Amy': 4, 'Ben': 5, 'Daisy': 5} PSY = {'Amy': 3, 'Ben': 2, 'Clara': 3.5} slope = SlopeOne() self.assertEqual(2, slope.deviation(taylor_swift, PSY)['deviation'])
class UserWrapper: def __init__(self, db=None): if db == None: client = MongoClient(config.db_config['host'], config.db_config['port']) self.db = client.hypertarget_ads else: self.db = db self.user_similarity = UserSimilarity(self.db) self.slope_one = SlopeOne(self.db) def get_user(self, user_id): user_id = int(user_id) user = self.db.users.find_one({'id': user_id}, {'_id': 0}) return user def get_next_id(self): max_id = self.db.users.find({}, { 'id': 1, '_id': 0 }).sort([('id', -1)]).limit(1)[0]['id'] return int(max_id) + 1 def register_user(self, data): user = { 'age': data['age'], 'sex': data['sex'], 'occupation': data['occupation'], 'id': self.get_next_id(), 'zip_code': data['zip_code'] } self.user_similarity.update_user_similarity(user) self.db.users.insert(user) return def rate_movie(self, data): self.slope_one.update_deviation(data) new_rating = {'rating': data['rating'], 'timestamp': time.time()} key = 'ratings.' + str(data['movie_id']) self.db.users.update({'id': data['user_id']}, {'$set': { key: new_rating }}) return
def test_predict_rating(self): slopeone = SlopeOne(self.db) result = slopeone.predict_rating(479, 2) if result is False: print "Test Case: PREDICT RATING: FAIL" else: print "Test Case: PREDICT RATING: PASS" return result
def __init__(self, db=None): if db == None: client = MongoClient(config.db_config['host'], config.db_config['port']) self.db = client.hypertarget_ads else: self.db = db self.user_similarity = UserSimilarity(self.db) self.slope_one = SlopeOne(self.db)
class UserWrapper: def __init__(self, db=None): if db == None: client = MongoClient(config.db_config["host"], config.db_config["port"]) self.db = client.hypertarget_ads else: self.db = db self.user_similarity = UserSimilarity(self.db) self.slope_one = SlopeOne(self.db) def get_user(self, user_id): user_id = int(user_id) user = self.db.users.find_one({"id": user_id}, {"_id": 0}) return user def get_next_id(self): max_id = self.db.users.find({}, {"id": 1, "_id": 0}).sort([("id", -1)]).limit(1)[0]["id"] return int(max_id) + 1 def register_user(self, data): user = { "age": data["age"], "sex": data["sex"], "occupation": data["occupation"], "id": self.get_next_id(), "zip_code": data["zip_code"], } self.user_similarity.update_user_similarity(user) self.db.users.insert(user) return def rate_movie(self, data): self.slope_one.update_deviation(data) new_rating = {"rating": data["rating"], "timestamp": time.time()} key = "ratings." + str(data["movie_id"]) self.db.users.update({"id": data["user_id"]}, {"$set": {key: new_rating}}) return
def __init__(self, db=None): if db == None: client = MongoClient(config.db_config['host'], config.db_config['port']) self.db = client.hypertarget_ads else: self.db = db self.user_similarity = UserSimilarity(self.db) self.slope_one = SlopeOne(self.db) self.pool = Pool(processes=10) self.recommended_movies = {}
def __init__(self, db=None): if db == None: client = MongoClient(config.db_config["host"], config.db_config["port"]) self.db = client.hypertarget_ads else: self.db = db self.user_similarity = UserSimilarity(self.db) self.slope_one = SlopeOne(self.db)
def __init__(self, db = None): if db == None: client = MongoClient(config.db_config['host'], config.db_config['port']) self.db = client.hypertarget_ads else: self.db = db self.user_similarity = UserSimilarity(self.db) self.slope_one = SlopeOne(self.db) self.pool = Pool(processes = 10) self.recommended_movies = {}
class Recommendare: def __init__(self, db=None): if db == None: client = MongoClient(config.db_config['host'], config.db_config['port']) self.db = client.hypertarget_ads else: self.db = db self.user_similarity = UserSimilarity(self.db) self.slope_one = SlopeOne(self.db) self.pool = Pool(processes=10) self.recommended_movies = {} def user_prediction(self, user_id, movie, neighbour): if not movie in self.recommended_movies.keys(): self.recommended_movies[movie] = { 'slope_rating': self.slope_one.predict_rating(user_id, int(movie)), 'neighbours': [] } self.recommended_movies[movie]['neighbours'].append({ 'neighbour_id': neighbour['user_id'], 'neighbour_rating': self.user_similarity.get_user_rating_for(neighbour['user_id'], movie), 'neighbour_similarity': neighbour['similarity'] }) def rate_neighbours_movies(self, user_id, count): neighbours = self.user_similarity.get_neighbours_movies(user_id, k=3) all_movies = [] for neighbour in neighbours: all_movies.append(set(neighbour['movies'])) temp = set.intersection(*all_movies) if len(temp) >= count: all_movies = temp else: all_movies = set.union(*all_movies) for neighbour in neighbours: for n_movie in neighbour['movies']: if n_movie in all_movies: self.pool.apply_async(self.user_prediction, (user_id, n_movie, neighbour)) self.pool.close() self.pool.join() def get_recommended_movies(self, user_id, count): if len(self.recommended_movies) == 0: self.rate_neighbours_movies(user_id, count) return self.recommended_movies def recommend(self, user_id, count): movies_list = self.get_recommended_movies(user_id, count) recommendations = [] for movie in movies_list: num = 0 den = 0 for neighbour in movies_list[movie]['neighbours']: num += neighbour['neighbour_similarity'] * neighbour[ 'neighbour_rating'] den += neighbour['neighbour_similarity'] if den == 0: predicted_rating = 0 else: predicted_rating = num / float(den) if predicted_rating == 0: predicted_rating = movies_list[movie]['slope_rating'] else: predicted_rating = ( predicted_rating + movies_list[movie]['slope_rating']) / float(2) recommendations.append((movie, predicted_rating)) return sorted(recommendations, key=itemgetter(1), reverse=True)[:count]
from pymongo import MongoClient from usersimilarity import UserSimilarity from slopeone import SlopeOne client = MongoClient('localhost', 27017) db = client.hypertarget_ads slope = SlopeOne(db) similarity = UserSimilarity(db) slope.dump_deviation_matrix() similarity.dump_similarity_matrix()
class Recommendare: def __init__(self, db = None): if db == None: client = MongoClient(config.db_config['host'], config.db_config['port']) self.db = client.hypertarget_ads else: self.db = db self.user_similarity = UserSimilarity(self.db) self.slope_one = SlopeOne(self.db) self.pool = Pool(processes = 10) self.recommended_movies = {} def user_prediction(self, user_id, movie, neighbour): if not movie in self.recommended_movies.keys(): self.recommended_movies[movie] = { 'slope_rating': self.slope_one.predict_rating(user_id, int(movie)), 'neighbours': [] } self.recommended_movies[movie]['neighbours'].append({ 'neighbour_id': neighbour['user_id'], 'neighbour_rating': self.user_similarity.get_user_rating_for(neighbour['user_id'], movie), 'neighbour_similarity': neighbour['similarity'] }) def rate_neighbours_movies(self, user_id, count): neighbours = self.user_similarity.get_neighbours_movies(user_id, k = 3) all_movies = [] for neighbour in neighbours: all_movies.append(set(neighbour['movies'])) temp = set.intersection(*all_movies) if len(temp) >= count: all_movies = temp else: all_movies = set.union(*all_movies) for neighbour in neighbours: for n_movie in neighbour['movies']: if n_movie in all_movies: self.pool.apply_async(self.user_prediction, (user_id, n_movie, neighbour)) self.pool.close() self.pool.join() def get_recommended_movies(self, user_id, count): if len(self.recommended_movies) == 0: self.rate_neighbours_movies(user_id, count) return self.recommended_movies def recommend(self, user_id, count): movies_list = self.get_recommended_movies(user_id, count) recommendations = [] for movie in movies_list: num = 0 den = 0 for neighbour in movies_list[movie]['neighbours']: num += neighbour['neighbour_similarity'] * neighbour['neighbour_rating'] den += neighbour['neighbour_similarity'] if den == 0: predicted_rating = 0 else: predicted_rating = num / float(den) if predicted_rating == 0: predicted_rating = movies_list[movie]['slope_rating'] else: predicted_rating = (predicted_rating + movies_list[movie]['slope_rating']) / float(2) recommendations.append((movie, predicted_rating)) return sorted(recommendations, key = itemgetter(1), reverse = True)[:count]