Advertisement
StJimmy

Испит Системи за препоракa

Dec 24th, 2016
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.32 KB | None | 0 0
  1. oceniPoKorisnici = {
  2.     'Lisa Rose': {'Catch Me If You Can': 3.0, 'Snakes on a Plane': 3.5, 'Superman Returns': 3.5,
  3.                   'You, Me and Dupree': 2.5, 'The Night Listener': 3.0, 'Snitch': 3.0},
  4.     'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5, 'Just My Luck': 1.5, 'The Night Listener': 3.0,
  5.                      'You, Me and Dupree': 3.5},
  6.     'Michael Phillips': {'Catch Me If You Can': 2.5, 'Lady in the Water': 2.5, 'Superman Returns': 3.5,
  7.                          'The Night Listener': 4.0, 'Snitch': 2.0},
  8.     'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'The Night Listener': 4.5, 'Superman Returns': 4.0,
  9.                      'You, Me and Dupree': 2.5},
  10.     'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0, 'Just My Luck': 2.0, 'Superman Returns': 3.0,
  11.                      'You, Me and Dupree': 2.0},
  12.     'Jack Matthews': {'Catch Me If You Can': 4.5, 'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,
  13.                       'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5, 'Snitch': 4.5},
  14.     'Toby': {'Snakes on a Plane': 4.5, 'Snitch': 5.0},
  15.     'Michelle Nichols': {'Just My Luck': 1.0, 'The Night Listener': 4.5, 'You, Me and Dupree': 3.5,
  16.                          'Catch Me If You Can': 2.5, 'Snakes on a Plane': 3.0},
  17.     'Gary Coleman': {'Lady in the Water': 1.0, 'Catch Me If You Can': 1.5, 'Superman Returns': 1.5,
  18.                      'You, Me and Dupree': 2.0},
  19.     'Larry': {'Lady in the Water': 3.0, 'Just My Luck': 3.5, 'Snitch': 1.5, 'The Night Listener': 3.5}
  20. }
  21.  
  22. from math import *
  23. import math
  24.  
  25.  
  26. # Vrakja merka za slicnost bazirana na rastojanieto za person1 i person2
  27. def sim_distance(prefs, person1, person2):
  28.     si = {}
  29.     for item in prefs[person1]:
  30.         if item in prefs[person2]:
  31.             si[item] = 1
  32.     if len(si) == 0: return 0
  33.     sum_of_squares = sum([pow(prefs[person1][item] - prefs[person2][item], 2)
  34.                           for item in prefs[person1] if item in prefs[person2]])
  35.     return (round(1 / (1 + math.sqrt(sum_of_squares)), 2))
  36.  
  37.  
  38. def sim_pearson(prefs, person1, person2):
  39.     si = {}
  40.     for item in prefs[person1]:
  41.         if item in prefs[person2]:
  42.             si[item] = 1
  43.     n = len(si)
  44.     if len(si) == 0: return 0
  45.     sum1 = sum([prefs[person1][item] for item in si])
  46.     sum2 = sum([prefs[person2][item] for item in si])
  47.     sum1Sq = sum([pow(prefs[person1][item], 2) for item in si])
  48.     sum2Sq = sum([pow(prefs[person2][item], 2) for item in si])
  49.     pSum = sum([prefs[person1][item] * prefs[person2][item] for item in si])
  50.     num = pSum - (sum1 * sum2 / n)
  51.     den = math.sqrt((sum1Sq - pow(sum1, 2) / n) * (sum2Sq - pow(sum2, 2) / n))
  52.     if den == 0: return 0
  53.     r = num / den
  54.     return (round(r, 2))
  55.  
  56.  
  57. def transformPrefs(prefs):
  58.     result = {}
  59.     for person in prefs:
  60.         for item in prefs[person]:
  61.             result.setdefault(item, {})
  62.             result[item][person] = prefs[person][item]
  63.     return result
  64.  
  65.  
  66. def topMatches(prefs, person, n=5, similarity=sim_pearson):
  67.     scores = [(similarity(prefs, person, other), other)
  68.               for other in prefs if other != person]
  69.     scores.sort()
  70.     scores.reverse()
  71.     return scores[0:n]
  72.  
  73.  
  74. def getRecommendations(prefs, person, similarity=sim_pearson, n=3):
  75.     totals = {}
  76.     simSums = {}
  77.     for other in prefs:
  78.  
  79.         if other == person: continue
  80.         sim = similarity(prefs, person, other)
  81.  
  82.         if sim <= 0: continue
  83.         for item in prefs[other]:
  84.  
  85.             if item not in prefs[person] or prefs[person][item] == 0:
  86.                 totals.setdefault(item, 0)
  87.                 totals[item] += prefs[other][item] * sim
  88.  
  89.                 simSums.setdefault(item, 0)
  90.                 simSums[item] += sim
  91.  
  92.     rankings = [(total / simSums[item], item) for item, total in totals.items()]
  93.  
  94.     rankings.sort()
  95.  
  96.     rankings.reverse()
  97.     return rankings[0:n]
  98.  
  99.  
  100. def getUserBasedRecomendations(oceni, korisnik, similarity=sim_pearson):
  101.     rankings = []
  102.     slicni = getRecommendations(oceni, korisnik)
  103.     for item in slicni:
  104.         rankings.append(item[1])
  105.  
  106.     rankings = rankings[0:3]
  107.     rankings.sort()
  108.     return rankings
  109.  
  110.  
  111. def getItemBasedRecomendations(oceni, korisnik, similarity=sim_pearson):
  112.     rankings = []
  113.     itembased = transformPrefs(oceni)
  114.     movies = oceniPoKorisnici[korisnik]
  115.     preporaka = []
  116.     for movie in movies:
  117.         slicni = topMatches(itembased, movie)
  118.         for slicen in slicni:
  119.             ocenka = slicen[0]
  120.  
  121.             if slicen[1] not in movies and ocenka >= 0:
  122.                 preporaka.append(slicen)
  123.     preporaka.sort()
  124.     preporaka.reverse()
  125.     preporaka2 = []
  126.     for preporaki in preporaka:
  127.         if preporaki[1] not in preporaka2:
  128.             preporaka2.append(preporaki[1])
  129.     rankings = preporaka2[0:3]
  130.     rankings.sort()
  131.  
  132.     return rankings
  133.  
  134. def recomend_movie(oceni, korinik, n):
  135.     filmovi_na_korisnik = oceniPoKorisnici[korisnik].keys()
  136.     i = len(filmovi_na_korisnik)
  137.     if (i < n):
  138.         print "item-based"
  139.         print str(getItemBasedRecomendations(oceni, korisnik, similarity=sim_pearson))
  140.     else:
  141.         print "user-based"
  142.         print str(getUserBasedRecomendations(oceni, korisnik, similarity=sim_pearson))
  143.  
  144.  
  145. #def square_rooted(x):
  146.     #return round(sqrt(sum([a * a for a in x])), 3)
  147.  
  148.  
  149. def cosine_similarity(oceni,p1,p2):
  150.     zaednicki = {}
  151.     for item in oceni[p1]:
  152.         if item in oceni[p2]: zaednicki[item] = 1
  153.  
  154.     numerator = sum([oceni[p1][it] * oceni[p2][it] for it in zaednicki])
  155.     denominator = sqrt(sum([oceni[p1][it]*oceni[p1][it] for it in zaednicki])) * sqrt(sum([oceni[p2][it]*oceni[p2][it] for it in zaednicki]))
  156.  
  157.     if denominator == 0:
  158.         return -1
  159.     vkupno= round(numerator / float(denominator),2)
  160.     return vkupno
  161. def manhatan(oceni,p1,p2):
  162.     zaednicki = {}
  163.     for item in oceni[p1]:
  164.         if item in oceni[p2]: zaednicki[item] = 1
  165.     vkupno1=sum([oceni[p1][z] for z in zaednicki])
  166.     vkupno2=sum([oceni[p2][z] for z in zaednicki])
  167.     vkupno=abs(vkupno1-vkupno2)
  168.     return vkupno
  169. def jaccard(oceni,p1,p2):
  170.     zaednicki = {}
  171.     for item in oceni[p1]:
  172.         if item in oceni[p2]: zaednicki[item] = 1
  173.     presek=len(set.intersection(*[set(oceni[p1]),set(oceni[p2])]))
  174.     #print presek
  175.     unija=len(set.union(*[set(oceni[p1]),set(oceni[p2])]))
  176.     #print unija
  177.  
  178.     return round((presek/float(unija)),2)
  179.  
  180.  
  181. def transformoceni(oceni):
  182.     result={}
  183.     for person in oceni:
  184.         for item in oceni[person]:
  185.             result.setdefault(item,{})
  186.             # Zameni gi mestata na licnosta i predmetot
  187.             result[item][person]=oceni[person][item]
  188.  
  189.     return result
  190. def similarity(recnik,film):
  191.     total={}
  192.     for item in recnik.keys():
  193.          if item!=film:
  194.             total.setdefault(item,{})
  195.             total[item]=(cosine_similarity(recnik,film,item),sim_pearson(recnik,film,item),sim_distance(recnik,film,item),manhatan(recnik,film,item),jaccard(recnik,film,item))
  196.     return total
  197.  
  198. if __name__ == "__main__":
  199.     film = input()
  200.  
  201.     filmovi=transformoceni(oceniPoKorisnici)
  202.     lista = similarity(filmovi, film)
  203.  
  204.     lista1 = lista.items()
  205.     lista1.sort()
  206.     for x in lista1:
  207.         print x[0]
  208.         print x[1][0], x[1][1], x[1][2], x[1][3],x[1][4]
  209.         print '\n'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement