这一直是本人想做的一个项目,缘由是现在的信息越来越多,越来越廉价,所以我必须想办法能自动挑出我感兴趣的文章,而不是一打开订阅邮箱堆积着好多好多的订阅文章,想要消化这些文章又不知哪里下手。其实以前好像看到说,Twitter已经着手研究这类问题,今后可能Twitter信息将按照用户的喜好程度,而不是时间排序展列了,国内低效著称的某浪不知道有没有着手这方面的研究,还是坐等着山寨呢?
同时,国内的今日头条算是当前最大的移动端信息聚合平台了,之前使用见他每个文章都有好几个TAG,所以不知道他的推荐算法是不是简单基于标签计算的。之前的推荐算法介绍(http://taozj.org/2016/04/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E5%B8%B8%E7%94%A8%E7%9A%84%E6%8E%A8%E8%8D%90%E7%AE%97%E6%B3%95/)中,新闻播客类的推荐应该是基于用户的协同推荐比较合适,奈何没有用户群行为数据,所以也就只能考虑基于内容的推荐方式了。

1. 项目的构成

  该项目算是信息聚集分发类,按照信息流程涉及到抓取、存储、分析、分发等功能。信息源目前是提交feed然后服务器定时抓取,用户行为数据包括用户对消息的喜恶评价,并基于用户历史的行为数据,对当时的每条信息计算出一个喜好程度作为推荐。
整个项目是使用Python搭建的,具体涉及到的库有:

  • http: Tornado(http://www.tornadoweb.org/en/stable/)
  • mysql: torndb(http://torndb.readthedocs.io/en/latest/)
  • feed: feedparser(https://github.com/kurtmckee/feedparser)
  • 科学计算: NLTK(http://www.nltk.org/)
  • BeautifulSoup: bs4(http://beautifulsoup.readthedocs.io/zh_CN/latest/)

目前觉得用Feed内容比较单调,后续可能会考虑添加爬虫模块,爬一些主流站点,可以丰富内容。自己之前用的Sina/Twitter机器人,也可以考虑添加进来。还有一点,发现某些文章会在各家网站进行转载,采用自然语言处理去重消息也是后续的一个工作点。

2. Web前端和数据库

由于这次会涉及到科学计算,所以后端计划用Python开发,之前的Libmicrohttpd要是调用的话,就必然涉及到CGI,略显麻烦。而且目前对访问量没有要求,搜了一下之后就用上这么个时髦的Tornado的Web微框架。其实Python Web框架很多,但是自己应该不会用太复杂的功能,话说Tornado虽然是单线程的,但是基于底层异步IO,在并发量高的时候性能会好很多(万一做强大了呢,哈哈)。在实际部署中,可以后台开启多个Tornado实例绑定到不同端口,然后前面再套个Nginx做负载均衡,算是Python Web开发的标准了。
数据库原来想用sqlite的,但后来想想还是用了MySQL,数据库连接器用的是叫做torndb这个库,原本是集成在Tornado里面的,算是对MySQLdb的一个封装,但在后面新版本tornado中被剥离出来了。

3. Feed/Atom内容抓取

  算是非常重要的模块,没有内容不是无米之炊么。由于历史原因,Feed有几个版本,而且不完全兼容,不过我只用到最简单的元素:比如title/link/description这些,所以问题不大,系统会开一个线程定时专门负责扫描feed。
目前觉得用Feed内容比较单调,后续可能会考虑添加爬虫模块,爬一些主流站点,可以丰富内容。自己之前用的Sina/Twitter机器人,也可以考虑添加进来。还有一点,发现某些文章会在各家网站进行转载,采用自然语言处理去重消息也是后续的一个工作点。

4. 新闻推荐

  原本是打算用LSI,建立用户的兴趣点进行推荐的,留着后面搞个大新闻吧。
当前就用了最大熵分类算法:根据用户前五天的好差文章评价用作训练数据,然后对当日爬到的新闻,计算其好/差的概率,依据此排序进行推荐,相关算法已经在之前的chinese_nlp(https://github.com/taozhijiang/chinese_nlp)介绍过了,没有什么难处。
还有,推荐的结果会有一个好/差的排序方式,一方面需要保持后续训练负样本的数量相对平衡(如果用LSI建立兴趣点的话,就没有这个限制了,兴趣中心点可以根据用户对每个文章的好恶进行修正);此外,本着对用户负责的态度,还是要看看自己不喜欢的文章,防止某些重要或者有趣的信息被推荐引擎过滤掉了(请看社交网络为用户进行「个性化推荐」的做法,是否会导致人们「难以接触到意见相左的人」(https://www.zhihu.com/question/46480353))。

5. 前端交互

  Tornado可以通过模板快速生成动态网页,而对于请求不同的url也可以路由到不同的处理类中,开发起来十分的方便。但是前端的用户交互行为,比如筛选、排序、点赞等行为,对于一个不懂前端的人,还是比较困难的。靠着强大的谷歌,顺顺利利地抄袭了几段代码简陋的实现了…CSS样式也是丑到家了…前端对大家没啥参考价值,不要学我。

6. 展望

  后续可以把OAuth认证搞进来,Tornado本身是支持的;考虑开放个API,如果有兴趣做移动APP的可以来耍,我本人是没这个精力了;一个完善的LSI推荐实现,乃至后面的协同推荐,算是一个很期待的突破点,所以很期待你们的注册,帮我积累用户行为数据。
体验地址:https://r.taozj.org(https://r.taozj.org)

代码已经托管到GitHub readmeinfo(https://github.com/taozhijiang/readmeinfo),欢迎指正。

本文完!

基于内容推荐的个性化新闻阅读实现