SideProject 2014 年 11 月 2 日

一个想法到 MVP 的历程

我觉得自己天生喜欢做产品。希望这是这篇文章唯一的废话。

####想法
>很多个早晨,我打开新闻客户端,准备看看世界发生了什么,但是一不小心打开了一个充满了负能量的新闻, >整个人一天都不好了,非常影响工作情绪。如果新闻客户端可以对新闻根据新闻情绪进行分类就好了,就算只是 >简单的正面、负面的分类也好呀。
有一天我和老同学何钞聊天,他和我说到。因为我曾经和他说过我和同事正在做一些小产品玩玩,也许他希望我们 可以试试这样的产品。对新闻按正、负面进行分类,这个小小的想法让我一下着了迷,因为:
  1. 这个想法足够的小。
  1. 这个想法的确有人需要。
所以我一下控制不住想立即去实现它。

####准备
我自己首先简单的思考了一下大致的实现思路:
  1. 新闻获取
  1. 新闻分类
  1. 新闻分发
由于新闻的获取和分类是耗时的操作,在客户端每次启动app才去进行是合理,所以应该这样: 在server端按照一定的时间间隔去各大新闻网站上去抓去新闻,然后对新闻进行分类存储,最后 客户通过REST API从server上获取相应的新闻进行对用户进行分发。
获取新闻容易,但是新闻的分类是一个难点,好吧,向南洋理工大学研习机器学习@大手同学 咨询一下。没想到他已经转到了计算机视觉方向了,NLP和ML已经不是他的强项了,不过通过简单 讨论了一下,我大致形成了这样的解决思路:分词 -> 词性判断 -> 评分。具体的说就是首先对句子 进行分词,并且句子的整体分数初始化为0,然后对每一个词语进行正负面词性的判断,如果为正面词汇, 该句子总分+1,如果为负面词汇,该句子总分-1,否则该句子总分+0.最后总分的正负值决定了这个句子的 正负面的程度。

####实现
  • 新闻获取
原本打算写一个爬虫自己去抓取各大新闻站点的新闻,后来发现网易新闻的RSS源里已经包含了最新的新闻 的所有基本信息:
  • title: 新闻的标题
  • description: 新闻的大致内容
  • guid: 新闻的id
  • pubDate: 新闻的发布时间
  • link: 新闻的页面链接
  • category: 新闻的类别
遂决定采用直接解析RSS的方法去获取新闻的列表。用一小段简单的脚本去获取和处理RSS。
  • 新闻分类
我们已经有了如下的解决思路:分词 -> 词性判断 -> 评分。具体的说就是首先对句子 进行分词,并且句子的整体分数初始化为0,然后对每一个词语进行正负面词性的判断,如果为正面词汇, 该句子总分+1,如果为负面词汇,该句子总分-1,否则该句子总分+0.最后总分的正负值决定了这个句子的 正负面的程度。
那么我们是不是要对整篇新闻进行这样的评分分类呢,现阶段我们并不需要那么做,我们只需要对新闻的 标题进行正负面的评分然后分类即可。原因是:新闻标题基本上决定了一篇新闻的情绪,从标题我们可以 大体上知道一则新闻是正面新闻、普通新闻还是负面新闻。
好吧,那么我们就开始对新闻标题进行分词,开源的分词系统很多,而且性能绝对已经满足了我们这种初级 产品的需求,简单的试了一下@梁博他们实验室的分词器,效果很不错,所以分词这个看起来很复杂的工作 我们只要一条命令就搞定了:

curl -s http://api.pullword.com/get.php\\\?source\\\=#{title}\\\&param1\\\=0\\\&param2\\\=0

那么如何对新闻进行评分呢,我们必须得知道哪些词语是正面、负面或是中性的。Google了一下我决定采用台湾大学 自然语言处理实验室的NTUSD。 这个词典裡面包含了正面以及负面情緒的词语集,正面情緒大约有2800个,负面情绪 8000个,总共大约10000个词语.
有了这个词典,我们就可以对一个句子进行正负面程度的评分了,比如对于这则新闻标题”小明很愤怒的杀死了很多人”, “愤怒”和“杀死”都是对应词典中的负面词汇,所以这条新闻的评分将是-2。
  • 新闻的分发
获取和分类过后的新闻直接存储到MySQL数据库中,这么牛逼的新闻分类,要尽快上线给大伙试用一下才好啊。好吧,快速的用 Rails搭建一个纯的APi server, 然后写一个极其简单的iOS app给大伙试试吧。

最后

talk is cheap, show me the code. 无码无真相.

GitHub

AppStore

这是一个一星期左右的作品,加上本人技术菜,求砖头轻拍哦。求砖头轻拍哦