Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- За корисникот внесен на влез да се препорача филм. Да се користи Пирсонов коефициент на корелација како мерка. Ако корисникот го нема во базата да се препорача најгледаниот филм. Доколку корисникот има гледано повеќе од 5 филмови, да се препорача според филмовите, во спротивно да се препорача според корисниците кои се слични со него.
- from __future__ import print_function
- import json
- from math import sqrt
- # A dictionary of movie critics and their ratings of a small set of movies
- critics = {
- 'Lisa Rose': {'Catch Me If You Can': 3.0, 'Snakes on a Plane': 3.5, 'Superman Returns': 3.5,
- 'You, Me and Dupree': 2.5, 'The Night Listener': 3.0, 'Snitch': 3.0},
- 'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5, 'Just My Luck': 1.5, 'The Night Listener': 3.0,
- 'You, Me and Dupree': 3.5},
- 'Michael Phillips': {'Catch Me If You Can': 2.5, 'Lady in the Water': 2.5, 'Superman Returns': 3.5,
- 'The Night Listener': 4.0, 'Snitch': 2.0},
- 'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'The Night Listener': 4.5, 'Superman Returns': 4.0,
- 'You, Me and Dupree': 2.5},
- 'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0, 'Just My Luck': 2.0, 'Superman Returns': 3.0,
- 'You, Me and Dupree': 2.0},
- 'Jack Matthews': {'Catch Me If You Can': 4.5, 'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,
- 'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5, 'Snitch': 4.5},
- 'Toby': {'Snakes on a Plane': 4.5, 'Snitch': 5.0},
- 'Michelle Nichols': {'Just My Luck': 1.0, 'The Night Listener': 4.5, 'You, Me and Dupree': 3.5,
- 'Catch Me If You Can': 2.5, 'Snakes on a Plane': 3.0},
- 'Gary Coleman': {'Lady in the Water': 1.0, 'Catch Me If You Can': 1.5, 'Superman Returns': 1.5,
- 'You, Me and Dupree': 2.0},
- 'Larry': {'Lady in the Water': 3.0, 'Just My Luck': 3.5, 'Snitch': 1.5, 'The Night Listener': 3.5}
- }
- def sim_distance(oceni,person1,person2):
- si={}
- for item in oceni[person1]:
- if item in oceni[person2]:
- si[item]=1
- if len(si)==0: return 0
- sum_of_squares=sum([pow(oceni[person1][item]-oceni[person2][item],2)
- for item in oceni[person1] if item in oceni[person2]])
- return 1/(1+sqrt(sum_of_squares))
- def sim_pearson(oceni,person1,person2):
- si={}
- for item in oceni[person1]:
- if item in oceni[person2]: si[item]=1
- n=len(si)
- if n==0: return 0
- sum1=sum([oceni[person1][it] for it in si])
- sum2=sum([oceni[person2][it] for it in si])
- sum1Sq=sum([pow(oceni[person1][it],2) for it in si])
- sum2Sq=sum([pow(oceni[person2][it],2) for it in si])
- pSum=sum([oceni[person1][it]*oceni[person2][it] for it in si])
- num=pSum-(sum1*sum2/n)
- den=sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))
- if den==0: return 0
- r=num/den
- return r
- def transformPrefs(prefs):
- result = {}
- for person in prefs:
- for item in prefs[person]:
- result.setdefault(item,{})
- result[item][person]=prefs[person][item]
- return result
- def topMatches(prefs,person,n=4,similarity=sim_pearson):
- scores=[(similarity(prefs,person,other),other)
- for other in prefs if other!=person]
- scores.sort()
- scores.reverse()
- return scores[0:n]
- def getUserBasedRecommendations(oceni,korisnik,similarity=sim_pearson):
- totals={}
- simSums={}
- for other in oceni:
- if other==korisnik: continue
- sim=similarity(oceni,korisnik,other)
- if sim<=0: continue
- for item in oceni[other]:
- if item not in oceni[korisnik] or oceni[korisnik][item]==0:
- totals.setdefault(item,0)
- totals[item]+=oceni[other][item]*sim
- simSums.setdefault(item,0)
- simSums[item]+=sim
- rankings=[(total/simSums[item],item) for item,total in totals.items()]
- rankings.sort()
- rankings.reverse()
- rankings = rankings[0:3]
- return rankings
- def getItemBasedRecomendations(oceni,korisnik,similarity=sim_pearson):
- similar={}
- films=transformPrefs(oceni)
- for gledanFilm in oceni[korisnik]:
- similar_filmovi=topMatches(films,gledanFilm)
- for slicnost,slicen_film in similar_filmovi:
- if slicen_film not in oceni[korisnik] and (slicen_film not in similar or slicnost>similar[slicen_film]):
- similar[slicen_film]=slicnost
- rankings=sorted(similar, key=similar.get)
- rankings.reverse()
- rankings=rankings[0:3]
- rankings.sort()
- return rankings
- def transformoceni(oceni):
- result={}
- for person in oceni:
- for item in oceni[person]:
- result.setdefault(item,{})
- result[item][person]=oceni[person][item]
- return result
- def item_based(critics, person1, n=3):
- oceni_po_film = transformoceni(critics)
- similarity_per_item = {}
- for item in critics[person1].keys():
- similar_items = topMatches(oceni_po_film, item, n=None)
- my_rating = critics[person1][item]
- for similarity, item in similar_items:
- if item in critics[person1] or similarity <= 0:
- continue
- similarity_per_item.setdefault(item, [])
- similarity_per_item[item].append(similarity * my_rating)
- similarity_per_item_avg = []
- import numpy as np
- for item in similarity_per_item:
- avg_sim = np.mean(similarity_per_item[item])
- similarity_per_item_avg.append((avg_sim, item))
- similarity_per_item_avg.sort(reverse=True)
- return similarity_per_item_avg[:n]
- if __name__ == "__main__":
- korisnik = input()
- inverse = transformoceni(critics)
- korisniciIFilmovi = inverse.items()
- korisniciIFilmovi.sort(key=lambda tup: len(tup[1].items()), reverse=True)
- najgledan = korisniciIFilmovi[0][0]
- if not korisnik in critics:
- print(najgledan)
- exit()
- oceniNaKorisnik = critics[korisnik]
- filmoviNaKorisnik = oceniNaKorisnik.keys()
- imaPoveke = False
- for k in critics:
- if k != korisnik:
- brojac = 0
- for film in filmoviNaKorisnik:
- brojac += 1
- if brojac > 5:
- imaPoveke = True
- if imaPoveke:
- print (str(getItemBasedRecomendations(critics, korisnik)[0]))
- else:
- print (str(getUserBasedRecommendations(critics, korisnik)[0][1]))
Add Comment
Please, Sign In to add comment