美文网首页
推荐系统召回之内容画像(三)

推荐系统召回之内容画像(三)

作者: 文子轩 | 来源:发表于2021-03-19 14:43 被阅读0次

    一 基于内容的推荐系统

    基于内容的推荐方法特别适用于文本领域,比如新闻的推荐等等。

    首先核心构造商品画像,之后根据画像来寻找最相似的其它商品
    image.png

    那具体如何判断那些是最相似的商品呢?答案是:计算相似度!

    image.png

    二基于内容的推荐系统的原理

    2.1相似度计算

    那又如何计算相似度?
    答:转换成向量形式,计算两个向量之间的相似度。最经典的评估方法就是余旋相似度。
    例子:电影构造物品画像

    image.png

    问题:如何把这些特征表示成向量
    离散型变量 ----- 通过独热编码的形式转换成向量
    数值型变量------ 直接使用等等

    问题:那么文本的特征如何处理?比如电影的描述
    答:设计NLP领域。我们可以直接使用TF-IDF的方式即可以转换成向量的形式。当然我们也可以使用 Word2Vec 等技术来表示成向量。

    向量表示特征
    例子:特征也叫画像:

    image.png
    计算相似度公式(常用余旋相似度
    image.png
    问题:如果使用余旋相似度来计算每两个物品之间的相似度.
    image.png

    相似度推荐排序

    image.png

    **基于算法的推荐算法优缺点
    优点:推荐较为准确


    image.png

    缺点:(主要冷启动问题)


    image.png

    如何去处理新用户的冷启动的问题
    冷启动在推荐系统非常常见,在基于内容的推荐算法中,一旦一个新用户来,由于他还没有购买任何物品,所以无法给他推荐任何物品

    image.png

    解决冷启动的问题总结
    1.推荐目前热度最高的商品:
    2.让用户自己标记一下自己喜欢的商品类型(APP新用户)
    问题:基于内容的推荐还有个很大问题,就是如何去维护物品之间的相似度
    答:计算单个物品与其它物品之间的相似度。排序存在相似度矩阵,使用时直接调度。
    总结:基于内容时目前常用,火热的推荐算法。


    image.png
    # coding: utf-8 -*-
     
    """
        Author: Alan
        Desc:
             编写一个基于内容推荐算法的电影推荐系统(训练模型)
    """
    import json
    import pandas as pd
    import numpy as np
    import math
    import random
     
    class CBRecommend:
        # 加载dataProcessing.py中预处理的数据
        def __init__(self,K):
            # 给用户推荐的item个数
            self.K = K
            self.item_profile=json.load(open("data/item_profile.json","r"))
            self.user_profile=json.load(open("data/user_profile.json","r"))
    
        # 获取用户未进行评分的item列表
        def get_none_score_item(self,user):
            items=pd.read_csv("data/movies.csv")["MovieID"].values
            data = pd.read_csv("data/ratings.csv")
            have_score_items=data[data["UserID"]==user]["MovieID"].values
            none_score_items=set(items)-set(have_score_items)
            return none_score_items
     
        # 获取用户对item的喜好程度(余弦相似度)
        def cosUI(self,user,item):
            Uia=sum(
                np.array(self.user_profile[str(user)])
                *
                np.array(self.item_profile[str(item)])
            )
            Ua=math.sqrt( sum( [ math.pow(one,2) for one in self.user_profile[str(user)]] ) )
            Ia=math.sqrt( sum( [ math.pow(one,2) for one in self.item_profile[str(item)]] ) )
            return  Uia / (Ua * Ia)
     
        # 为用户进行电影推荐
        def recommend(self,user):
            user_result={}
            item_list=self.get_none_score_item(user)
            for item in item_list:
                user_result[item]=self.cosUI(user,item)
            if self.K is None:
                result = sorted(
                    user_result.items(), key= lambda k:k[1], reverse=True
                )
            else:
                result = sorted(
                    user_result.items(), key= lambda k:k[1], reverse=True
                )[:self.K]
            print(result)
     
        # 推荐系统效果评估
        def evaluate(self):
            evas=[]
            data = pd.read_csv("data/ratings.csv")
            # 随机选取20个用户进行效果评估
            for user in random.sample([one for one in range(1,6040)], 20):
                have_score_items=data[data["UserID"] == user]["MovieID"].values
                items=pd.read_csv("data/movies.csv")["MovieID"].values
     
                user_result={}
                for item in items:
                    user_result[item]=self.cosUI(user,item)
                results = sorted(
                    user_result.items(), key=lambda k: k[1], reverse=True
                )[:len(have_score_items)]
                rec_items=[]
                for one in results:
                    rec_items.append(one[0])
                eva = len(set(rec_items) & set(have_score_items)) / len(have_score_items)
                evas.append( eva )
            return sum(evas) / len(evas)
     
     
    if __name__=="__main__":
        cb=CBRecommend(K=10)
        cb.recommend(1)
        print(cb.evaluate())
    

    相关文章

      网友评论

          本文标题:推荐系统召回之内容画像(三)

          本文链接:https://www.haomeiwen.com/subject/hforcltx.html