基于内容的推荐,仅仅依赖于物品的信息,对于系统冷启动和物品冷启动,可以有效解决。拿到物品的信息之后,对物品信息进行处理,生成特征向量,然后就可以定义物品相似度,对物品进行推荐。

通常,基于内容的推荐遵循下面三个步骤:

  • 物品表达(item representation),即从物品信息中抽出特征向量
  • 用户侧写(user profile),即根据用户过去行为中,学习到用户喜欢哪些物品特征,讨厌哪些物品特征
  • 生成推荐,即通过物品表达和用户侧写,来给用户推荐最相关的物品

我们用一份西雅图的酒店数据(seatleHotels.txt,已经上传,可以免费下载)作为数据集,里面包含三个特征,分别是 酒店名称、酒店地址和酒店描述。

我们接下来简单介绍下tf-idf。

实际上,tf指的是词频,即一个单词在文档中出现的概率。一般来说,单词出现的越频繁,可能会越能代表这篇文档。举一个计算的例子, doc=‘america is mygod country but it is a shit’,这里,我们分别计算每个单词出现的频率
tf=该单词出现次数文档总单词数tf=\frac{该单词出现次数}{文档总单词数}tf=文档总单词数该单词出现次数​如下

america is mygod country but it a shit
1/9 2/9 1/9 1/9 1/9 1/9 1/9 1/9

而idf则是指逆文档率。如上所示,出现很多的字可能只是介词之类的无意义的词,这类词在绝大多数文档中都会出现,为了降低这类词的权重,我们给出一个逆文档率的概念,也就是说,当这个词在越多文档中出现,那么这个词的权重越低,
idf=log总文档数1+出现该单词的文档数idf=log\frac{总文档数}{1+出现该单词的文档数}idf=log1+出现该单词的文档数总文档数​

当我们综合考虑,我们希望在众多文档中,挑选出来最能代表这个文档的词,我们给这个词以最大的权重,也就是说,

  • 在该文档中,一个词的频率tftftf越大,权重越大
  • 在所有文档中,一个词独属于这个文档的概率越大,idfidfidf越大,则权重越大

因此,我们用tf⋅idftf\cdot idftf⋅idf作为衡量某文档中一个词的重要程度,tf⋅idftf\cdot idftf⋅idf越大,越能说明这个词重要,能代表该文档的程度也越高。

我们可以用酒店描述部分,生成酒店的特征信息,具体的,

  • 用tf-idf对酒店文字描述部分进行处理,生成特征向量
  • 根据酒店的特征向量,计算不同酒店的相似度
  • 假设用户喜欢某个酒店,那么给用户推荐相似酒店
# 第三方库
import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
# 载入数据
data = pd.read_csv(r'D:\myfile\开课吧\推荐系统\第七节\seatleHotels.txt', sep=',')
data.head()
# 将desc中的大写都改成小写
data['desc'] = data['desc'].apply(str.lower)
data.head()
# 计算tf-idf矩阵
tfidf = TfidfVectorizer(ngram_range=(1, 2), stop_words='english')
tfidf_array = tfidf.fit_transform(data['desc']).toarray()
# 创建tf-idf的dataframe
tfidf_dataframe = pd.DataFrame(tfidf_array, columns=tfidf.get_feature_names(), index=data.name)
tfidf_dataframe.head()
# 计算不同酒店之间的余弦相似度
cos_similarity = tfidf_array.dot(tfidf_array.T)
cos_similarity.shape
# 创建相似度pandas
similarity = pd.DataFrame(cos_similarity, columns=data['name'], index=data['name'])
similarity.head()
# 根据相似度进行推荐
def topN(hotel, N=4):neighbors = similarity.loc[hotel, :].sort_values(ascending=False)[1: N+1]return neighbors.index.tolist()# 测试
topN('Hilton Garden Seattle Downtown')
# 结果
['Staybridge Suites Seattle Downtown - Lake Union','Silver Cloud Inn - Seattle Lake Union','Residence Inn by Marriott Seattle Downtown/Lake Union','The Loyal Inn']

《推荐系统笔记(十六)》tf-idf与基于内容的推荐(简单的酒店推荐)相关推荐

  1. 推荐系统三十六式——学习笔记(三)

    由于工作需要,开始学习推荐算法,参考[极客时间]->[刑无刀大牛]的[推荐系统三十六式],学习并整理. 3 原理篇之紧邻推荐 3.1 协同过滤 要说提到推荐系统中,什么算法最名满天下,我想一定是 ...

  2. Java学习系列(十六)Java面向对象之基于TCP协议的网络通信

    TCP/IP的网络分层模型:应用层(HTTP/FTP/SMTP/POPS...),传输层(TCP协议),网络层(IP协议,负责为网络上节点分配唯一标识),物理层+数据链路层). IP地址用于标识网络中 ...

  3. 电脑安装python3.74_python3.4学习笔记(十六) windows下面安装easy_install和pip教程

    python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...

  4. Polyworks脚本开发学习笔记(十六)-用C#进行Polyworks二次开发

    Polyworks脚本开发学习笔记(十六)-用C#进行Polyworks二次开发 Polyworks支持C#二次开发,用对应的SDK文档试着做一下开发样例. 新建一个C#项目,在解决方案中右键添加引用 ...

  5. 数据科学和人工智能技术笔记 十六、朴素贝叶斯

    十六.朴素贝叶斯 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 伯努利朴素贝叶斯 伯努利朴素贝叶斯分类器假设我们的所有特征都是二元的,它们仅有两个值(例如,已经是独热 ...

  6. Mr.J-- jQuery学习笔记(十六)--展开和收起动画折叠菜单的实现

    之前写过动画的隐藏与显示:Mr.J-- jQuery学习笔记(十四)--动画显示隐藏 动画隐藏与显示的一个小demo--对联广告:Mr.J-- jQuery学习笔记(十五)--实现页面的对联广告 与动 ...

  7. 【Visual C++】游戏开发笔记十六 讲解一个完整的回合制游戏demo

    本系列文章由zhmxy555编写,转载请注明出处. 文章链接  http://blog.csdn.net/zhmxy555/article/details/7447864 作者:毛星云    邮箱:  ...

  8. 【Visual C 】游戏开发笔记十六 讲解一个完整的回合制游戏demo

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  9. [原]【Visual C++】游戏开发笔记十六 讲解一个完整的回合制游戏demo

    本系列文章由zhmxy555编写,转载请注明出处. 文章链接  http://blog.csdn.net/zhmxy555/article/details/7447864 作者:毛星云    邮箱:  ...

最新文章

  1. maven3.5.0在win10中的安装及环境变量配置
  2. OpenGL indirect material间接材料的实例
  3. Oracle APEX 系列文章1:Oracle APEX, 让你秒变全栈开发的黑科技
  4. iview兼容ie8_如何解决iview在安卓4.4.4的webview中的兼容性
  5. 一文读懂Python web框架和web服务器之间的关系
  6. mysql udf http,mysql下mysql-udf-http效率测试小记
  7. 学计算机和电脑办公的区别,自学编程和计算机科班出身的差别在哪?
  8. Linux下使用fdisk扩大分区容量
  9. XP电脑开机就检查硬盘
  10. 算法笔记二分查找题目
  11. mysql 中 字典表设计_数据库怎么设计字典表
  12. 太阳系混的最惨行星:被“降级”至今未归队
  13. 理查德·克莱德曼钢琴曲全集(梦中的婚礼)
  14. PyTorch 实战之水果分类器
  15. python垃圾邮件识别_Python 手写朴素贝叶斯分类器检测垃圾邮件/短信
  16. 【云计算】弹性公网IP
  17. php safari播放mp4,修复video标签在safari中无法播放mp4视频的问题
  18. 六度分离【Floyd】
  19. 黑马程序员_考生成绩管理系统
  20. “等一下,我碰!”——常见的2D碰撞检测

热门文章

  1. php能反序列化js的吗,javascript – 如何在node.js中反序列化PHP会话?
  2. 攻防世界 php2,CTF-攻防世界-PHP2
  3. java server 参数_java serversocket参数详解
  4. 软件工程导论 06章详细设计
  5. Scrapy 简介及初探
  6. 通过的镜像源安装python包
  7. 阿维·阿斯平纳尔的闹钟——亨利·劳森
  8. UnicodeDecodeError: 'utf8' codec can't decode byte 0xd1 in position 0: invalid continuation byte问题
  9. 【半年总结】---凤凰涅槃,历久弥新
  10. 算法不会,尚能饭否之队列