| # To run this example app |
| # |
| # Please execute all commands from repository root. |
| # |
| # Step 1. Get sample data and unzip it. |
| # > wget http://www.grouplens.org/system/files/ml-100k.zip |
| # > unzip ml-100k.zip |
| # |
| # Step 2. Configurate examples/itemrec/movies/appdata.py |
| # |
| # Step 3. Run this app: |
| # python -m examples.itemrec.movies.movie_rec_app |
| |
| from appdata import AppData |
| import predictionio |
| import sys |
| |
| from app_config import APP_KEY, API_URL |
| |
| ENGINE_NAME = 'movie-rec' |
| |
| class App: |
| |
| def __init__(self): |
| self._app_data = AppData() |
| self._client = predictionio.Client(APP_KEY, 1, API_URL) |
| |
| def run(self): |
| state = "[Main Menu]" |
| |
| prompt = "\n"\ |
| "%s\n"\ |
| "%s\n"\ |
| "Please input selection:\n"\ |
| " 0: Quit application.\n"\ |
| " 1: Get Recommendations from PredictionIO.\n"\ |
| " 2: Display user's data." % (state, '-'*len(state)) |
| |
| while True: |
| print prompt |
| choice = raw_input().lower() |
| if choice == '0': |
| print "\nGood Bye!\n" |
| break |
| elif choice == '1': |
| self.recommend_task(state) |
| elif choice == '2': |
| self.display_user_task(state) |
| else: |
| print '[Error] \'%s\' is not a valid selection.' % choice |
| |
| self._client.close() |
| |
| def recommend_task(self, prev_state): |
| state = prev_state + " / [Get Recommendations]" |
| prompt = "\n"\ |
| "%s\n"\ |
| "%s\n"\ |
| "Please enter user id:" % (state, '-'*len(state)) |
| |
| while True: |
| print prompt |
| choice = raw_input().lower() |
| u = self._app_data.get_user(choice) |
| if u: |
| n = 10 |
| print "[Info] Getting top %s item recommendations for user %s..." % (n, u.uid) |
| try: |
| self._client.identify(u.uid) |
| rec = self._client.get_itemrec_topn(ENGINE_NAME, n) |
| u.rec = rec['pio_iids'] |
| self.display_items(u.rec) |
| except predictionio.ItemRecNotFoundError: |
| print "[Info] Recommendation not found" |
| |
| print "[Info] Go back to previous menu..." |
| break |
| else: |
| print "[Error] invalid user id %s. Go back to previous menu..." % choice |
| break |
| |
| def display_user_task(self, prev_state): |
| state = prev_state + " / [Display User]" |
| prompt = "\n"\ |
| "%s\n"\ |
| "%s\n"\ |
| "Please enter user id:" % (state, '-'*len(state)) |
| |
| while True: |
| print prompt |
| choice = raw_input().lower() |
| u = self._app_data.get_user(choice) |
| if u: |
| print "[Info] User %s:" % u.uid |
| n = 10 |
| topn_rate_actions = self._app_data.get_top_rate_actions(u.uid, n) |
| print "\n[Info] Top %s movies rated by this user:" % n |
| self.display_rate_actions(topn_rate_actions) |
| |
| print "\n[Info] Movies recommended to this user:" |
| self.display_items(u.rec) |
| |
| self.wait_for_ack() |
| print "\n[Info] Go back to previous menu..." |
| break |
| else: |
| print "[Error] invalid user id %s. Go back to previous menu..." % choice |
| break |
| |
| def display_items(self, iids, all_info=False): |
| """print item info for each iid in the list |
| """ |
| if iids: |
| for iid in iids: |
| item = self._app_data.get_item(iid) |
| if item: |
| if all_info: |
| print "[Info] %s" % item |
| else: |
| print "[Info] %s" % item.name |
| else: |
| print "[Error] Invalid item id %s" % iid |
| else: |
| print "[Info] Empty." |
| |
| def display_rate_actions(self, actions): |
| """print iid and rating |
| """ |
| if actions: |
| for a in actions: |
| item = self._app_data.get_item(a.iid) |
| if item: |
| print "[Info] %s, rating = %s" % (item.name, a.rating) |
| else: |
| print "[Error] Invalid item id %s" % a.iid |
| else: |
| print "[Info] Empty." |
| |
| def wait_for_ack(self): |
| |
| prompt = "\nPress enter to continue..." |
| print prompt |
| choice = raw_input().lower() |
| |
| |
| if __name__ == '__main__': |
| |
| print "\nWelcome To PredictionIO Python-SDK Demo App!" |
| print "============================================\n" |
| |
| my_app = App() |
| my_app.run() |