深圳幻海软件技术有限公司 欢迎您!

基于内容的推荐算法(Content-Based)

2023-06-07

基于内容的推荐算法(Content-Based)简介基于内容的推荐方法是非常直接的,它以物品的内容描述信息为依据来做出的推荐,本质上是基于对物品和用户自身的特征或属性的直接分析和计算。内容推荐算法是指在网站或应用中向用户推荐内容的一种机器学习算法。这些算法通过分析用户的历史浏览记录、搜索关键词、偏好

基于内容的推荐算法(Content-Based)

简介

基于内容的推荐方法是非常直接的,它以物品的内容描述信息为依据来做出的推荐,本质上是基于对物品和用户自身的特征或属性的直接分析和计算。

内容推荐算法是指在网站或应用中向用户推荐内容的一种机器学习算法。这些算法通过分析用户的历史浏览记录、搜索关键词、偏好设置等来推荐相关的内容。这些算法可以帮助用户发现更多感兴趣的内容,同时也能帮助网站或应用提高用户的参与度和留存率。

常见的内容推荐算法包括基于协同过滤的算法、基于内容的算法、基于标签的算法等。

基于协同过滤的算法是一种基于用户-物品交互数据的推荐方法。这种算法通过分析用户的浏览记录来学习用户的兴趣偏好,然后向用户推荐与他们兴趣相似的内容。

基于内容的推荐算法是一种基于内容特征的推荐方法。这种算法通过对内容的文本、图像、视频等进行分析,来推荐与当前内容相似的内容。

基于标签的推荐算法是一种基于标签的推荐方法。这种算法通过分析用户打上的标签来推荐与这些标签相关的内容。

例如,假设已知电影A是一部喜剧,而恰巧我们得知某个用户喜欢看喜剧电影,那么我们基于这样的已知信息,就可以将电影A推荐给该用户。

基于内容的推荐实现步骤

  • 画像构建。顾名思义,画像就是刻画物品或用户的特征。本质上就是给用户或物品贴标签。

    • 物品画像:例如给电影《战狼2》贴标签,可以有哪些?

"动作"、"吴京"、"吴刚"、"张翰"、"大陆电影"、"国产"、"爱国"、"军事"等等一系列标签是不是都可以贴上
  • 1
  • 用户画像:例如已知用户的观影历史是:“《战狼1》”、“《战狼2》”、“《建党伟业》”、“《建军大业》”、“《建国大业》”、“《红海行动》”、"《速度与激情1-8》"等,我们是不是就可以分析出该用户的一些兴趣特征如:“爱国”、“战争”、“赛车”、“动作”、“军事”、“吴京”、"韩三平"等标签。
问题:物品的标签来自哪儿?
  1. PGC 物品画像–冷启动
    • 物品自带的属性(物品一产生就具备的):如电影的标题、导演、演员、类型等等
    • 服务提供方设定的属性(服务提供方为物品附加的属性):如短视频话题、微博话题(平台拟定)
    • 其他渠道:如爬虫
  2. UGC 冷启动问题
    • 用户在享受服务过程中提供的物品的属性:如用户评论内容,微博话题(用户拟定)

根据PGC内容构建的物品画像的可以解决物品的冷启动问题

基于内容推荐的算法流程:
  • 根据PGC/UGC内容构建物品画像
  • 根据用户行为记录生成用户画像
  • 根据用户画像从物品中寻找最匹配的TOP-N物品进行推荐
物品冷启动处理:
  • 根据PGC内容构建物品画像
  • 利用物品画像计算物品间两两相似情况
  • 为每个物品产生TOP-N最相似的物品进行相关推荐:如与该商品相似的商品有哪些?与该文章相似文章有哪些?

N最相似的物品进行相关推荐:如与该商品相似的商品有哪些?与该文章相似文章有哪些?

代码实例:

# 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())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览47725 人正在系统学习中
IT技术源码分享
微信名片