forked from jw995/AIML-recommanding-system-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWebserver.py
More file actions
90 lines (75 loc) · 3.25 KB
/
Copy pathWebserver.py
File metadata and controls
90 lines (75 loc) · 3.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# A simulation framework
import logging
from DatabaseInterface import DatabaseInterface
from RecEngine import RecEngine
from Ranker import Ranker
from Learners.OfflineLearner import OfflineLearner
from Learners.OnlineLearner import OnlineLearner
from UserAnalyzer import UserAnalyzer
from ModelStore import ModelStore
class WebServer(object):
logging.basicConfig(level=logging.INFO)
def __init__(self, configMap):
self.db = DatabaseInterface(configMap['data_dir'])
# numberToServe: the number of items finally served to the users
self.numberToServe = configMap['numberToServe']
self.log = logging.getLogger(__name__)
def start(self):
# each object here simulates the API calls through network
# passing an object A to the constructor of B means A will communication to B
self.db.startEngine()
self.ranker = Ranker(self.numberToServe, self.db)
self.userAnalyzer = UserAnalyzer()
self.modelStore = ModelStore()
self.offlineLearner = OfflineLearner(self.db, self.modelStore)
self.onlineLearner = OnlineLearner(self.db, self.modelStore)
self.offlineLearner.trainModel()
# when we start the webserver, we should let offline learner to train the models,
# such that, after the start(), we can start to give recommendation
self.recEngine = RecEngine(self.userAnalyzer, self.modelStore, self.db.extract(DatabaseInterface.USER_ACTIVITY_KEY))
def getAction(self, action):
assert(isinstance(action, Action))
# taking the action from users
self.onlineLearner.trainModel(action)
# analyze action type, and save the registered user's action
actionType = self.userAnalyzer.analyzeAction(action)
if actionType == "registered":
self.log.info("Recording action %s" %action)
self.db.putAction(action)
def provideRecommendation(self, request):
# return the ID's for the recommended items
assert(isinstance(request, Request))
# provide recommendations to user
self.log.info("responding to request: %s" %request)
recommendations = self.recEngine.provideRecommendation(request)
recsReranked = self.ranker.rerank(recommendations)
return recsReranked # a list of item ids
def renderRecommendation(self, request):
assert(isinstance(request, Request))
recsReranked = self.provideRecommendation(request)
# for the purpose of testing, we sort the index, output item names
# output is ordered by the id value
return self.db.extract(DatabaseInterface.INVENTORY_KEY).loc[recsReranked].sort_index()
def increment(self):
self.log.info("incrementing the system, update the models")
# increment the whole system by one day, trigger offline training
self.offlineLearner.trainModel()
self.modelStore.cleanOnlineModel()
self.recEngine.resetCache()
# for demo purpose, given an itemId, return the item name
def getFromInventory(self, itemId):
return self.db.extract(DatabaseInterface.INVENTORY_KEY).loc[itemId]
# simulate a web request
class Request(object):
def __init__(self, userId):
self.userId = userId
def __str__(self):
return "request for user: "+str(self.userId)
# simulate a tracking event or a user's rating
class Action(object):
def __init__(self, userId, itemId,rating):
self.userId = userId
self.itemId = itemId
self.rating = rating
def __str__(self):
return "user: %s, item: %s, rating %s" %(self.userId, self.itemId, self.rating)