Example #1
0
def recommend():

    with tf.Session(config=tf.ConfigProto(
            allow_soft_placement=True,
            log_device_placement=FLAGS.device_log)) as sess:
        print("reading data")
        task = Task(FLAGS.dataset)
        (_, items_dev, _, _, u_attributes, i_attributes, item_ind2logit_ind,
         logit_ind2item_ind, _) = read_data(task)

        Evaluate = task.get_evaluation()
        evaluation = Evaluate(logit_ind2item_ind, ta=FLAGS.ta, test=FLAGS.test)

        model = create_model(sess,
                             u_attributes,
                             i_attributes,
                             item_ind2logit_ind,
                             logit_ind2item_ind,
                             loss=FLAGS.loss,
                             ind_item=None)

        Uinds = evaluation.get_uinds()
        N = len(Uinds)
        print("N = %d" % N)
        Uinds = [p for p in Uinds if p in items_dev]
        mylog("new N = {}, (reduced from original {})".format(len(Uinds), N))
        if len(Uinds) < N:
            evaluation.set_uinds(Uinds)
        N = len(Uinds)
        rec = np.zeros((N, FLAGS.top_N_items), dtype=int)
        count = 0
        time_start = time.time()
        for idx_s in range(0, N, FLAGS.batch_size):
            count += 1
            if count % 100 == 0:
                print("idx: %d, c: %d" % (idx_s, count))

            idx_e = idx_s + FLAGS.batch_size
            if idx_e <= N:
                users = Uinds[idx_s:idx_e]
                items_input = [items_dev[u] for u in users]
                items_input = map(list, zip(*items_input))
                recs = model.step(sess,
                                  users,
                                  items_input,
                                  forward_only=True,
                                  recommend=True,
                                  recommend_new=FLAGS.recommend_new)
                rec[idx_s:idx_e, :] = recs
            else:
                users = range(idx_s, N) + [0] * (idx_e - N)
                users = [Uinds[t] for t in users]
                items_input = [items_dev[u] for u in users]
                items_input = map(list, zip(*items_input))
                recs = model.step(sess,
                                  users,
                                  items_input,
                                  forward_only=True,
                                  recommend=True,
                                  recommend_new=FLAGS.recommend_new)
                idx_e = N
                rec[idx_s:idx_e, :] = recs[:(idx_e - idx_s), :]
        # return rec: i:  uinds[i] --> logid

        time_end = time.time()
        mylog("Time used %.1f" % (time_end - time_start))

        R = evaluation.gen_rec(rec, FLAGS.recommend_new)

        evaluation.eval_on(R)
        s1, s2, s3, s4, s5 = evaluation.get_scores()
        mylog('scores: \n\t{}\n\t{}\n\t{}\n'.format(s1, s2, s3))
        mylog("SCORE_FORMAT: {} {} {}".format(s1[0], s2[0], s3[0]))
        mylog("METRIC_FORMAT1: {}".format(s4))
        mylog("METRIC_FORMAT2: {}".format(s5))
    return