1.软件需求分析

1.1客户需求

近些年纸质读物已经渐渐淡出我们的视线,有些人可能一周甚至一个月都不会接触这些东西。但是这并不代表人们已经停止从外界获取信息,正相反,人们获取信息的效率在网络和电子产品的帮助下大大提高了。就拿看新闻来说。二十年前,几乎所有人都是通过看报纸来获取信息。但是十年前,这个数量至少减少了一半,因为有一半的人选择通过看电视来获取这些信息。然后又过了十年,到了现在,看看我们的周围还有多少人是看报纸来获取信息的呢(甚至看电视的人数量也减少了一半以上)?

这一切得归功于信息技术的发展。依附于互联网的信息能够非常方便地被人们所获取。十年前,如果我想知道当天的新闻,我需要打开电视等到新闻播放的时间,或是下楼买份报纸。你也许会说,可以上那些新闻门户网站看。我的天,十年前的新闻网站可不是给人看新闻的(笑)。然而换成今天,我只需要打开我的电脑,插上网线,或是打开我的手机,连上网络。新闻总会从某些我意想不到的地方涌出来(虽然也许我得打开浏览器才能看到我想要的)。

但是科技是把双刃剑,随之而来的又是一连串的问题。由于信息过剩,我们又没有办法直接选择我们要看什么——并非是技术上的问题,而是出于我们的一种心理,总会觉得不看自己会错过许多东西。许多人在面对信息时感到不知所措,最后只好将大量的时间投入到寻找自己想要的信息上。这已经违背了科技发展的初衷

用户们开始为自己的时间着想,他们需要一个平台来聚合来自不同内容供应商的信息。然而聪明的开发者们早已预料到了这点。许多网站都提供了RSS的接口,由此,RSS阅读器开始占据了人们的视线。

使用了RSS阅读器之后获取信息的效率明显提升了,用户们的时间得到了解放。这本应该是一个大好的进步,但随着公共网站以及自媒体开始多平台投放内容,用户获取信息的效率也慢慢开始下降。以“恶魔的喵奶爸”这一自媒体为例,该自媒体以微信公众号、知乎专栏、值乎分答为主要投放平台,大部分其内容基本一致,只有个别时间该自媒体根据不同平台用户的特点进行特别内容的推送。显然,如果用户不想错过每个平台上的特殊内容,就只能每个平台都订阅该自媒体,而大部分时间每个平台上所获得内容是重复的,便无形之中降低了获取信息的效率。

这时候,如果有一款软件能有效的过滤掉多个平台上所订阅的自媒体的重复内容,用户获取有效信息的时间成本将大幅下降,用户便可以在不错过任何消息的前提下,节省阅读重复信息的时间。

1.2软件功能

“聚文”,具有RSS订阅功能、自动过滤重复信息功能以及内容分享功能。

1、RSS订阅功能

“聚文”支持RSS订阅,支持普通用户站内订阅(仅能订阅“聚文”站内所提供的自媒体),支持高级用户任意RSS订阅(若目标网站无RSS接口,“聚文”可自动生成)。除此以外,“聚文”将提高用户体验,对内容进行排版,对高级用户支持图文显示。

2、自动过滤重复信息

“聚文”自动标记不同平台上相同自媒体,并对相同自媒体所推送内容进行过滤冗余信息,保留不同内容,并在消息中高亮标记(指出出自哪个平台)。

3、内容分享功能

“聚文”支持用户分享与评论所订阅自媒体的内容片段,并定期根据用户行为特点推荐优质自媒体。

4、盈利模式

普通用户可以订阅一定数量的站内自媒体,但内容不支持图文显示,仅进行简单排版,同时消息推送中定期推送广告。

高级用户可以订阅更多任意自媒体,内容支持图文显示,无广告,支持kindle使用。

2聚文开发文档

2.1RSS阅读器

RSS是一种互联网上被广泛应用的内容包装和投递协议。由各大内容提供网站将RSS文件发布到网上,用户们可以通过特定的RSS订阅软件获取这些文件的内容,从而达到不用登陆门户网站便可获取信息的目的。

2.2RSS文件

RSS本质是使用XML书写的一个文件,其内容包括需要投放的内容的一些相关信息。

以下是一个示例:

<rss version="x.0" xmlns:dc="http://www.ptsb.com/" xmlns:trackback= "http://www.ptsb.com/public/xml/rss/module/trackback/" >  <channel><title>我的Blog</title><description>与我自己的技术Blog相关联</description><link>http://www.ptsb.com/</link><dc:language></dc:language><item><title><!-- 项标题 --></title><link><!-- 项 URL --></link><description><!-- 简要描述 --></description><!-- 可选的/可扩展的元素 --></item><item><!-- 可多个<item>项目--></item></channel>

在RSS文件中,主要有几种信息,依赖于网站提供的模板。上面这个RSS文件中就提供了标题链接简要描述文章内容。虽然各大门户网站会有所不同,不过大体上是一样的。于是我们在使用时可以建立一套较为统一的数据结构。

2.3阅读器的实现

我们计划在PC平台上使用web来实现“聚文”,在移动端上以APP的形式呈现。不过我们更希望用户尽量在PC上使用我们的“聚文”,原因在于PC具有屏幕大,浏览器渲染能力强的优势,能带给用户更为舒适的视觉体验。相比之下移动端无法完成这个任务,能做到的仅仅是传递消息。

使用web的好处有很多,一是用户使用起来较为方便,不需要安装特定的软件,不需被一些没必要的功能所困扰,而且不用更新(!!!!)。这比较符合我们的初衷——为“懒人”提供最方便最优质的信息获取渠道

二是开发成本较低,周期较短。web开发中,十分重要的前端开发部分门槛很低,可以节约原本就稀缺的技术人才。而且现今浏览器的渲染能力越来越强,仅用简单的网页代码就能做出很棒的web,这是非常有吸引力的。

三是大势所趋。PC端的开发正在走向”瘦客户“模式,这是无法阻挡的。用户们可以将更多的精力放在完成自己的工作上,而不是倒腾我们的应用。

以下为具体的实现思路:

1.前端方面,我们计划使用传统的HTML+CSS来进行web样式的设计,使用JavaScript辅助进行动态网页的实现。

2.后端方面,我们计划使用Node.js来架设服务器,用MySQL来作为我们的数据库。

3.运作原理方面,我们会定期从各大内容供应商处获取RSS文件,存储于数据库中,进行过滤,最后按照推送算法投递给用户。另外,对于高级用户,可以提供爬取指定网站的业务,也可以提供更高级更好用的解析器。

大体的框架就是如此,接下来我会谈谈我们的技术核心。

2.4核心技术

首先是一个简要的分析。

现在市面上的RSS阅读器种类繁多,框架已基本固定,而我们也将遵循这一框架。那我们的竞争力在何处呢?

答案是对于特定用户群体的特殊支持,算法方面的创新,以及一些较为亮眼的功能。

“聚文”的一大亮点是它将可以避免将重复的内容推送给用户。

经常使用自媒体的人都会有这样的一种经历,就是当你打开不同的订阅号或者不同网站的专栏时,往往会有一些内容一样的文章,因为有些作者会在不同的网站投放自己的作品,还有一些人会把自己喜欢的作品转载到自己的博客里,不过这种情况一般会注明“此文为转载”并附上原文地址(当然也不乏懒得加上直接复制粘贴的人)。传统的RSS阅读器往往不会在意这些细节,它会一股脑的把这些东西塞进你的页面,这样它的任务就完成了,不好受的却是你。

2.4.1重复内容筛选

如果要避免重复,有以下几种情况,我们不妨列出来一一处理:

  1. 最简单的情况,作者名字相同,标题相同,内容相同。这种应该算得上是最友好的了,我们可以直接打包在一起,作为一篇推送。

  2. 作者没有标注,排版有细微差别,但是内容上基本没有变化。这种情况是稍微麻烦一点的。因为往往转载后标题会有细微的差别,这样识别起来就比较困难。不过好在我们有tag的分类,大大缩小了对比的范围。这里我们可以引进一种常见的文本相似度算法——特征向量匹配

    此处先提一下信息过滤方面的伟大发明,TF-IDF

    TF,即Term Frequency,意为关键词频。顾名思义,这个指的是关键词在该文本中的出现频率。

    IDF,即Inverse document frequency,指逆向文本频率,是用于衡量关键词权重的一个指数。

    公式\[IDF = log\frac{D}{D_{w}}\]\(D\)为文章总数,\(D_w\)为关键词出现过的文章数)

    根据不同tag的数据库,我们可以得到相对应的关键词权重,这样我们可以构造出一个文本向量。根据不同类型的筛选我们可以构造出不同维度不同意义的向量,然后根据向量的相似度——余弦值来进行对比。

    在这里我们假设有两段文本。

    第一段:

    PT是一个聪明貌美男孩子,他有很多的追随者。一天早上,他起床照镜子,结果被自己帅死了。

    第二段:

    PT是一个聪明貌美的男孩子

    他有很多的追随者,如同众星捧月

    有一天,早上起床,他照镜子,结果被自己帅死了。

    第一段是我的一位朋友写的文章,文笔相当不错,受到了众人的赏识。于是一个叫做小红的粉丝将他的这篇文章转载到了自己的博客中。但是这位小红同学更喜欢自己的文字风格,于是她又在原文的基础上做了一些修改,成品就是第二段文本,看起来更酷了一些。

    本质上来讲,两篇文章的内容是一样的,tag和其他的分类也是相似的,但是纯粹靠字符串的对比无法识别出他们是重复的。现在这两段文字都被收录在聚文的数据库中,假如它们被同时推到了一位用户的界面上,将会大大的降低客户对我们的评价,从而造成用户流失甚至是更严重的后果。因此,我们需要对数据库内的内容进行一个筛选

    首先,我们要做的是从数据库中找出有可能出现重复的文段。这个阶段最直观的属性就是文段的字数。我们可以将字数相近的放在一起考虑,这样会大大降低工作量。这样分类完毕后两段文字就被分入了一个较小的集合中。我们暂且将其命名为A和B。

    之后,我们构建这个集合中的每个元素的向量

    在这个工作中,我们首先要进行文本的解析,去除其中的停用词(指的是“”,“”,“”这一类对大意基本无影响的词汇)。这样处理过后,A和B都变成了崭新的样子。

    A:

    PT 聪明 貌美 男孩子 追随者 早上 照镜子 帅 死

    B:

    PT 聪明 貌美 男孩子 追随者 众星捧月 早上 照镜子 帅 死

    可以看到,两个文段“长”得越来越像了。我们可以构建向量,再进行进一步的对比。

    A:\[α = (D_1,D_2,D_3…D_n)\]

    B:\[β = (D_1,D_2,D_3…D_n)\]

    这里的\(D_n\)代表的是关键词的编号,我们选取B的所有词汇作为关键词,如果文本中有\(D_n\)这个编号的关键词存在,则该坐标为1,反之为0 。之后进行α和β的对比。

    \[cosθ = \frac{α·β}{|α|·|β|} = \frac{\sum\limits_{i=1}^n D_{ia}·D_{ib}}{\sqrt{\sum\limits_{i=1}^nD_{ia}^2 ·\sum\limits_{i=1}^nD_{ib}^2} }\]

    根据这个公式我们可以求出α和β的余弦值。我们可以设定一个标准,当余弦值处于这个范围内时,我们断定α和β是重复文本,推送时将只推送其中一个。这样就避免了重复的问题。

    这只是一个简单的例子,算法有些不太严谨的地方。我们也许可以用关键词汇的相对位置来作为判断的指标,方法还有很多,在这里就不再详细解说。

    这样一来,这一类内容重复也就解决了。

  3. 内容大幅度修改。显然这已经不属于重复的范畴了。

2.4.2推送算法

最近比较火的一款音乐软件——网易云音乐,深得人们喜爱。无论男女老少,都喜欢用这个听歌。它并不像qq音乐那样拥有强大的高质音乐乐库以及独家放送,不像曾经的虾米那样拥有齐全到极点的乐库。但它就是火,而且不可否认的是,它确实受得起这份热情。

网易云音乐在很多方面都做得很好,十分符合绝大多数用户的需求,在这里我只谈一谈它的推送算法,因为实在是令人兴奋。

使用网易云的推送功能是这样的一种体验。你第一次打开网易云,点击私人FM。这时的网易云面对一个陌生的用户毫不慌张,直接开始一首歌一首歌往你的播放列表里塞。开始时,你会经常点击下一曲,直到出现哪首歌能让你静静听完为止。但是渐渐的,你发现自己点击下一曲的频率降低了不少。最后到了能一次都不切歌地听上一整天,还不会觉得烦腻。

就是这样美妙的一种感觉(实际上在写这篇文档的时候我也在挂着网易云听歌)。

文章其实和音乐一样,都是投放的供人消遣的内容,区别在于一个伺候眼睛,一个伺候耳朵。

那么我们该如何为用户推送他们想要的文章呢?

首先,用户都是有阅读倾向的,我们可以列一个表格出来。(这里代表的是PT和XIAOHONG两个人的阅读数量所占百分比统计)

编程 艺术 美食 文学
PT 0.10 0 0.90 0
XIAOHONG 0 0.33 0.33 0.34

从这里我们可以看出两个人的阅读倾向。PT阅读的文章有90%都是关于美食的,剩下10%则是关于编程,我们可以断定这是一个无可救药的程序猿。XIAOHONG阅读的文章涉及艺术,美食,文学,但是在编程方面却是0,说明这是一个普通人。

这时,我们的手里正好有几篇文章要投送,我们的工作人员已经为他们定好了tag(该表记录文章含有的不同元素的分数)

编程 艺术 美食 文学
《程序员与美食》 5 0 5 0
《如何享受生活》 0 4 3 3

现在用户的倾向和文章的偏向都有了,我们该如何来判断投送的方向呢?你可能会说:“这不是一目了然吗?”但是机器可不知道,所以还是得通过一点小小的计算。我们将两个表格内的数据转换成矩阵Q和P。

\[Q = \begin{vmatrix}0.10&0&0.90&0\\0&0.33&0.33&0.34\end{vmatrix}\] \[ P= \begin{vmatrix}5&0&5&0\\0&4&3&3\end{vmatrix}\]

假设一个新的矩阵R记录文章的适合程度。

\[R = Q \times P = \begin{vmatrix}5.00&2.70\\1.65&4.33\end{vmatrix}\]

转换成表格的形式:

《程序员与美食》 《如何享受生活》
PT 5.00 2.70
XIAOHONG 1.65 4.33

结果就很明显了。

随着用户阅读量的增加,推送内容会越来越适合ta。

但是这里还有个问题,如果纯粹靠工作人员手动打标签,工作量会不会太大了?

好在我们还有用户。

我们会为每篇推送打上一个标签,而这个标签是由内容来源决定的。它将决定我们对阅读该文章的用户的阅读倾向的评定。用户的每种阅读行为将有一个权重,比如说无视掉文章是0,打开文章看一眼就关掉是1,读一半关掉是2,读完再关掉是3。如此一来评定将更加贴切。

当用户的阅读倾向稳定下来后,我们将会“利用”他们。当一个用户阅读大厅中的文章时,他的阅读倾向将对这篇文章的tag产生影响。简单来讲这是一种反馈的机制,我们的系统赋予用户信息,同时又用这些信息来更新系统。

转载于:https://www.cnblogs.com/leiysky/articles/6077347.html