blob: fb3c7fde05869f874398043b9b8005f075d5a0bd [file] [log] [blame]
import datetime
from operator import itemgetter, attrgetter
# can get sample data here:
# wget http://www.grouplens.org/system/files/ml-100k.zip
# app data file config
APPDATA_DIRNAME = "ml-100k"
USERS_FILENAME = "u.user"
USERS_FILE_DELIMITER = "|"
ITEMS_FILENAME = "u.item"
ITEMS_FILE_DELIMITER = "|"
RATE_ACTIONS_FILENAME = "u.data"
RATE_ACTIONS_DELIMITER = "\t"
class User:
def __init__(self, uid):
self.uid = uid
self.rec = [] # recommendations, list of iid
def __str__(self):
return "User[uid=%s,rec=%s]" % (self.uid, self.rec)
class Item:
def __init__(self, iid, name):
self.iid = iid
self.name = name
def __str__(self):
return "Item[iid=%s,name=%s]" % (self.iid, self.name)
class RateAction:
def __init__(self, uid, iid, rating, t):
self.uid = uid
self.iid = iid
self.rating = rating
self.t = t
def __str__(self):
return "RateAction[uid=%s,iid=%s,rating=%s,t=%s]" % (self.uid, self.iid, self.rating, self.t)
class AppData:
def __init__(self):
self._users = {} # dict of User obj
self._items = {} # dict of Item obj
self._rate_actions = [] # list of RateAction obj
self._users_file = "%s/%s" % (APPDATA_DIRNAME, USERS_FILENAME)
self._items_file = "%s/%s" % (APPDATA_DIRNAME, ITEMS_FILENAME)
self._rate_actions_file = "%s/%s" % (APPDATA_DIRNAME, RATE_ACTIONS_FILENAME)
self.__init_users()
self.__init_items()
self.__init_rate_actions()
def __init_users(self):
"""
uid|
"""
print "[Info] Initializing users..."
f = open(self._users_file, 'r')
for line in f:
data = line.rstrip('\r\n').split(USERS_FILE_DELIMITER)
self.add_user(User(data[0]))
f.close()
print "[Info] %s users were initialized." % len(self._users)
def __init_items(self):
"""
iid|name
"""
print "[Info] Initializing items..."
f = open(self._items_file, 'r')
for line in f:
data = line.rstrip('\r\n').split(ITEMS_FILE_DELIMITER)
self.add_item(Item(data[0], data[1]))
f.close()
print "[Info] %s items were initialized." % len(self._items)
def __init_rate_actions(self):
"""
uid|iid|rating|timestamp
"""
print "[Info] Initializing rate actions..."
f = open(self._rate_actions_file, 'r')
for line in f:
data = line.rstrip('\r\n').split(RATE_ACTIONS_DELIMITER)
t = datetime.datetime.utcfromtimestamp(int(data[3])).isoformat()
self.add_rate_action(RateAction(data[0], data[1], data[2], t))
f.close()
print "[Info] %s rate actions were initialized." % len(self._rate_actions)
def add_user(self, user):
self._users[user.uid] = user
def add_item(self, item):
self._items[item.iid] = item
def add_rate_action(self, action):
self._rate_actions.append(action)
def get_users(self):
return self._users
def get_items(self):
return self._items
def get_rate_actions(self):
return self._rate_actions
def get_user(self, uid):
"""return single user
"""
if uid in self._users:
return self._users[uid]
else:
return None
def get_item(self, iid):
"""return single item
"""
if iid in self._items:
return self._items[iid]
else:
return None
def get_top_rated_items(self, uid, n):
"""get top n rated iids by this uid
"""
if uid in self._users:
actions = filter(lambda u: u.uid==uid, self._rate_actions)
top = sorted(actions, key=attrgetter('rating'), reverse=True)
topn_iids = map(lambda a: a.iid, top[:n])
return topn_iids
else:
return None
def get_top_rate_actions(self, uid, n):
"""get top n rated actions by this uid
"""
if uid in self._users:
actions = filter(lambda u: u.uid==uid, self._rate_actions)
top = sorted(actions, key=attrgetter('rating'), reverse=True)
return top[:n]
else:
return None