Guest User

Untitled

a guest
Aug 19th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.96 KB | None | 0 0
  1. import random
  2. import pymongo
  3. from pymongo import Connection
  4.  
  5.  
  6. def insert(db, user, item):
  7. db.users.update({'user': user}, {'$set': {'user': user, 'items.%s' % item: 1}}, True)
  8. current_user = db.users.find_one({'user': user})
  9. for current_item, current_mark in current_user['items'].items():
  10. db.similarity.update(
  11. {'item_1': current_item, 'item_2': item},
  12. {'$set': {'item_1': current_item, 'item_2': item, 'similarity': 1}},
  13. True
  14. )
  15. db.similarity.update(
  16. {'item_2': current_item, 'item_1': item},
  17. {'$set': {'item_2': current_item, 'item_1': item, 'similarity': 1}},
  18. True
  19. )
  20.  
  21.  
  22. def get_recommendations(db, user):
  23. current_user = db.users.find_one({'user': user})
  24. candidates = {}
  25. for similar in db.similarity.find(
  26. {'item_1': {'$in': current_user['items'].keys()}}
  27. ):
  28. candidates.setdefault(similar['item_2'], 0)
  29. candidates[similar['item_2']] += 1
  30. result = sorted(
  31. [{'k': k, 'v': v} for k, v in candidates.items() if k not in current_user['items']],
  32. key=lambda item: item['v'], reverse=True
  33. )
  34. #print result
  35. return result
  36.  
  37.  
  38. def fill(db, user_count=100, per_user_items=20):
  39. db.users.drop()
  40. db.similarity.drop()
  41. db.users.ensure_index('user')
  42. db.similarity.ensure_index([
  43. ('item_1', pymongo.ASCENDING), ('item_2', pymongo.ASCENDING)
  44. ])
  45. for i in xrange(user_count):
  46. for t in xrange(per_user_items):
  47. item = random.randrange(i, i+10)
  48. #print 'Adding user %d and item %d...' % (i, item)
  49. insert(db, i, item)
  50.  
  51.  
  52. def fetch(db, user_count=100):
  53. for user in xrange(user_count):
  54. recommendations = get_recommendations(db, user)
  55.  
  56. def benchmark(users_count=20, items_per_user=10):
  57. connection = Connection()
  58. db = connection.test_schema1
  59. fill(db, users_count, items_per_user)
  60. fetch(db, users_count)
  61.  
  62. if __name__ == '__main__':
  63. benchmark()
Add Comment
Please, Sign In to add comment