Kemudraj

januari_preporaki

Aug 22nd, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.83 KB | None | 0 0
  1. За корисникот внесен на влез да се препорача филм. Да се користи Пирсонов коефициент на корелација како мерка. Ако корисникот го нема во базата да се препорача најгледаниот филм. Доколку корисникот има гледано повеќе од 5 филмови, да се препорача според филмовите, во спротивно да се препорача според корисниците кои се слични со него.
  2.  
  3. from __future__ import print_function
  4. import json
  5. from math import sqrt
  6.  
  7. # A dictionary of movie critics and their ratings of a small set of movies
  8. critics = {
  9.     'Lisa Rose': {'Catch Me If You Can': 3.0, 'Snakes on a Plane': 3.5, 'Superman Returns': 3.5,
  10.                   'You, Me and Dupree': 2.5, 'The Night Listener': 3.0, 'Snitch': 3.0},
  11.     'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5, 'Just My Luck': 1.5, 'The Night Listener': 3.0,
  12.                      'You, Me and Dupree': 3.5},
  13.     'Michael Phillips': {'Catch Me If You Can': 2.5, 'Lady in the Water': 2.5, 'Superman Returns': 3.5,
  14.                          'The Night Listener': 4.0, 'Snitch': 2.0},
  15.     'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'The Night Listener': 4.5, 'Superman Returns': 4.0,
  16.                      'You, Me and Dupree': 2.5},
  17.     'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0, 'Just My Luck': 2.0, 'Superman Returns': 3.0,
  18.                      'You, Me and Dupree': 2.0},
  19.     'Jack Matthews': {'Catch Me If You Can': 4.5, 'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,
  20.                       'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5, 'Snitch': 4.5},
  21.     'Toby': {'Snakes on a Plane': 4.5, 'Snitch': 5.0},
  22.     'Michelle Nichols': {'Just My Luck': 1.0, 'The Night Listener': 4.5, 'You, Me and Dupree': 3.5,
  23.                          'Catch Me If You Can': 2.5, 'Snakes on a Plane': 3.0},
  24.     'Gary Coleman': {'Lady in the Water': 1.0, 'Catch Me If You Can': 1.5, 'Superman Returns': 1.5,
  25.                      'You, Me and Dupree': 2.0},
  26.     'Larry': {'Lady in the Water': 3.0, 'Just My Luck': 3.5, 'Snitch': 1.5, 'The Night Listener': 3.5}
  27. }
  28.  
  29. def sim_distance(oceni,person1,person2):
  30.     si={}
  31.     for item in oceni[person1]:
  32.         if item in oceni[person2]:
  33.             si[item]=1
  34.     if len(si)==0: return 0
  35.     sum_of_squares=sum([pow(oceni[person1][item]-oceni[person2][item],2)
  36.     for item in oceni[person1] if item in oceni[person2]])
  37.     return 1/(1+sqrt(sum_of_squares))
  38.  
  39. def sim_pearson(oceni,person1,person2):
  40.     si={}
  41.     for item in oceni[person1]:
  42.         if item in oceni[person2]: si[item]=1
  43.     n=len(si)
  44.     if n==0: return 0
  45.     sum1=sum([oceni[person1][it] for it in si])
  46.     sum2=sum([oceni[person2][it] for it in si])
  47.     sum1Sq=sum([pow(oceni[person1][it],2) for it in si])
  48.     sum2Sq=sum([pow(oceni[person2][it],2) for it in si])
  49.     pSum=sum([oceni[person1][it]*oceni[person2][it] for it in si])
  50.     num=pSum-(sum1*sum2/n)
  51.     den=sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))
  52.     if den==0: return 0
  53.     r=num/den
  54.     return r
  55.    
  56. def transformPrefs(prefs):
  57.     result = {}
  58.     for person in prefs:
  59.         for item in prefs[person]:
  60.             result.setdefault(item,{})
  61.             result[item][person]=prefs[person][item]
  62.     return result
  63.  
  64. def topMatches(prefs,person,n=4,similarity=sim_pearson):
  65.     scores=[(similarity(prefs,person,other),other)
  66.             for other in prefs if other!=person]
  67.     scores.sort()
  68.     scores.reverse()
  69.     return scores[0:n]
  70.  
  71. def getUserBasedRecommendations(oceni,korisnik,similarity=sim_pearson):
  72.     totals={}
  73.     simSums={}
  74.     for other in oceni:
  75.         if other==korisnik: continue
  76.         sim=similarity(oceni,korisnik,other)
  77.         if sim<=0: continue
  78.         for item in oceni[other]:
  79.             if item not in oceni[korisnik] or oceni[korisnik][item]==0:
  80.                 totals.setdefault(item,0)
  81.                 totals[item]+=oceni[other][item]*sim
  82.                 simSums.setdefault(item,0)
  83.                 simSums[item]+=sim
  84.                
  85.     rankings=[(total/simSums[item],item) for item,total in totals.items()]
  86.     rankings.sort()
  87.     rankings.reverse()
  88.     rankings = rankings[0:3]
  89.     return rankings
  90.    
  91. def getItemBasedRecomendations(oceni,korisnik,similarity=sim_pearson):
  92.     similar={}
  93.     films=transformPrefs(oceni)
  94.     for gledanFilm in oceni[korisnik]:
  95.             similar_filmovi=topMatches(films,gledanFilm)
  96.             for slicnost,slicen_film in similar_filmovi:
  97.                 if slicen_film not in oceni[korisnik] and (slicen_film not in similar or slicnost>similar[slicen_film]):
  98.                     similar[slicen_film]=slicnost
  99.    
  100.     rankings=sorted(similar, key=similar.get)
  101.     rankings.reverse()
  102.     rankings=rankings[0:3]
  103.     rankings.sort()
  104.     return rankings
  105.    
  106.  
  107. def transformoceni(oceni):
  108.     result={}
  109.     for person in oceni:
  110.         for item in oceni[person]:
  111.             result.setdefault(item,{})
  112.             result[item][person]=oceni[person][item]
  113.     return result
  114.  
  115.  
  116. def item_based(critics, person1, n=3):
  117.     oceni_po_film = transformoceni(critics)
  118.     similarity_per_item = {}
  119.     for item in critics[person1].keys():
  120.         similar_items = topMatches(oceni_po_film, item, n=None)
  121.         my_rating = critics[person1][item]
  122.         for similarity, item in similar_items:
  123.             if item in critics[person1] or similarity <= 0:
  124.                 continue
  125.             similarity_per_item.setdefault(item, [])
  126.             similarity_per_item[item].append(similarity * my_rating)
  127.     similarity_per_item_avg = []
  128.     import numpy as np
  129.     for item in similarity_per_item:    
  130.         avg_sim = np.mean(similarity_per_item[item])
  131.         similarity_per_item_avg.append((avg_sim, item))
  132.     similarity_per_item_avg.sort(reverse=True)
  133.     return similarity_per_item_avg[:n]
  134.  
  135. if __name__ == "__main__":
  136.     korisnik = input()
  137.     inverse = transformoceni(critics)
  138.     korisniciIFilmovi = inverse.items()
  139.  
  140.     korisniciIFilmovi.sort(key=lambda tup: len(tup[1].items()), reverse=True)
  141.  
  142.     najgledan = korisniciIFilmovi[0][0]
  143.  
  144.     if not korisnik in critics:
  145.         print(najgledan)
  146.         exit()
  147.  
  148.     oceniNaKorisnik = critics[korisnik]
  149.     filmoviNaKorisnik = oceniNaKorisnik.keys()
  150.  
  151.     imaPoveke = False
  152.     for k in critics:
  153.         if k != korisnik:
  154.             brojac = 0
  155.             for film in filmoviNaKorisnik:
  156.                 brojac += 1
  157.  
  158.             if brojac > 5:
  159.                 imaPoveke = True
  160.  
  161.  
  162.     if imaPoveke:
  163.         print (str(getItemBasedRecomendations(critics, korisnik)[0]))
  164.     else:
  165.         print (str(getUserBasedRecommendations(critics, korisnik)[0][1]))
Add Comment
Please, Sign In to add comment