上云无忧 > 文档中心 > 零基础实践深度学习 第七章:推荐系统(下) - 电影推荐
飞桨PaddlePaddle开源深度学习平台
零基础实践深度学习 第七章:推荐系统(下) - 电影推荐

文档简介:
训练并保存好模型,我们可以开始实践电影推荐了,推荐方式可以有多种,比如: 根据一个电影推荐其相似的电影。 根据用户的喜好,推荐其可能喜欢的电影。 给指定用户推荐与其喜好相似的用户喜欢的电影。 这里我们实现第二种推荐方式,另外两种留作实践作业。
*此产品及展示信息均由百度智能云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

训练并保存好模型,我们可以开始实践电影推荐了,推荐方式可以有多种,比如:

  1. 根据一个电影推荐其相似的电影。
  2. 根据用户的喜好,推荐其可能喜欢的电影。
  3. 给指定用户推荐与其喜好相似的用户喜欢的电影。

这里我们实现第二种推荐方式,另外两种留作实践作业。

根据用户喜好推荐电影

在前面章节,我们已经完成了神经网络的设计,并根据用户对电影的喜好(评分高低)作为训练指标完成训练。神经网络有两个输入,用户数据和电影数据,通过神经网络提取用户特征和电影特征,并计算特征之间的相似度,相似度的大小和用户对该电影的评分存在对应关系。即如果用户对这个电影感兴趣,那么对这个电影的评分也是偏高的,最终神经网络输出的相似度就更大一些。完成训练后,我们就可以开始给用户推荐电影了。

根据用户喜好推荐电影,是通过计算用户特征和电影特征之间的相似性,并排序选取相似度最大的结果来进行推荐,流程如下:


从计算相似度到完成推荐的过程,步骤包括:

  1. 读取保存的特征,根据一个给定的用户ID、电影ID,我们可以索引到对应的特征向量。
  2. 通过计算用户特征和其他电影特征向量的相似度,构建相似度矩阵。
  3. 对这些相似度排序后,选取相似度最大的几个特征向量,找到对应的电影ID,即得到推荐清单。
  4. 加入随机选择因素,从相似度最大的top_k结果中随机选取pick_num个推荐结果,其中pick_num必须小于top_k。

1. 读取特征向量

上一节我们已经训练好模型,并保存了电影特征,因此可以不用经过计算特征的步骤,直接读取特征。 特征以字典的形式保存,字典的键值是用户或者电影的ID,字典的元素是该用户或电影的特征向量。

下面实现根据指定的用户ID和电影ID,索引到对应的特征向量。

! unzip -o data/data19736/ml-1m.zip -d /home/aistudio/work/ # ! unzip -o data/data20452
/save_feat.zip -d /home/aistudio/ ! unzip -o data/data20452/save_feature_v1.zip -d /home/aistudio/

  inflating: /home/aistudio/work/ml-1m/posters/mov_id2804.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2353.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2435.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2421.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2347.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3071.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2409.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3717.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3703.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3065.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2390.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3930.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3924.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2384.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3918.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3919.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3925.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2385.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2391.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3931.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3702.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3064.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3070.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3716.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2408.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2420.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2346.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3058.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2352.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2434.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2805.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2811.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3299.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2839.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3266.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3500.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3514.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3272.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2622.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2636.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3528.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2971.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2965.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2795.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2781.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2959.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3312.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3474.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3460.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3306.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3448.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2756.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2742.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3879.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3689.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2597.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3851.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2583.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3845.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2568.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3676.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3110.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3104.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3662.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2554.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3892.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3138.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2540.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3886.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3648.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3890.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2556.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3884.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2542.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3112.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3674.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3660.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3106.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3853.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3847.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2581.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2754.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3338.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2740.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2998.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2768.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3476.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3310.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3304.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3462.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3489.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2797.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2783.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2973.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2967.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2620.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3258.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2634.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3502.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3264.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3270.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3516.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2608.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2807.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2813.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2344.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2422.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2436.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3728.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2350.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3066.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2378.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3700.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3714.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3072.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2387.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3099.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3927.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3933.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2393.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3932.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2392.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3098.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2386.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3926.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3715.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3073.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2379.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3067.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3701.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3729.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2437.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2351.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2345.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2423.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2812.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2806.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3271.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2609.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3517.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3503.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3265.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2635.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2621.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3259.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2966.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2972.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2782.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2796.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3488.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3305.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3463.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3477.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2769.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3311.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3339.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2999.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2741.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2755.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2580.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3846.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2594.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3852.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3661.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3107.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3113.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3675.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2543.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3885.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2557.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3891.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3649.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3888.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3136.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3122.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3644.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2572.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3678.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2566.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3693.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2599.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3687.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3877.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3863.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3334.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3452.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2994.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2758.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3446.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3320.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3308.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2770.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2764.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3491.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3485.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2943.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3240.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3526.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2638.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3254.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2610.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3268.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3283.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2823.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2837.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3297.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3724.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3042.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3056.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2348.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3730.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2406.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3718.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2360.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2374.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2412.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3081.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3095.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3903.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3917.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3916.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3902.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3094.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2375.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2413.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3719.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2407.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2361.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2349.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3057.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3731.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3725.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3043.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2836.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3296.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3282.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2822.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2611.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3269.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2605.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3533.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3255.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3241.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2639.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3527.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2942.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3484.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2956.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3490.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2765.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3309.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2771.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2981.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3447.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2759.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3321.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3335.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2995.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3453.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3862.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3876.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3686.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2598.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3692.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2567.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3679.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2573.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3123.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3645.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3889.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3651.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3137.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3647.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2559.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3121.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3135.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3653.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2565.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3109.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2571.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3684.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3848.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3690.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3860.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3874.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3323.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3445.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2983.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3451.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2997.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3337.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2767.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3479.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2773.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3486.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2940.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2798.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3492.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2968.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3257.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3531.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3525.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3243.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2613.jpg  
  inflating: /home/aistudio/work/__MACOSX/ml-1m/posters/._mov_id2613.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3519.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2607.jpg  
  inflating: /home/aistudio/work/__MACOSX/ml-1m/posters/._mov_id2607.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3294.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2834.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2820.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3280.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2808.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3733.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3055.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3041.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2439.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3727.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2411.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3069.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2377.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2363.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2405.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3928.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2388.jpg  
  inflating: /home/aistudio/work/__MACOSX/ml-1m/posters/._mov_id2388.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3096.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3082.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3914.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3900.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3901.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3915.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3083.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3929.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3097.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2389.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2362.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2404.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2410.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2376.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3068.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3040.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3726.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2438.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3732.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3054.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2809.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2821.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3281.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3295.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2835.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2606.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3518.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2612.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3524.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3242.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3256.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3530.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2969.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2955.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3493.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2799.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2941.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3487.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2772.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3478.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2766.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2996.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3450.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3336.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3322.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2982.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3444.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3875.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3861.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3691.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3849.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3685.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3108.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2570.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3134.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3652.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2558.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3646.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3120.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3118.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2560.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2574.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3124.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3642.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3656.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2548.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3130.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3865.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3871.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3859.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3681.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3695.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2762.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2776.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3468.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2986.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3440.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3326.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2992.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3454.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2979.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2945.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3483.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2951.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3497.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2789.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3508.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2616.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2602.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3534.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3252.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3246.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3520.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2819.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2831.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3291.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3285.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2825.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2372.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2414.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2400.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3078.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2366.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3050.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2428.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3736.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3722.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3044.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3911.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3905.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3093.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3939.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2399.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3087.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3938.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3086.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2398.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3092.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3904.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3910.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3723.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3045.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3051.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3737.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2429.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2401.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2367.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3079.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2373.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2415.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3284.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2824.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2830.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3290.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2818.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3247.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3521.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3535.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3253.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2617.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3509.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2788.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3496.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2950.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2944.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2978.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3333.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2993.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3441.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2987.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3327.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3469.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2777.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2763.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3694.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3680.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3858.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3870.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3864.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2549.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3657.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3131.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3125.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3643.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2575.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3119.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2561.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3669.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2577.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2563.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3133.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3655.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3641.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3899.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3127.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3872.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3866.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3696.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3682.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2775.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3319.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2761.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2749.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2991.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3457.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3331.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3325.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2985.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3443.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2952.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3494.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2946.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3480.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2615.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3523.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3245.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3251.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3537.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2629.jpg  
  inflating: /home/aistudio/work/__MACOSX/ml-1m/posters/._mov_id2629.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2826.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3286.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3292.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2365.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2403.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2417.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3709.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2371.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3047.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2359.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3721.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3735.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3053.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3906.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3912.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3084.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3090.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3091.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3085.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3913.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3734.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3052.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2358.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3046.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3720.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3708.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2416.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2370.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2364.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2402.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3293.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2833.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2827.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3287.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3250.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2628.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3536.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3522.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3244.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2614.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2600.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3481.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2947.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3495.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2953.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3324.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3442.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2984.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3456.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2990.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2748.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3330.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3318.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2760.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2774.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3683.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3697.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2589.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3867.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3873.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3898.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3640.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3126.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3132.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3654.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2562.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2576.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3668.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3155.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3633.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3627.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2539.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3141.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3169.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2511.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2505.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3196.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2288.jpg  
  inflating: /home/aistudio/work/__MACOSX/ml-1m/posters/._mov_id2288.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3828.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3182.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3814.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3800.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3431.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3357.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3343.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3425.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2713.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2707.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3419.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2934.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3394.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3380.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2920.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2908.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2883.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3545.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3223.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3237.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2897.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3551.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3579.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2667.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2673.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2840.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3586.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2854.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3592.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2868.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3021.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2459.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3747.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3753.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3035.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2303.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2465.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2471.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2317.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3784.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3790.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3948.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3949.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3791.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3785.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2470.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2316.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3008.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2302.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2464.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3752.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3034.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3020.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3746.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2458.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2869.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3593.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2855.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3587.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2841.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2699.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2672.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2666.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3236.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3550.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2896.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3544.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2882.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3222.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2909.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3381.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2921.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2935.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3395.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3418.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2706.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2712.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3342.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3424.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3430.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3801.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3183.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2289.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3197.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2504.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3168.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2510.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2538.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3626.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3140.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3154.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3632.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3142.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3624.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3156.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3618.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2506.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2512.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3181.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3803.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3817.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2738.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3426.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3340.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3354.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3432.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2704.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3368.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2710.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2923.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3397.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2937.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2894.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3552.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3220.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2880.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3546.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2658.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2670.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3208.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2664.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2857.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3591.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2843.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3585.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3036.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2328.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3744.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3022.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2314.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2472.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2466.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3778.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2300.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3793.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3787.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2499.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2498.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3786.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3792.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3779.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2467.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2301.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2315.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2473.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3745.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2329.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3037.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3751.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3584.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2842.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3590.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2856.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2665.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2671.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3209.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3221.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2659.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3547.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2881.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3553.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2895.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3235.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3396.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2936.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2922.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3382.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2711.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2705.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3355.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3433.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3427.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2739.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3341.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3816.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3802.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3194.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3180.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2513.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2507.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3619.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3631.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3157.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3143.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3625.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2503.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3609.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2517.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3621.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3147.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3153.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3635.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3806.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3812.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3184.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3190.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3379.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2701.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2715.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3345.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3423.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2729.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3437.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3351.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3386.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2926.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2932.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3392.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2675.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2661.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3219.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3557.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2891.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2649.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3543.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2885.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3225.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3594.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2852.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3580.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2846.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2477.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3769.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2311.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2305.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2463.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3755.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3033.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2339.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3741.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3796.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2488.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3782.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3783.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3797.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2338.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3026.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3740.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3754.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3032.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2304.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2462.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3768.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2476.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2310.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2847.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3581.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2853.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3595.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2884.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3542.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3224.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3230.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2648.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2890.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3556.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2660.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3218.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2674.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2933.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3393.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3387.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2927.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3436.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2728.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3350.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3344.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3422.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2714.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3378.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2700.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3185.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3813.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3807.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3152.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3634.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3620.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3146.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2516.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3608.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2502.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2514.jpg  
  inflating: /home/aistudio/work/__MACOSX/ml-1m/posters/._mov_id2514.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3178.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2500.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3636.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2528.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3150.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3144.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3622.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3811.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3805.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3187.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2299.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3839.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2716.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3408.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2702.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3352.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3434.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3420.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3346.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2919.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3391.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2931.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2925.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3385.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2662.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3568.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2676.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3540.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2886.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3554.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2892.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3232.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2879.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2845.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2689.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3597.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2851.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2460.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3018.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2306.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2312.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2474.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3742.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3024.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3030.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2448.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3756.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3781.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3795.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3794.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3780.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3031.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3757.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2449.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3743.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3025.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2313.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2475.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2461.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2307.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3019.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2850.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3596.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2688.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2844.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2878.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2893.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3555.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3233.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2887.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2677.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3569.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2663.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2924.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3384.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3390.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2930.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2918.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3421.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3347.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3353.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3435.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2703.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3409.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2717.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2298.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3186.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3838.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3192.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3804.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3810.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3145.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3623.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2529.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3637.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3151.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id3179.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2501.jpg  
  inflating: /home/aistudio/work/ml-1m/posters/mov_id2515.jpg  
  inflating: /home/aistudio/work/ml-1m/new_rating.txt  
  inflating: /home/aistudio/work/__MACOSX/ml-1m/._new_rating.txt  
  inflating: /home/aistudio/work/ml-1m/ratings.dat  
  inflating: /home/aistudio/work/__MACOSX/ml-1m/._ratings.dat  
  inflating: /home/aistudio/work/ml-1m/README  
  inflating: /home/aistudio/work/__MACOSX/ml-1m/._README  
  inflating: /home/aistudio/work/ml-1m/data.csv  
  inflating: /home/aistudio/work/__MACOSX/ml-1m/._data.csv  
  inflating: /home/aistudio/work/ml-1m/users.dat  
  inflating: /home/aistudio/work/__MACOSX/ml-1m/._users.dat  
  inflating: /home/aistudio/work/__MACOSX/._ml-1m  
unzip:  cannot find or open data/data20452/save_feature_v1.zip, data/d
ata20452/save_feature_v1.zip.zip or data/data20452/save_feature_v1.zip.ZIP.

import pickle import numpy as np

mov_feat_dir = 'mov_feat.pkl' usr_feat_dir = 'usr_feat.pkl' usr_
feats = pickle.load(open(usr_feat_dir, 'rb'))
mov_feats = pickle.load(open(mov_feat_dir, 'rb'))

usr_id = 2 usr_feat = usr_feats[str(usr_id)]

mov_id = 1 # 通过电影ID索引到电影特征 mov_feat = mov_feats[str(mov_id)] #
 电影特征的路径 movie_data_path = "./work/ml-1m/movies.dat" mov_info = {} # 
打开电影数据文件,根据电影ID索引到电影信息 with open(movie_data_path, 'r',
 encoding="ISO-8859-1") as f:
    data = f.readlines() for item in data:
        item = item.strip().split("::")
        mov_info[str(item[0])] = item

usr_file = "./work/ml-1m/users.dat" usr_info = {} # 打开文件,
读取所有行到data中 with open(usr_file, 'r') as f:
    data = f.readlines() for item in data:
        item = item.strip().split("::")
        usr_info[str(item[0])] = item

print("当前的用户是:")
print("usr_id:", usr_id, usr_info[str(usr_id)])   
print("对应的特征是:", usr_feats[str(usr_id)])

print("\n当前电影是:")
print("mov_id:", mov_id, mov_info[str(mov_id)])
print("对应的特征是:")
print(mov_feat)
当前的用户是:
usr_id: 2 ['2', 'M', '56', '16', '70072']
对应的特征是: [[ 38.619633    0.        174.79192     0.         71.00403     0.
    7.891301    6.2516866  54.969078    0.          0.         75.082954
  177.14723   184.8181      0.         72.27751     0.          0.
    0.         53.016636    0.          0.          0.          0.
    0.          0.          0.         77.75042     0.          0.
   63.942303    0.       ]]

当前电影是:
mov_id: 1 ['1', 'Toy Story (1995)', "Animation|Children's|Comedy"]
对应的特征是:
[[ 93.10382    0.        98.99103    0.        74.27992    0.
    0.        24.089523   0.         0.         0.        27.229246
   80.84544  133.20125    0.         0.         0.         0.
    0.        17.484547   0.         0.         0.         0.
    0.         0.         0.        44.45189    0.         0.
   40.84318   24.7163  ]]

以上代码中,我们索引到 usr_id = 2 的用户特征向量,以及 mov_id = 1 的电影特征向量。

2. 计算用户和所有电影的相似度,构建相似度矩阵

如下示例均以向 userid = 2 的用户推荐电影为例。与训练一致,以余弦相似度作为相似度衡量。

import paddle # 根据用户ID获得该用户的特征 usr_ID = 2 # 读取保存的用户特征 usr_feat_d
ir = 'usr_feat.pkl' usr_feats = pickle.load(open(usr_feat_dir, 'rb')) # 根据用户ID索引到
该用户的特征 usr_ID_feat = usr_feats[str(usr_ID)] # 记录计算的相似度 cos_sims = [] 
# 记录下与用户特征计算相似的电影顺序 # 索引电影特征,计算和输入用户ID的特征的相似度 
for idx, key in enumerate(mov_feats.keys()):
    mov_feat = mov_feats[key]
    usr_feat = paddle.to_tensor(usr_ID_feat)
    mov_feat = paddle.to_tensor(mov_feat) # 计算余弦相似度 sim = paddle.nn.functional.
common.cosine_similarity(usr_feat, mov_feat) # 打印特征和相似度的形状 if idx==0:
        print("电影特征形状:{}, 用户特征形状:{}, 相似度结果形状:{},相似度结果:{}".
format(mov_feat.shape, usr_feat.shape, sim.numpy().shape, sim.numpy())) # 从形状为(1,1)
的相似度sim中获得相似度值sim.numpy()[0],并添加到相似度列表cos_sims中 cos_sims.append(sim.numpy()[0])

W0510 13:11:59.506547   101 gpu_context.cc:244] Please NOTE: device: 0, GPU Compute Capability: 
7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W0510 13:11:59.509742   101 gpu_context.cc:272] device: 0, cuDNN Version: 7.6.

电影特征形状:[1, 32], 用户特征形状:[1, 32], 相似度结果形状:(1,),相似度结果:[0.8149737]

3. 对相似度排序,选出最大相似度

使用np.argsort()函数完成从小到大的排序,注意返回值是原列表位置下标的数组。因为cos_sims 和 mov_feats.keys()的顺序一致,所以都可以用index数组的内容索引,获取最大的相似度值和对应电影。

处理流程是先计算相似度列表 cos_sims,将其排序后返回对应的下标列表index,最后从cos_sims和mov_info中取出相似度值和对应的电影信息。

这个处理流程只是展示推荐系统的推荐效果,实际中推荐系统需要采用效率更高的工程化方案,建立“召回+排序”的检索系统。这些检索系统的架构才能应对推荐系统对大量线上需求的实时响应。

# 对相似度排序,获得最大相似度在cos_sims中的位置 index = np.argsort(cos_sims) #
 打印相似度最大的前topk个位置 topk = 5 print("相似度最大的前{}个索引是{}\n对应的相似度是:
{}\n".format(topk, index[-topk:], [cos_sims[k] for k in index[-topk:]])) for i in index[-topk:]:    
    print("对应的电影分别是:movie:{}".format(mov_info[list(mov_feats.keys())[i]]))
相似度最大的前5个索引是[ 149   38  693 3629   23]
对应的相似度是:[0.910985, 0.9180018, 0.9197489, 0.9215279, 0.9233643]

对应的电影分别是:movie:['2501', 'October Sky (1999)', 'Drama']
对应的电影分别是:movie:['2762', 'Sixth Sense, The (1999)', 'Thriller']
对应的电影分别是:movie:['953', "It's a Wonderful Life (1946)", 'Drama']
对应的电影分别是:movie:['3233', 'Smashing Time (1967)', 'Comedy']
对应的电影分别是:movie:['527', "Schindler's List (1993)", 'Drama|War']

以上结果可以看出,给用户推荐的电影多是Drama、War、Thriller类型的电影。

是不是到这里就可以把结果推荐给用户了?还有一个小步骤我们继续往下看。

4.加入随机选择因素,使得每次推荐的结果有“新鲜感”

为了确保推荐的多样性,维持用户阅读推荐内容的“新鲜感”,每次推荐的结果需要有所不同,我们随机抽取top_k结果中的一部分,作为给用户的推荐。比如从相似度排序中获取10个结果,每次随机抽取6个结果推荐给用户。

使用np.random.choice函数实现随机从top_k中选择一个未被选的电影,不断选择直到选择列表res长度达到pick_num为止,其中pick_num必须小于top_k。

读者可以反复运行本段代码,观测推荐结果是否有所变化。

代码实现如下:

top_k, pick_num = 10, 6 # 对相似度排序,获得最大相似度在cos_sims中的位置 index = np.argsort(cos_sims)[-top_k:]

print("当前的用户是:") # usr_id, usr_info 是前面定义、读取的用户ID、用户信息 print("usr_id:", usr_id, usr_info[str(usr_id)])   
print("推荐可能喜欢的电影是:")
res = [] # 加入随机选择因素,确保每次推荐的结果稍有差别 while len(res) < pick_num: val = np.random.choice(len(index), 1)[0]
    idx = index[val]
    mov_id = list(mov_feats.keys())[idx] if mov_id not in res:
        res.append(mov_id) for id in res:
    print("mov_id:", id, mov_info[str(id)])
当前的用户是:
usr_id: 2 ['2', 'M', '56', '16', '70072']
推荐可能喜欢的电影是:
mov_id: 150 ['150', 'Apollo 13 (1995)', 'Drama']
mov_id: 318 ['318', 'Shawshank Redemption, The (1994)', 'Drama']
mov_id: 1035 ['1035', 'Sound of Music, The (1965)', 'Musical']
mov_id: 953 ['953', "It's a Wonderful Life (1946)", 'Drama']
mov_id: 214 ['214', 'Before the Rain (Pred dozhdot) (1994)', 'Drama']
mov_id: 2762 ['2762', 'Sixth Sense, The (1999)', 'Thriller']

最后,我们将根据用户ID推荐电影的实现封装成一个函数,方便直接调用,其函数实现如下。

# 定义根据用户兴趣推荐电影 def recommend_mov_for_usr(usr_id, top_k, pick_num,
 usr_feat_dir, mov_feat_dir, mov_info_path): assert pick_num <= top_k # 读取电影和用户的特征 
usr_feats = pickle.load(open(usr_feat_dir, 'rb'))
    mov_feats = pickle.load(open(mov_feat_dir, 'rb'))
    usr_feat = usr_feats[str(usr_id)]

    cos_sims = [] # with dygraph.guard(): paddle.disable_static() # 索引电影特征,计算和输入用
户ID的特征的相似度 for idx, key in enumerate(mov_feats.keys()):
        mov_feat = mov_feats[key]
        usr_feat = paddle.to_tensor(usr_feat)
        mov_feat = paddle.to_tensor(mov_feat) # 计算余弦相似度 sim = paddle.nn.functional.
common.cosine_similarity(usr_feat, mov_feat)
        
        cos_sims.append(sim.numpy()[0]) # 对相似度排序 index = np.argsort(cos_sims)[-top_k:]

    mov_info = {} # 读取电影文件里的数据,根据电影ID索引到电影信息 with open(mov_info_path, 
'r', encoding="ISO-8859-1") as f:
        data = f.readlines() for item in data:
            item = item.strip().split("::")
            mov_info[str(item[0])] = item
            
    print("当前的用户是:")
    print("usr_id:", usr_id)
    print("推荐可能喜欢的电影是:")
    res = [] # 加入随机选择因素,确保每次推荐的都不一样 while len(res)
 < pick_num: val = np.random.choice(len(index), 1)[0]
        idx = index[val]
        mov_id = list(mov_feats.keys())[idx] if mov_id not in res:
            res.append(mov_id) for id in res:
        print("mov_id:", id, mov_info[str(id)])

movie_data_path = "./work/ml-1m/movies.dat" top_k, pick_num = 10, 6 usr_id = 2 rec
ommend_mov_for_usr(usr_id, top_k, pick_num, 'usr_feat.pkl', 'mov_feat.pkl', movie_data_path)
当前的用户是:
usr_id: 2
推荐可能喜欢的电影是:
mov_id: 150 ['150', 'Apollo 13 (1995)', 'Drama']
mov_id: 318 ['318', 'Shawshank Redemption, The (1994)', 'Drama']
mov_id: 914 ['914', 'My Fair Lady (1964)', 'Musical|Romance']
mov_id: 953 ['953', "It's a Wonderful Life (1946)", 'Drama']
mov_id: 1035 ['1035', 'Sound of Music, The (1965)', 'Musical']
mov_id: 527 ['527', "Schindler's List (1993)", 'Drama|War']

从上面的推荐结果来看,给ID为2的用户推荐的电影多是Drama、War类型的。我们可以通过用户的ID从已知的评分数据中找到其评分最高的电影,观察和推荐结果的区别。

下面代码实现给定用户ID,输出其评分最高的topk个电影信息,通过对比用户评分最高的电影和当前推荐的电影结果,观察推荐是否有效。

# 给定一个用户ID,找到评分最高的topk个电影 usr_a = 2 topk = 10 ###################################
####### ## 获得ID为usr_a的用户评分过的电影及对应评分 ## ##########################################
 rating_path = "./work/ml-1m/ratings.dat" # 打开文件,ratings_data with open(rating_path, 'r') as f:
    ratings_data = f.readlines()
    
usr_rating_info = {} for item in ratings_data:
    item = item.strip().split("::") # 处理每行数据,分别得到用户ID,电影ID,和评分 usr_id,movie_id
,score = item[0],item[1],item[2] if usr_id == str(usr_a):
        usr_rating_info[movie_id] = float(score) # 获得评分过的电影ID movie_ids = list(usr_rating_info.keys())
print("ID为 {} 的用户,评分过的电影数量是: ".format(usr_a), len(movie_ids)) ###########################
########## ## 选出ID为usr_a评分最高的前topk个电影 ## ##################################### ratings_topk 
= sorted(usr_rating_info.items(), key=lambda item:item[1])[-topk:]

movie_info_path = "./work/ml-1m/movies.dat" # 打开文件,编码方式选择ISO-8859-1,读取所有数据到data中
 with open(movie_info_path, 'r', encoding="ISO-8859-1") as f:
    data = f.readlines()
    
movie_info = {} for item in data:
    item = item.strip().split("::") # 获得电影的ID信息 v_id = item[0]
    movie_info[v_id] = item for k, score in ratings_topk:
    print("电影ID: {},评分是: {}, 电影信息: {}".format(k, score, movie_info[k]))
ID为 2 的用户,评分过的电影数量是:  129
电影ID: 380,评分是: 5.0, 电影信息: ['380', 'True Lies (1994)', 'Action|Adventure|Comedy|Romance']
电影ID: 2501,评分是: 5.0, 电影信息: ['2501', 'October Sky (1999)', 'Drama']
电影ID: 920,评分是: 5.0, 电影信息: ['920', 'Gone with the Wind (1939)', 'Drama|Romance|War']
电影ID: 2002,评分是: 5.0, 电影信息: ['2002', 'Lethal Weapon 3 (1992)', 'Action|Comedy|Crime|Drama']
电影ID: 1962,评分是: 5.0, 电影信息: ['1962', 'Driving Miss Daisy (1989)', 'Drama']
电影ID: 1784,评分是: 5.0, 电影信息: ['1784', 'As Good As It Gets (1997)', 'Comedy|Drama']
电影ID: 318,评分是: 5.0, 电影信息: ['318', 'Shawshank Redemption, The (1994)', 'Drama']
电影ID: 356,评分是: 5.0, 电影信息: ['356', 'Forrest Gump (1994)', 'Comedy|Romance|War']
电影ID: 1246,评分是: 5.0, 电影信息: ['1246', 'Dead Poets Society (1989)', 'Drama']
电影ID: 1247,评分是: 5.0, 电影信息: ['1247', 'Graduate, The (1967)', 'Drama|Romance']

通过上述代码的输出可以发现,Drama类型的电影是用户喜欢的类型,可见推荐结果和用户喜欢的电影类型是匹配的。

但是推荐结果仍有一些不足的地方,这些可以通过改进神经网络模型等方式来进一步调优。

从推荐案例的三点思考

  1. Deep Learning is all about “Embedding Everything”。不难发现,深度学习建模是套路满满的。任何事物均用向量的方式表示,可以直接基于向量完成“分类”或“回归”任务;也可以计算多个向量之间的关系,无论这种关系是“相似性”还是“比较排序”。在深度学习兴起不久的2015年,当时AI相关的国际学术会议上,大部分论文均是将某个事物Embedding后再进行挖掘,火热的程度仿佛即使是路边一块石头,也要Embedding一下看看是否能挖掘出价值。直到近些年,能够Embedding的事物基本都发表过论文,Embeddding的方法也变得成熟,这方面的论文才逐渐有减少的趋势。

  2. 在深度学习兴起之前,不同领域之间的迁移学习往往要用到很多特殊设计的算法。但深度学习兴起后,迁移学习变得尤其自然。训练模型和使用模型未必是同样的方式,中间基于Embedding的向量表示,即可实现不同任务交换信息。例如本章的推荐模型使用用户对电影的评分数据进行监督训练,训练好的特征向量可以用于计算用户与用户的相似度,以及电影与电影之间的相似度。对特征向量的使用可以极其灵活,而不局限于训练时的任务。

  3. 网络调参:神经网络模型并没有一套理论上可推导的最优规则,实际中的网络设计往往是在理论和经验指导下的“探索”活动。例如推荐模型的每层网络尺寸的设计遵从了信息熵的原则,原始信息量越大对应表示的向量长度就越长。但具体每一层的向量应该有多长,往往是根据实际训练的效果进行调整。所以,建模工程师被称为数据处理工程师和调参工程师是有道理的,大量的精力花费在处理样本数据和模型调参上。


在工业实践中的推荐系统

本章介绍了比较简单的推荐系统构建方法,在实际应用中,验证一个推荐系统的好坏,除了预测准确度,还需要考虑多方面的因素,比如多样性、新颖性,甚至商业目标匹配度等。要实践一个好的推荐系统,值得更深入的探索研究。下面将工业实践推荐系统还需要考虑的主要问题做一个概要性的介绍。

1. 推荐来源:推荐来源会更加多样化,除了使用深度学习模型的方式,还大量使用标签匹配的个性化推荐方式。此外,推荐热门的内容,具有时效性的内容和一定探索性的内容,都非常关键。对于新闻类的内容推荐,用户不希望地球人都在谈论的大事自己毫无所知,期望更快更全面的了解。如果用户经常使用的推荐产品总推荐“老三样”,会使得用户丧失“新鲜感”而流失。因此,除了推荐一些用户喜欢的内容之外,谨慎的推荐一些用户没表达过喜欢的内容,可探索用户更广泛的兴趣领域,以便有更多不重复的内容可以向用户推荐。

2. 检索系统:将推荐系统构建成“召回+排序”架构的高性能检索系统,以更短的特征向量建倒排索引。在“召回+排序”的架构下,通常会训练出两种不同长度的特征向量,使用较短的特征向量做召回系统,从海量候选中筛选出几十个可能候选。使用较短的向量做召回,性能高但不够准确,然后使用较长的特征向量做几十个候选的精细排序,因为待排序的候选很少,所以性能低一些也影响不大。

3. 冷启动问题:现实中推荐系统往往要在产品运营的初期一起上线,但这时候系统尚没有用户行为数据的积累。这时,我们往往建立一套专家经验的规则系统,比如一个在美妆行业工作的店小二对各类女性化妆品偏好是非常了解的。通过规则系统运行一段时间积累数据后,再逐渐转向机器学习的系统。很多推荐系统也会主动向用户收集一些信息,比如大家注册一些资讯类APP时,经常会要求选择一些兴趣标签。

4. 推荐系统的评估:推荐系统的评估不仅是计算模型Loss所能代表的,是使用推荐系统用户的综合体验。除了采用更多代表不同体验的评估指标外(准确率、召回率、覆盖率、多样性等),还会从两个方面收集数据做分析:

(1)行为日志:如用户对推荐内容的点击率,阅读市场,发表评论,甚至消费行为等。

(2)人工评估:选取不同的具有代表性的评估员,从兴趣相关度、内容质量、多样性、时效性等多个维度评估。如果评估员就是用户,通常是以问卷调研的方式下发和收集。

其中,多样性的指标是针对探索性目标的。而推荐的覆盖度也很重要,代表了所有的内容有多少能够被推荐系统送到用户面前。如果推荐每次只集中在少量的内容,大部分内容无法获得用户流量的话,会影响系统内容生态的健康。比如电商平台如果只推荐少量大商家的产品给用户,多数小商家无法获得购物流量,会导致平台上的商家集中度越来越高,生态不再繁荣稳定。

从上述几点可见,搭建一套实用的推荐系统,不只是一个有效的推荐模型。要从业务的需求场景出发,构建完整的推荐系统,最后再实现模型的部分。如果技术人员的视野只局限于模型本身,是无法在工业实践中搭建一套有业务价值的推荐系统的。

图3:推荐系统的全流程

作业

1、设计并完成两个推荐系统,根据相似用户推荐电影(user-based)和 根据相似电影推荐电影(item-based),并分析三个推荐系统的推荐结果差异。

上文中,我们已经将映射后的用户特征和电影特征向量保存在了本地,通过两者的相似度计算结果进行推荐。实际上,我们还可以计算用户之间的相似度矩阵和电影之间的相似度矩阵,实现根据相似用户推荐电影和根据相似电影推荐电影。

2、构建一个【热门】、【新品】和【个性化推荐】三条推荐路径的混合系统。构建更贴近真实场景的推荐系统,而不仅是个性化推荐模型,每次推荐10条,三种各占比例2、3、5条,每次的推荐结果不同。

3、推荐系统的案例,实现本地的版本(非AI Studio上实现),进行训练和预测并截图提交。有助于大家掌握脱离AI Studio平台,使用本地机器完成建模的能力。

相似文档
  • 为什么要精通深度学习的高级内容? 在前面章节中,我们首先学习了神经网络模型的基本知识和使用飞桨编写深度学习模型的方法,再学习了计算机视觉、自然语言处理和推荐系统的模型实现方法。至此,读者完全可胜任各个领域的建模任务。
  • 十行代码能干什么? 相信多数人的答案是可以写个“Hello world”,或者做个简易计算器,本章将告诉你另一个答案,还可以实现人工智能算法应用。基于PaddleHub,可以轻松使用十行代码完成所有主流的人工智能算法应用,比如目标检测、人脸识别、语义分割等任务。
  • 如果说PaddleHub提供的是AI任务快速运行方案(POC),飞桨的开发套件则是比PaddleHub提供“更丰富的模型调节”和“领域相关的配套工具”,开发者基于这些开发套件可以实现当前应用场景中的最优方案(State of the Art)。
  • PaddleNLP: 介绍完计算机视觉的开发套件PaddleSeg后,让我们继续了解一个自然语言处理方面的开发套件PaddleNLP。PaddleNLP是基于Paddle框架开发的自然语言处理 (NLP) 开源项目,项目中包含工具、算法、模型和数据多种资源。PaddleNLP通过丰富的模型库、简洁易用的API,提供飞桨2.0的最佳实践并加速NLP领域应用产业落地效率。
  • 飞桨官方模型库Paddle Models是由飞桨官方开发和维护的深度学习开源算法集合,包括代码、数据集和预训练模型。目前模型库发布了超过300个工业级的深度学习前沿算法,覆盖了计算机视觉、自然语言处理、语音识别、智能推荐、强化学习等领域。通过使用官方模型库可以极大的减少开发者的工作量,加速深度学习算法的应用落地。模型库的预训练模型,在通用场景下一般可达到SOTA(State Of The Art)效果,即模型在常用的数据集上取得了当前最优的性能表现。通过使用业务数据持续训练和二次开发,可以进一步提升算法在特定场景下的效果。
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部