Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # CS1300 Fall 2017
- # Author: Gerald Robinson
- # Recitation: Ganesh 123
- # Assignment 10
- #PART_1 functions here
- def read_books(file_name):
- try:
- file=open(file_name)
- if file =="":
- return []
- else:
- result=[]
- for line in file:
- temp = line.strip().split(',')
- author = temp[0]
- book = temp[1]
- list = [book, author]
- result.append(list)
- return result
- except:
- return None
- def read_users(file_name):
- try:
- file=open(file_name)
- if file == "":
- return {}
- else:
- mydict={}
- listofratings=[]
- for line in file:
- read = []
- line = line.strip().split()
- user=line[0]
- for i in range(1, len(line)):
- listofratings.append(line[i])
- read = [user, listofratings]
- mydict[read[0]]=list(map(int,line[1:]))
- return mydict
- except:
- return None
- def calculate_average_rating(ratings_dict):
- ratings_list = ratings_dict.values()
- rateNumbers = len(ratings_list)
- numBooks = len(ratings_list)
- avg_rates=[]
- for i in range(numBooks):
- index = 0
- num = 0.0
- for listofratings in ratings_list:
- num=num+float(listofratings[i])
- if listofratings!=0:
- index = index+1.0
- if num != 0:
- avg=num/index
- avg_rates.append(avg)
- return avg_rates
- def lookup_average_rating(index, book_dict, avg_ratings_dict):
- books = book_dict[index]
- rate = "{0: .2f}".format(avg_ratings_dict[index])
- titles=books[0]
- authors=books[1]
- return "(%s) %s by %s"%(rating, titles, authors)
- #PART_2 follow here
- class Recommender:
- #Constructor here
- def __init__(self, book_filename, ratings_filename):
- self.book_list = []
- self.user_dictionary = {}
- self.average_rating_list = []
- self.read_books(book_filename)
- self.read_users(ratings_filename)
- self.calculate_average_rating()
- def read_books(self, file_name):
- try:
- file=open(file_name)
- if file =="":
- return []
- else:
- for line in file:
- temp = line.strip().split(',')
- authors = temp[0]
- books = temp[1]
- list = [books, authors]
- self.book_list.append(list)
- return self.book_list
- except:
- return None
- def read_users(self, file_name):
- try:
- file=open(file_name,'r')
- if file == "":
- return {}
- else:
- listofratings=[]
- for line in file:
- read = []
- line = line.strip().split()
- user=line[0]
- for i in range(1, len(line)):
- listofratings.append(line[i])
- read = [user, listofratings]
- self.user_dictionary[read[0]]=list(map(int,line[1:]))
- return self.user_dictionary
- except:
- return None
- def calculate_average_rating(self):
- ratings_list = self.user_dictionary.values()
- rateNumbers = len(ratings_list)
- numBooks = len(ratings_list)
- for i in range(numBooks):
- index = 0
- num = 0.0
- for listofratings in ratings_list:
- num=num+float(listofratings[i])
- if listofratings!=0:
- index = index+1.0
- if num != 0:
- avg=num/index
- self.average_rating_list.append(avg)
- return self.average_rating_list
- def lookup_average_rating(self, book_index):
- books = self.book_list[book_index]
- rate = "{0: .2f}".format(self.average_rating_list[book_index])
- titles=books[0]
- authors=books[1]
- average_rating_string="(%s) %s by %s"%(rating, titles, authors)
- return average_rating_string
- self.average_rating_string = "(%s) %s by %s"%(rating, titles, authors)
- return self.average_rating_string
- def calc_similarity(self, user1, user2):
- similar=0
- for i in range(1,len(self.user_dictionary[user1])):
- similar=similar+(self.user_dictionary[user1[i]]*self.user_dictionary[user2][i])
- return similar
- def get_most_similar_user(self, current_user_id):
- highScore=0
- best_user_match_id=""
- for i in range(1, len(self.user_dictionary)):
- if current_user_id == self.user_dictionary.keys()[i]:
- continue
- similarity=self.calc_similarity(current_user_id, self.user_dictionary.keys()[i])
- if similarity>highScore:
- highScore=similarity
- best_user_match_id=self.user_dictionary.keys()[i]
- return best_user_match_id
- def recommend_books(self, current_user_id):
- list=[]
- similarUser=self.get_most_similar_user(current_user_id)
- for i, rating in enumerate(self.user_dictionary[similarUser]):
- if rating and self.user_dictionary[current_user_id][i]==0:
- list.append(self.lookup_average_rating(i))
- return list
- def main():
- name=Recommender("book.txt","ratings.txt")
- mylist=name.read_books("book.txt")
- print mylist
- # print lookup_average_rating(0, read_books('books.txt'),calculate_average_rating('ratings.txt'))
- #test your functions and classes here
- if __name__ == "__main__":
- main()
Add Comment
Please, Sign In to add comment