基于内容的电影推荐:物品画像

物品画像构建步骤:

  • 利用tags.csv中每部电影的标签作为电影的候选关键词
  • 利用TF·IDF计算每部电影的标签的tfidf值,选取TOP-N个关键词作为电影画像标签
  • 将电影的分类词直接作为每部电影的画像标签

基于TF-IDF的特征提取技术

前面提到,物品画像的特征标签主要都是指的如电影的导演、演员、图书的作者、出版社等结构话的数据,也就是他们的特征提取,尤其是体征向量的计算是比较简单的,如直接给作品的分类定义0或者1的状态。

但另外一些特征,比如电影的内容简介、电影的影评、图书的摘要等文本数据,这些被称为非结构化数据,首先他们本应该也属于物品的一个特征标签,但是这样的特征标签进行量化时,也就是计算它的特征向量时是很难去定义的。

因此这时就需要借助一些自然语言处理、信息检索等技术,将如用户的文本评论或其他文本内容信息的非结构化数据进行量化处理,从而实现更加完善的物品画像/用户画像。

TF-IDF算法便是其中一种在自然语言处理领域中应用比较广泛的一种算法。可用来提取目标文档中,并得到关键词用于计算对于目标文档的权重,并将这些权重组合到一起得到特征向量。

算法原理

TF-IDF自然语言处理领域中计算文档中词或短语的权值的方法,是词频(Term Frequency,TF)和逆转文档频率(Inverse Document Frequency,IDF)的乘积。TF指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被正规化,以防止它偏向长的文件(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否)。IDF是一个词语普遍重要性的度量,某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。

TF-IDF算法基于一个这样的假设:若一个词语在目标文档中出现的频率高而在其他文档中出现的频率低,那么这个词语就可以用来区分出目标文档。这个假设需要掌握的有两点:

  • 在本文档出现的频率高;
  • 在其他文档出现的频率低。

因此,TF-IDF算法的计算可以分为词频(Term Frequency,TF)和逆转文档频率(Inverse Document Frequency,IDF)两部分,由TF和IDF的乘积来设置文档词语的权重。

TF指的是一个词语在文档中的出现频率。假设文档集包含的文档数为 N ​ N​ N​,文档集中包含关键词 k i ​ k_i​ ki​​的文档数为 n i ​ n_i​ ni​​, f i j ​ f_{ij}​ fij​​表示关键词 k i ​ k_i​ ki​​在文档 d j ​ d_j​ dj​​中出现的次数, f d j ​ f_{dj}​ fdj​​表示文档 d j ​ d_j​ dj​​中出现的词语总数, k i ​ k_i​ ki​​在文档dj中的词频 T F i j ​ TF_{ij}​ TFij​​定义为: T F i j = f i j f d j ​ TF_{ij}=\frac {f_{ij}}{f_{dj}}​ TFij​=fdj​fij​​​。并且注意,这个数字通常会被正规化,以防止它偏向长的文件(指同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否)。

IDF是一个词语普遍重要性的度量。表示某一词语在整个文档集中出现的频率,由它计算的结果取对数得到关键词 k i ​ k_i​ ki​​的逆文档频率 I D F i ​ IDF_i​ IDFi​​: I D F i = l o g N n i ​ IDF_i=log\frac {N}{n_i}​ IDFi​=logni​N​​

由TF和IDF计算词语的权重为: w i j = T F i j w_{ij}=TF_{ij} wij​=TFij​· I D F i = f i j f d j IDF_{i}=\frac {f_{ij}}{f_{dj}} IDFi​=fdj​fij​​· l o g N n i log\frac {N}{n_i} logni​N​

结论:TF-IDF与词语在文档中的出现次数成正比,与该词在整个文档集中的出现次数成反比。

用途:在目标文档中,提取关键词(特征标签)的方法就是将该文档所有词语的TF-IDF计算出来并进行对比,取其中TF-IDF值最大的k个数组成目标文档的特征向量用以表示文档。

注意:文档中存在的停用词(Stop Words),如“是”、“的”之类的,对于文档的中心思想表达没有意义的词,在分词时需要先过滤掉再计算其他词语的TF-IDF值。

算法举例

对于计算影评的TF-IDF,以电影“加勒比海盗:黑珍珠号的诅咒”为例,假设它总共有1000篇影评,其中一篇影评的总词语数为200,其中出现最频繁的词语为“海盗”、“船长”、“自由”,分别是20、15、10次,并且这3个词在所有影评中被提及的次数分别为1000、500、100,就这3个词语作为关键词的顺序计算如下。

  1. 将影评中出现的停用词过滤掉,计算其他词语的词频。以出现最多的三个词为例进行计算如下:

    • “海盗”出现的词频为20/200=0.1
    • “船长”出现的词频为15/200=0.075
    • “自由”出现的词频为10/200=0.05;
  2. 计算词语的逆文档频率如下:

    • “海盗”的IDF为:log(1000/1000)=0
    • “船长”的IDF为:log(1000/500)=0.3
      “自由”的IDF为:log(1000/100)=1
  3. 由1和2计算的结果求出词语的TF-IDF结果,“海盗”为0,“船长”为0.0225,“自由”为0.05。

通过对比可得,该篇影评的关键词排序应为:“自由”、“船长”、“海盗”。把这些词语的TF-IDF值作为它们的权重按照对应的顺序依次排列,就得到这篇影评的特征向量,我们就用这个向量来代表这篇影评,向量中每一个维度的分量大小对应这个属性的重要性。

将总的影评集中所有的影评向量与特定的系数相乘求和,得到这部电影的综合影评向量,与电影的基本属性结合构建视频的物品画像,同理构建用户画像,可采用多种方法计算物品画像和用户画像之间的相似度,为用户做出推荐。

加载数据集

import pandas as pd
import numpy as np
'''
- 利用tags.csv中每部电影的标签作为电影的候选关键词
- 利用TF·IDF计算每部电影的标签的tfidf值,选取TOP-N个关键词作为电影画像标签
- 并将电影的分类词直接作为每部电影的画像标签
'''def get_movie_dataset():# 加载基于所有电影的标签# all-tags.csv来自ml-latest数据集中# 由于ml-latest-small中标签数据太多,因此借助其来扩充_tags = pd.read_csv("datasets/ml-latest-small/all-tags.csv", usecols=range(1, 3)).dropna()tags = _tags.groupby("movieId").agg(list)# 加载电影列表数据集movies = pd.read_csv("datasets/ml-latest-small/movies.csv", index_col="movieId")# 将类别词分开movies["genres"] = movies["genres"].apply(lambda x: x.split("|"))# 为每部电影匹配对应的标签数据,如果没有将会是NANmovies_index = set(movies.index) & set(tags.index)new_tags = tags.loc[list(movies_index)]ret = movies.join(new_tags)# 构建电影数据集,包含电影Id、电影名称、类别、标签四个字段# 如果电影没有标签数据,那么就替换为空列表# map(fun,可迭代对象)movie_dataset = pd.DataFrame(map(lambda x: (x[0], x[1], x[2], x[2]+x[3]) if x[3] is not np.nan else (x[0], x[1], x[2], []), ret.itertuples()), columns=["movieId", "title", "genres","tags"])movie_dataset.set_index("movieId", inplace=True)return movie_datasetmovie_dataset = get_movie_dataset()
print(movie_dataset)

基于TF·IDF提取TOP-N关键词,构建电影画像

from gensim.models import TfidfModelimport pandas as pd
import numpy as npfrom pprint import pprint# ......def create_movie_profile(movie_dataset):'''使用tfidf,分析提取topn关键词:param movie_dataset: :return: '''dataset = movie_dataset["tags"].valuesfrom gensim.corpora import Dictionary# 根据数据集建立词袋,并统计词频,将所有词放入一个词典,使用索引进行获取dct = Dictionary(dataset)# 根据将每条数据,返回对应的词索引和词频corpus = [dct.doc2bow(line) for line in dataset]# 训练TF-IDF模型,即计算TF-IDF值model = TfidfModel(corpus)movie_profile = {}for i, mid in enumerate(movie_dataset.index):# 根据每条数据返回,向量vector = model[corpus[i]]# 按照TF-IDF值得到top-n的关键词movie_tags = sorted(vector, key=lambda x: x[1], reverse=True)[:30]# 根据关键词提取对应的名称movie_profile[mid] = dict(map(lambda x:(dct[x[0]], x[1]), movie_tags))return movie_profilemovie_dataset = get_movie_dataset()
pprint(create_movie_profile(movie_dataset))

完善画像关键词

from gensim.models import TfidfModelimport pandas as pd
import numpy as npfrom pprint import pprint# ......def create_movie_profile(movie_dataset):'''使用tfidf,分析提取topn关键词:param movie_dataset::return:'''dataset = movie_dataset["tags"].valuesfrom gensim.corpora import Dictionary# 根据数据集建立词袋,并统计词频,将所有词放入一个词典,使用索引进行获取dct = Dictionary(dataset)# 根据将每条数据,返回对应的词索引和词频corpus = [dct.doc2bow(line) for line in dataset]# 训练TF-IDF模型,即计算TF-IDF值model = TfidfModel(corpus)_movie_profile = []for i, data in enumerate(movie_dataset.itertuples()):mid = data[0]title = data[1]genres = data[2]vector = model[corpus[i]]movie_tags = sorted(vector, key=lambda x: x[1], reverse=True)[:30]topN_tags_weights = dict(map(lambda x: (dct[x[0]], x[1]), movie_tags))# 将类别词的添加进去,并设置权重值为1.0for g in genres:topN_tags_weights[g] = 1.0topN_tags = [i[0] for i in topN_tags_weights.items()]_movie_profile.append((mid, title, topN_tags, topN_tags_weights))movie_profile = pd.DataFrame(_movie_profile, columns=["movieId", "title", "profile", "weights"])movie_profile.set_index("movieId", inplace=True)return movie_profilemovie_dataset = get_movie_dataset()
pprint(create_movie_profile(movie_dataset))

为了根据指定关键词迅速匹配到对应的电影,因此需要对物品画像的标签词,建立倒排索引

倒排索引介绍

通常数据存储数据,都是以物品的ID作为索引,去提取物品的其他信息数据

而倒排索引就是用物品的其他数据作为索引,去提取它们对应的物品的ID列表

# ......'''
建立tag-物品的倒排索引
'''def create_inverted_table(movie_profile):inverted_table = {}for mid, weights in movie_profile["weights"].iteritems():for tag, weight in weights.items():#到inverted_table dict 用tag作为Key去取值 如果取不到就返回[]_ = inverted_table.get(tag, [])_.append((mid, weight))inverted_table.setdefault(tag, _)return inverted_tableinverted_table = create_inverted_table(movie_profile)
pprint(inverted_table)

基于内容的电影推荐:物品画像相关推荐

  1. 基于内容的电影推荐:物品画像和用户画像

    文章目录 基于内容的电影推荐:物品画像(基于tf-idf).用户画像及推荐结果 1. 基于内容的推荐算法 2. 基于内容的推荐实现步骤 2.1 物品的标签来自哪儿? 2.2 基于内容推荐的算法流程 2 ...

  2. 基于内容的电影推荐:物品画像用户画像为用户产生TOP-N推荐结果

    基于内容的电影推荐:物品画像 基于内容的电影推荐:物品画像 基于TF-IDF的特征提取技术 算法原理 算法举例 加载数据集 基于TF·IDF提取TOP-N关键词,构建电影画像 完善画像关键词 基于内容 ...

  3. 基于内容的电影推荐:用户画像

    基于内容的电影推荐:用户画像 用户画像构建步骤: 根据用户的评分历史,结合物品画像,将有观影记录的电影的画像标签作为初始标签反打到用户身上 通过对用户观影标签的次数进行统计,计算用户的每个初始标签的权 ...

  4. Python推荐算法案例(2)——基于内容的电影推荐

    在上一节中讲述了如何利用评分对电影进行简单的排序推荐.Python推荐算法案例(1)--根据评分进行排序的电影推荐 本节中,将根据某电影的内容属性(例如电影类别)来推荐相似的电影. 数据来源IMDB电 ...

  5. 基于内容的个性化推荐算法

    一.什么是推荐算法 随着移动互联网的高速发展与智能手机的普及,海量的有用信息虽然为人们提供了更多的价值,然而信息的泛滥也意味着为了寻找合适的信息必须付出更多的时间成本.事实上,有时候仅仅是浏览和简单的 ...

  6. python电影推荐算法_基于Python的电影推荐算法

    原标题:基于Python的电影推荐算法 第一步:收集和清洗数据 数据链接:https://grouplens.org/datasets/movielens/ 下载文件:ml-latest-small ...

  7. 基于内容推荐算法html,基于内容的互联网推荐算法

    摘 要 本文介B了网络推荐的算法思想.帮助读者了解这个研究领域.在介绍了推荐系统的概念和定义之后,重点介绍了基于内容的互联网推荐算法. 关键词 推荐系统 推荐算法 互联网 中图分类号:TP391.3 ...

  8. 一种基于机器学习的电影推荐系统设计

    摘 要 在互联网时代下,信息量呈指数级增长.海量数据以0.1 方式编码存放在磁盘等设备中非常方便,但是对于人类来说,我们的脑容量有限,在海量数据中挑选出适合自己的信息变得非常困难.简直如大海捞针,即使 ...

  9. 基于内容的商品推荐技术的简单实现方法

    基于内容的推荐技术 最近做学校的一个商城项目需要推荐功能,于是翻看了几篇论文,感觉基于内容的推荐技术比较合适,索性就拿来用用.通过提取用户最近的商品收藏或者搜索记录中的有用信息,得到喜好模型从而计算相 ...

最新文章

  1. 2.2版本发布!TensorFlow推出开发者技能证书
  2. LayUI 走了,JDK17 来了
  3. python基础day4
  4. AE教程:学会这个,你做的Logo就可以单独出道了
  5. Spring for Android 1.0.0发布
  6. Spark2.11 两种流操作 + Kafka
  7. 21.3.3 原子性与易变性 21.3.4 原子类
  8. 2008下php上传文件崩溃,php – 当用户反复尝试上传无效文件类型时,网站崩溃
  9. 机房收费系统个人重构版:暮然回首,灯火阑珊
  10. 开课吧:Java开发学习路线-基础知识
  11. oracle dba_hist tablepsace,oracle数据库dba_hist等视图中的Delta相关字段介绍
  12. 端到端矢量化高清地图学习框架VectorMapNet
  13. 19.华为笔试题整理
  14. SQL 数据库 学习 012 数据库关系图
  15. c语言pipe函数,pipe 函数 (C语言)
  16. 简单做(ZTD)的十个好习惯总结--转
  17. 2021-07-16思考-资本源于贪婪(与人性抗争)
  18. 设计模式——C++版
  19. 关于cocos creator 2.0的废除cc.p接口Sorry, cc.p is deprecated. Please use cc.v2 instead
  20. Viewpage使用

热门文章

  1. CAD明细表转EXCEL
  2. Anaconda下安装opencv
  3. QQ聊天记录如何加密
  4. ubuntu上安装QT
  5. 一款近年来备受青睐的web弹层组件——layer(http://layer.layui.com/)
  6. 两个月能学什么?零基础小白全网热门预训练模型梳理整合
  7. 550w计算机电源,GTX 1080显卡配550W电源够用不?老司机来告诉你如何DIY电脑主机...
  8. 【IntelliJ IDEA的简介】
  9. Thress.js设置背景色及背景透明
  10. android绘图拖影效果,Android自定义View绘图实现拖影动画