10 月,开发者不可错过的开源大数据大会-2021 WeDataSphere 社区大会深圳站 了解详情
写点什么

博客推荐系统——物料准备 (第一部分)

2016 年 5 月 03 日

(点击放大图像)

众所周知,数据科学的目标是从大数据中创造价值。然而,数据科学也应该满足第二个目标即避免信息过载。一个典型的可以满足这两个目标的系统就是推荐引擎。不仅是像Amazon 这样的网上商店,同样的还有流媒体服务如Netflix 公司也遭到了信息过载的困扰。客户可能很容易迷失在其庞大的(百万)产品或电影中。推荐引擎通过呈现给用户可能的选择帮助用户从繁多的产品中缩小选择范围。当然这些推荐引擎可以随机的展现给用户一些可能的选择,但这并没有真正降低信息过载。因此,这些推荐引擎通过应用统计科学来给用户展现更匹配他们期望的结果。例如,一个观看了《Frozen》的Netflix 用户会从Pixar 看到类似的儿童电影推荐结果。

(点击放大图像)

在接下来的一系列三篇博客中我们将详细的说明如何为"The Marketing Technologist (TMT)"的读者构建一个推荐引擎。TMT 目前拥有超过50 个类别的文章,覆盖了众多类别的主题,从数据科学到ReactJS 编程。浏览完网站上所有的文章是非常耗时的,尤其是在文章的数量一直增长的情况下。同时读者很可能仅仅对他们所熟悉的领域的文章感兴趣。如果一个推荐引擎能够筛选出用户感兴趣的文章,那么它就可以被认为是能从数据中创造价值并避免信息过载的那一类系统。

两种类型的推荐系统

粗略地讲,我们可以将推荐引擎划分为两种类型:协同过滤基于内容的推荐。就像维基百科说的:协同过滤是一个使用涉及多个代理,观点和数据源之间的协作技术模式来过滤信息或模式的过程。在TMT 案例中,这意味着在多个读者中找到一些规律。如果一群读者对特定系列中的文章感兴趣,当一个读者开始读这个系列中的一篇文章,那么他有很大的概率会对这个系列中的其他文章感兴趣。因此,可以基于其他用户的阅读行为来给类似的用户进行推荐。

基于内容的推荐引擎是不同的,因为它们是以产品的属性进行推荐。在我们的案例中产品就是TMT 的文章,属性则是文章中的关键字。如果一个用户在读的文章中包含’Google Analytics’和’Tag Manager’的关键字,那么这个用户很有可能也喜欢包含这些关键字的其他文章。因此,基于内容的推荐引擎会推荐包含这些关键字的文章。值得注意的是最近从"Geek"到"The Marketing Technologist"的升级中,一个非常简单的基于内容过滤推荐方法被集成到TMT 中。就是在每篇文章的下面有5 篇其他相关的文章展示给用户供他们继续阅读。推荐的文章就是包含用户在读文章中任意一个标签的最新发表的5 篇文章。在这个简单的例子中,标签可以当作产品的一个属性。

(点击放大图像)

协同过滤和基于内容的推荐背后的原理(图标来自于www.flaticon.com 的Freepik)

这两类系统各有利弊。基于内容的推荐系统将推荐的文章限定在基于一组特征类似的文章中。例如,在给包含’Google Analytics’这样具体特征的文章进行推荐的时候会在其他文章中查找类似的关键字。然而,一个包含类似的分析工具’Snowplow’这样具体特征的文章,却不太可能被推荐出来。实际上用户可能对这两类文章都感兴趣,因为他们都属于分析这个主题。因此,基于内容的推荐系统并不善于发现隐藏的模式。协同过滤推荐系统在寻找隐藏模式这点上是优于基于内容的推荐系统。协同过滤着眼于用户的阅读行为,不专门关注用户阅读文章的内容。所以如果一个用户阅读了关于数据科学和转化率优化(CRO),尽管那些CRO 的文章的内容和数据科学是截然不同的,协同过滤推荐系统也会向数据科学的读者们推荐关于CRO 的文章。协同过滤的最大的缺点是,它需要大量的历史用户阅读行为数据,以便找到这些模式。基于内容的推荐可以在不给或者少量的历史数据的条件下完成,因此更容易实现。

协同过滤推荐系统的准备前提

在接下来的两篇博客中,我们将会实现一个基于内容推荐系统和基于协同过滤算法的推荐系统,并分析推荐结果。然而,为了能够实现目标,我们首先需要准备一些前提物料。对于协同过滤推荐系统这意味着我们需要实现得到用户阅读文章行为的方法。我们的同事 Erik Driessen 已经实现了通过使用谷歌分析 (Google Analytics) 并且分配客户端 ID 来记录用户阅读行为的方法。Simo Ahava 在他的博客《在谷歌分析中存储客户端ID》解释了如何有效的实现它。

此外,由于Erik 已经在文章的内容上增加了’Enhanced Ecommerce’插件,这样我们就可以追踪到用户是否完整的阅读了这篇文章。最后,在谷歌分析中可以创建自定义报表,展示客户端ID 和他们已经阅读过的文章。

需要注意的是,目前跨设备的解决方案尚未实现。因此,如果用户使用不同的设备继续阅读文章或着中间清除了cookie,后续的行为将不能和他前期的阅读行为联系起来。

(点击放大图像)

谷歌分析中一个自定义的用户层面的阅读行为报表示例

基于内容的推荐系统的准备前提

在基于内容的推荐中,显然我们会需要所有TMT 文章内容。有多种实现的方法。其中的一个将是直接从数据库中提取这些文章的文本。然而,因为我们是Geek,通过编写一个Python 脚本,可以自动检索文章和相应的指标如作者和类别,这将是一件更酷的事情。因此,我们创建了从TMT 网站复制文章的Python 脚本,具体分为两个步骤。步骤1 和步骤2 的代码在这里(注:英文原文并未给出链接)。

步骤1: 创建一个TMT 全量文章的列表.

可以使用Python 的 urllib2库加载网页源代码。用urllib2.urlopen("http://www.themarketingtechnologist.co")这个命令可以加载我们自己 TMT 博客的前端页面的源代码。这个首页总是展现最新发表的 10 篇文章。使用 BeautifulSoup 库,我们可以很容易通过在 DOM 中搜索并提取所有带class ="post"article元素,并将它们存储在一个 Pandas dataframe 中。此外,在每个这样的元素内部,我们还可以通过搜索相应的 DOM 元素来提取作者和标签等元素。

因为只有十篇最新的博客文章在首页显示,为了获取更多博客文章,我们还需要检查在页面底部是否有Older posts >按钮。同样的,可以通过搜索相应的 DOM 元素,如class="older-posts"来完成。在更早博客文章区块中可以通过使用get函数从href属性值中提取到下一个页面的链接。在每个页面上我们重复上述过程。最后,我们将得到一个包含所有文章的名称、标签、作者和指向文章内容链接的数据帧。

步骤 2:检索每篇文章内容

在步骤 1 中,我们保存了一个到每一篇文章的链接,所以我们可以下载每篇文章的全部内容。但是存在一个特殊的问题,即每篇博客文章的内容是通过 JavaScript 加载的。因此,如果我们使用的urllib2加载文章的静态资源,我们将无法得到文章的内容。为了执行 JavaScript 代码来加载文章内容,我们实际需要通过 Web 浏览器进行渲染出文章的内容。幸运的是,这可以通过使用流行的Selenium库来达到目的。使用 Python 的几行代码并结合Selenium库可以打开 Firefox 浏览器,定位到相应的 URL 并渲染页面。然后就可以在 DOM 中搜索我们想要的信息,例如博客文章的内容。

需要注意的是,因为使用Selenium执行所有的 JavaScript 代码,这也意味着谷歌分析的代码也会被执行。因此,明智的做法是采取措施防止产生脏数据。例如,在 GA 过滤器列表加入您的 IP 地址或者通过谷歌安装 Google Analytics Opt-out Addon插件。还要注意的是,实际上并不需要在 Firefox 浏览器中把每个渲染出来页面呈现在我们面前。你也可以使用一个轻量级的驱动程序,如 PhantomJS这使得可以在后台渲染页面而减少视觉上额外的开销。

这就是截至到现在建立推荐系统需要的准备前提。在接下来的几个月中,我们需要收集协同过滤模型中用到的用户层面的阅读行为。因此,在下面的博客文章中,我们先开始创建一个基于内容的推荐系统,并分析其结果。

这是在推荐引擎系列中的第一篇文章。

继续阅读该系列的第二篇文章:博客推荐系统:基于内容相似性的推荐(第二部分)。

查看英文原文: A recommendation system for blogs: Setting up the prerequisites (part 1)


感谢杜小芳对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016 年 5 月 03 日 17:173638

评论

发布
暂无评论
  • 推荐算法综述(三)

    近年来社交媒体已经越来越流行,可以从中获得大量丰富多彩的信息的同时,也给我们带来了严重的“信息过载”问题。推荐系统作为缓解信息过载的最有效方法之一,在社交媒体中的作用日趋重要。区别于传统的推荐方法,社交媒体中包含大量的用户产生内容,因此在社交媒体中,通过结合传统的个性化的推荐方法,集成各类新的数据、元数据和清晰的用户关系,产生了各种新的推荐技术。本文总结了推荐系统中的几个关键研究领域,进行综述介绍。这是推荐算法综述的第三部分。第一部分主要介绍了推荐算法的主要类型。第二部分,主要涵盖了不同类型的协同过滤算法,突出他们之间的一些细微差别。在本文中,主要详细介绍基于内容的过滤算法的工作原理,以及它的优点和缺点,从而让读者对其有更深的理解。

  • 特征工程:推荐系统有哪些可供利用的特征?

    从这节课开始,我们来讲特征工程,说说到底什么是特征工程,构建特征工程的基本原则是什么,以及推荐系统中常用的特征有哪些。

    2020 年 10 月 9 日

  • 架构实战营 -- 模块三

    基于消息队列实战部分内容,完成消息队列架构设计文档

    2021 年 5 月 7 日

  • 课程介绍

    2019 年 6 月 24 日

  • 热门微博:AI 时代精准的个性化推荐

    本次分享介绍如何打造适合自己产品的推荐系统。

  • 产品案例分析:Arts & Culture 的架构之美

    在Arts & Culture里,我们能看到的是 Google 如何用知识图谱、标签以及搜索技术,把内容体系撑起结构来。

    2018 年 2 月 3 日

  • 播客推荐系统原理解析

    Lindsay Vass是2016年1月Insight Data Science远程培训项目的学员,现在是Facebook的数据科学家。在这篇文章中,她描述了如何构建TheSauropod——用于发现新播客的播客推荐库。这些内容最初发表在Lindsay的博客上。

  • 手把手教你爬取优酷电影信息 -2

    继第一篇文档后的爬虫进阶,本文章主要是对上一篇的进阶。实现的功能主要为: 1、爬取电影类别列表 2、循环每个类别的电影信息,对每个类别的信息分页爬取 3、爬取的数据保存到数据库中

    2021 年 2 月 26 日

  • 如何在 Python 中使用 LightFM 构建可扩展的电子商务推荐系统?

    在我国,电商非常发达。今年双 11 的成交额仅仅过了 12 小时就达到了惊人的 1491.6 亿元!电商在我国的火爆程度由此可见一斑。不知你们有没有发现,在网店浏览商品时,它们好像能读懂你的内心,推荐的几乎都是你想找的宝贝?其实,这背后的功臣就是人工智能的应用之一——推荐系统。今天,我们分享了一篇在 Python 中使用 LightFM 构建可扩展的电子商务推荐系统的文章,以飨读者。

  • 滴滴基于大数据的用户问题定位建设与实践

    2018 年 9 月 12 日

  • 怎么才能写出一篇好新闻?

    我在成为编辑的第一天,我的主编就告诉我,写一篇好新闻是非常难的一件事儿,也是编辑必备的基本功。

    2019 年 6 月 28 日

  • 通过 Stack Overflow 标签分析编程语言新趋势

    Stack Overflow是世界各地开发者交流技术的一个网站,不但有各路高手回答问题分享经验,而且还提供对所有帖子的检索。近日,Salsita Software的CEO Matthew Gertner发表了一篇题为《通过StackOverflow上的标签分析软件开发语言/工具的趋势》的博文。在文章中,Matthew介绍了通过对Stack Overflow上标签的分析而得出编程语言/工具的新趋势。

  • 自然语言处理产品:从 0 打造一款智能客服产品

    今天,我来教你打造一款智能客服产品,从而帮助你掌握自然语言处理技术的应用场景、处理流程和基本的技术原理。

    2021 年 3 月 3 日

  • Hulu 在 Content Embedding 的探索与实践

    Hulu是美国领先的互联网视频流媒体平台,拥有大量的电影、电视剧等视频资源,对这些内容的理解和表示是Hulu的一个重要研究方向。

  • 推荐算法综述(二)

    推荐系统在各种系统中广泛使用,推荐算法则是其中最核心的技术点,InfoQ接下来将会策划系列文章来为读者深入介绍。推荐算法综述分文五个部分,本文我们将会详细介绍这些算法的区别,让你能够深入理解他们的工作原理。

  • 毕业两年,售前转产品,我的蜕变之旅

    毕业两年的我,成就了这一篇文章

    2020 年 7 月 15 日

  • 社交推荐系统中的用户交互

    本文介绍社交推荐系统中的用户交互。

发现更多内容

都1202年了,阿里五岳版的《Java开发手册》你还没拜读过?

Java架构师迁哥

MySQL-技术专题-MVCC机制介绍

李浩宇/Alex

MySQL 事务隔离级别 Isolation ReadView

【架构实战营】模块1作业

毛国庆

架构实战营

智慧党建平台搭建,党建系统开发

13823153121

11

三年过后

架构实战营

常垒资本石矛:寻找ToB投资中的「非共识」

ToB行业头条

SaaS tob

别再面向 for 循环编程了,Spring 自带的观察者模式就很香!

Java架构师迁哥

U比生活平台

飞亚科技

浅谈网络性能管理智能化方案和实践

鲸品堂

AI 技术 AIOPS

爬虫知识点汇总

小小咸鱼ywy

大数据 爬虫 破解 抓包 逆向

保护云管理控制台的5个最佳实践

龙归科技

云计算 安全 风险管理

架构实战营-模块1-微信业务架构&学生管理系统方案

Lane

在小公司“混”了两年,我只认真做了五件事,如今顺利拿到天猫Offer,迈上人生的新台阶!

Java架构追梦

Java 面试 天猫Offer 成长路线图

Redis 学习资料

escray

redis 学习 极客时间 Redis 核心技术与实战 4月日更

Bee币蜜蜂网链是什么?

飞亚科技

架构师训练营-模块1课程作业

歲月鎏金😈

基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台

阿里巴巴云原生

Java 云原生 监控 存储 消息中间件

【业务架构训练营】模块一作业

汪大侠

爽爆了!凭借阿里这份笔记,仅仅两星期就拿到了8个大厂offer!

Java架构师迁哥

聪明人的训练(七)

Changing Lin

4月日更

ElasticSearch架构及核心概念

五分钟学大数据

ES 4月日更

1TB每日仅需6元!USnap磁盘快照服务全新上线,精确到秒级恢复

UCloud技术

快照 备份

带你全面认识CMMI V2.0(五)——改进

渠成CMMI

项目管理 管理 软件 CMMI

MemVerge 和百奥智汇用大内存技术加速癌症和新冠病毒的研究

Steven Xu

内存 高性能 持久化存储 I/O

线程池 图解

线程池

模块一:课后作业

冷酷小绵羊

python实现AES/DES/RSA/MD5/SM2/SM4/3DES加密算法模板汇总

小小咸鱼ywy

Python 加密 rsa AES

YouTube视频转MP3音频 (批量、高效、快捷)

科技猫

分享 教程 视频处理 youtube youtube转mp3

MemVerge使得大内存应用在 Ice Lake CPU上如虎添翼

Steven Xu

redis 内存 高性能 持久化存储 kvm

阿里P9力荐Spring Boot学习笔记,一步一步学习Spring Boot,学到的不单单是基础

Java架构师迁哥

【业务架构训练营】模块一作业

U2R2otkit

博客推荐系统——物料准备 (第一部分)-InfoQ