推荐系统应用---新闻资讯类

很久很久以前,大家获取信息的渠道可能就是读书,听广播,看报纸,看电视等等,可以获得的信息也非常少。然而当今的社会,我们整天都会发愁从无数的巨大的永远都不可能看完的信息中很轻松地找到需要的信息,也就是说“信息过载”的问题十分严重。

我们每天都会看一些新闻,关注一些社会热点。当然你可以在围脖上看到很多大家炒的很热的话题,但很多人更愿意看的是新闻和评论。

在本文中,我想虚构出一家提供新闻资讯的网站,在你的个人页面上会显示每天各个领域发生的新闻大事件,以及你可能会喜欢的新闻资讯。

我们的网站需要做好下面的工作:

1、搜索

用户面对海量的信息,他如何能够比较快速的相对准确地找到他想要的东西,答案就是搜索引擎。

搭建一个搜索引擎需要解决下面的问题。

  • 抓取
抓取还有一个比较好听的同义词,叫做收录,当然也有一个更难听的同义词,叫做爬虫。
在网上,你可以爬到别人的网页,doc,pdf,xml等等很多信息。
大家平时关注新闻事件,大多也都是从新浪、qq、搜狐、网易那些大的门户或者是新闻媒体的网站上浏览新闻。
所以,我们的爬虫不必像google或者百度那样从整个互联网上爬取信息,而只需要在这些特有的网站上来爬取信息。
当然,如果你想做一个垂直并且非常另类的奇闻资讯的话,你需要动一番脑子,来寻找这些奇闻异事的来源。
不过,爬别人的东西,如果你不说明你的这个新闻的来源而且不添加原文链接的话,和偷别人的东西是一样一样的,是很不道德的行为。所以,我们会在前台页面上清晰地显示出我们从哪个站爬的信息,并添加原文链接。
通过爬取各大网站的新闻网页 ,我们会得到一些杂乱的文本文件和图片,需要经过下面的处理。
  • 解析
拿到爬来的东西后,我们需要对这些信息做一些处理,处理成我们要的格式。这一步往往被称作“清洗”数据。解析数据的时候,需要对不同类型的数据进行不同的处理。不过,我们这里只会拿到两种类型的数据,新闻网页的文本和网页所配的图片。
文本文件的处理可以用NekoHTML或者Python的beautifulsoup来做,去掉html的元标记符号以及其他和新闻无关的东西。
解析后的文本就比较干净了,需要进行下一步骤。
  • 索引
拿到干净的文本后,我们需要对这些文本做一个索引,以方便我们后续的搜索。
我们的索引对应于一个这样的结构:
  1. 所有不同的单词,当然这些单词都是经过分词器过滤出来的比较重要的有意义的单词,而不是“的”或者“地”之类的出现频率高但永远不会成为核心的词,最好是限定一个范围,只保留一些出现频率在5%-50%之间的词
  2. 这些单词所在的文本
  3. 单词在文本中的位置
这样我们可以通过在搜索框中输入一个词汇,可以找到所有含有这些词汇的文本,并返回结果。
这个是搜索最基本的表现形式,但是这样的搜索引擎并不能很好地给用户带来他们想要的结果。
因为排序结果只有根据最简单的词频(TF)和逆向文档频率(IDF)这两种指标,这种方法可以解决大部分简单的搜索问题,但作为一个智能的web服务还远远不够。
  • 搜索
google在90年代末作为一个后起之秀,超越其他的搜索引擎成为全球最大的最牛的公司,一个主要原因在于他们用了PageRank算法。pageRank的算法利用了一种打分机制,来反映出一个网页和另外一个网页哪个更加重要。
但很可惜,我们并不能很好地用到这个算法,因为新闻网页之间绝大部分没有相互链接,所以我们很难去利用网页之间的关系来排序。
既然PR无法用了,我们可以用一种叫做DocRank的算法来对各个搜索结果进行排序。
这里简单介绍下这个DocRank是如何工作的:
(1)首先通过分词得到每个文本的一组词汇,以及它们出现在这个文本中的频率。
(2)然后是想一些办法来赋给每个文本一定的重要性。
计算文本相对重要性的方法如下:
1)找到两个本文中出现最频繁的词汇的交集。
2)找到交集中的每个词,计算该词在文本1和文本2中出现次数的比值,然后对这个值取双曲正切tanh后四舍五入,最后得到所有比值的综合,也就是文本2相对于文本1的重要性。
这里为什么用tanh去处理呢?原因是,我们希望重要性这个值可以处于0-1之间,并且最终四舍五入以后的结果就是一个词或是被忽略或是有1个单位的重要性。
这样就可以得到一个文本重要性的矩阵,然后就可以根据这个矩阵对搜索结果进行排序了。
当然,作为一个智能的web应用,我们也会分析用户行为,来发现他可能更喜欢哪个结果,来改进搜索的效果。

2、分类

首先,先说明一个问题,为什么不先进行聚类,而是先做分类呢?

因为数据的噪声会在分类之后得到很大的抑制,聚类的效果就会非常好。但如果反过来的话,会看到很多的科技新闻被归到国内新闻或者其他很搞笑的事情。

我们的网站将会分为:国内新闻,国外新闻,科技新闻,娱乐新闻,体育新闻,军事新闻这六大类。

分类的思路有两个:

  • 一个比较简单的分类就是爬取新闻的时候就做好分类,也就是说你从新浪的科技新闻版块爬新闻自然就会分到这个类,这种分类方法完全依靠专家分类,分类的准确性会很高。但这种办法不能用在所有的数据源,因为很多的新闻都是从很多并没有分类。但是,这些专家分类的数据源可以作为分类器的训练集。
  • 机器分类是解决这个问题的主要方法,构造一个好的分类器对于整个网站的成功起着非常重要的作用。可以想象,一个用户如果在体育新闻中看到了中国房价常年居高不下的新闻他还是会再次访问这个网站吗?

3、聚类

新闻分好类后,要对新闻做一些分组的工作。这就会用到聚类算法。新闻分组有个好处在于,我们可以很容易地找到一篇新闻的相关新闻,对于每个分组会根据这个分组中的新闻提取一个关键词作为名称。

4、个性化推荐

终于写到重点了。

网站为用户提供的新闻是在太多太多了,而且每天都会更新大量的新闻,用户如何能够一一看的过来呢?

首先,我们会提供一个订阅的功能,订阅用户自己感兴趣的分类或者分组。

用户如何找到这个分组?他可以搜索,他可以点开分类,然后他可以看到一个像树一样的结构。

但如果说我是用户的话,我在一个目录中点开一个链接。然后又看到无数的链接等着我去点,我会吐得。

所以这里,我们可以采用标签云的方式来表示这些分组,当你打开一个分类时,你会看到许许多多的分组标签,标签的大小和颜色都不同,大小由这个分组中的新闻篇数决定。

然后,我们如何进行个性化推荐?

(1)我们会给用户提供一个表达自己对这个新闻的喜好程度的机会,一个红心,就像豆瓣电台的那个红心,当然也会让他轻易地将这条新闻一键转发至各大社交网站上。通过这个行为我们就可以知道用户是喜欢这篇新闻的,那么个性化推荐也就不是问题了。

(2)当然,看过了一条新闻之后,总得让用户评论几句吧。这个是用户最基本的权利,而且是最容易出亮点的地方,网易新闻在这方面做的非常好。(释永信为失足女事主开光的新闻下面网友的诗词接龙堪称经典啊!)我们可以通过对评论进行语义分析,来分析用户对这个新闻是否关注或者喜欢。但国内用户很多时候都是在上面问候各自的直系亲属,这点使得对于评论的语义分析显得没有太大的意义哈。

我们会用到哪些算法呢?

基于内容的推荐算法是肯定的,因为这是一个文本内容丰富而且可以利用IR的一些成熟技术来做的推荐。

基于条目的协同过滤貌似不太好用,因为新闻具有时效性,有热度效应,所以新闻会很频繁地更新,用户评分矩阵就会不断地朝着条目的这个方向快速地增长,如果我们不加取舍的话,很快就会发现这个矩阵变成一个零矩阵,失去了意义。所以我们可以给这些数据加个时间窗口,来分析用户的短期兴趣,同时隔一段时间对历史的陈旧的数据做一次挖掘,然后提取出用户的兴趣模型,然后丢掉这些数据。这样我们可以得到用户的长期兴趣和短期兴趣。

基于用户的协同过滤算法,因为它的优势(寻找taste相同的人)在新闻类网站中显得很单薄,所以我们弃用这种算法。

有了这些,个性化的推荐就变得简单多了。

如果,我们把以上的这些功能和算法都做好了的话,并且用在手机客户端上的话,可能就是这个样子:

如果我们做成ipad客户端后,也许就是这个样子:

PS:因为我是指阅的fans,真心喜欢这个产品,所以在这里自愿打了广告哈,大家可以尝试用一下这个产品。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章