软工大做业·历物语(二)

文章来源:中国软工亚洲指挥中心(Steins;Gate)
共同做者:纪神,爵爷,老板,小男孩(按首字拼音排序)
责任编辑:爵爷算法

    先大体说一下这两周完成的内容:数据库

  • 登陆界面
  • 注册界面
  • 新闻详情界面
  • 用户偏好算法(第一版)的设计与实现
  • 通知系统
  • 私信系统
  • 部分实现了数据操做辅助类族
  • 部分实现了推送系统
  • 部分UI的优化

    细节还有很是很是多,固然不是说要拘泥于细节而失去了总体意识,而是在细节的把控中了解整个项目的脉络。虽然功能远没有实现完,可是如今的项目结构已经略显臃肿了,因此下一周准备梳理一下整个项目,开始尝试自上而下地审视并从新设计一下整个结构。数组

    本周作的工做值得细说的仍是用户偏好算法的设计。用户偏好算法是咱们项目的核心算法,目的是为推测出用户近期对于新闻类型的偏好,并记录在系统内,从而在以后可让用户选择本身感兴趣的信息,而且每当发布了用户感兴趣的信息以后能够推送给用户。除此以外,最重要的一点是,系统能够根据用户的喜爱向用户提供兴趣相投的好友,从而提高用户黏性,并能够隐形中推广应用。
    做为一个用户偏好推测算法,能够划分到人工智能的领域,在这里我想谈一下对于算法起点的考虑。说到机器学习,普通水平的实现只要看了Coursera上吴恩达的Machine Learning就够用了(固然我是说很是简单的应用),再否则Github上一堆数千star的项目,甚至都不须要知道基本概念。可是在第一版算法设计中咱们并无采用机器学习算法,这是因为如下几点考虑:服务器

  • 咱们采集的数据特征值很是少
  • 咱们采集的数据量很是少
  • 手机计算资源的限制
  • 在对机器学习没有深刻的研究的状况下,设计出的算法有时还不如最普通的迭代

    在第一版算法设计中,咱们只是使用了简单的权值计算,目前先实现这版测试一下效果如何,具体设计以下:机器学习

算法目的:

    为推测出用户近期对于新闻类型的偏好,并记录在系统内,从而在以后可让用户选择本身感兴趣的信息,而且每当发布了用户感兴趣的信息以后能够推送给用户。除此以外,最重要的一点是,系统能够根据用户的喜爱向用户提供兴趣相投的好友,从而提高用户黏性,并能够隐形中推广应用。学习

算法原理:

    算法计算结果是用户对于某种类型的新闻的偏好程度,目的在于两部分,第一部分是推测近期趋势,第二部分是推测用户喜爱。
    为了体现这两部分,咱们使用两个衡量指标:时间因子tf(time factor)和认真程度cd(conscientious degree)来表示。为了突出两方面的因素,咱们使用高阶运算来提高权值,计算出的值为tpw(temporary preference weight)
    除此以外,因为偏好值的计算是不断迭代的,因此每次计算新的偏好值时应该考虑以前的计算结果,给定一个权值因子wf(weight factor),并设旧的用户偏好值为opw(old preference weight),则新的用户偏好值为npw = opw wf + (1 - wf) * tpw*,目前取wf为0.3,并取opw初值为0。测试

算法过程:

    把用户访问一篇新闻的时间以及在这篇新闻上的停留时间分别设为visitTime(单位:毫秒)stayTime(单位:毫秒),考虑经过这两个因素来计算tf和cd。
    一、对于tf的计算,主要是体现用户的偏好有多“新”,考虑取看这篇新闻距离如今的时间间隔,即currentTime - visitTime,换算整天数设为dayInterval,那么能够取tf = 30 / (dayInterval + 1)(取30为了使tf和cd处于同一个数量级)。
    二、 对于cd的计算,取平均阅读每一个字所用的时间,设新闻正文字数为newsLength,则cd = stayTime / newsLength
    三、对于tpw的计算,为了使越新、阅读越认真的新闻重要性越大且增加速度愈来愈快,能够取tf和cd和的平方,即tpw = (tf + cd) ^ 2。 而用户在某一种类的新闻浏览记录有n条,设每条记录计算的tpw值为tpwi,综上所述可得tpwi = (30 24 * 3600 * 1000 / (currentTime - visitTime + 86400000) + stayTime / newsLength) ^ 2
    四、则tpw最终计算结果为。最终计算所得的
npw = wf * opw + (1 - wf) * tpw
(注意:还能够考虑的一点是,若是我是信息学院计算机系的,你也是信息学院计算机系的,那么咱们极可能就有共同语言,也就是同一学院、同一学系或者同一年级的用户也可能有共同的喜爱,即便这一点没有体如今算法计算结果上,考虑把这一点也加在偏好算法计算中)*。优化

算法实施:

    咱们在数据库中设置了一张用户偏好表用于记录用户偏好信息,表项有用户id、新闻类型、偏好旧值和详细信息,在详细信息中记录了一个数组,数组中每个元素都包含visitTime和stayTime两部分。
    每当用户访问一篇新闻时,都会更新相应的表项。同时在用户表中添加一个喜爱标签表项,记录用户最近最感兴趣的新闻类型,最多记录三个,太多的话匹配结果会过多,使得匹配系统没有了意义,并且用户也没有精力去关注那么多的新闻类型。当分别计算完一个用户对于各个新闻类型的喜爱权值以后,将其排序,获得的前三名新闻类型放入喜爱标签中。
    当推送新闻时,直接根据标签过滤便可。推荐好友时,比对两人的喜爱标签便可,只要有共同的标签就推荐,而且若是当前用户没有喜爱标签,那么就随机从全部用户中抽取;若是当前用户有喜爱标签,那么对于其余待匹配的没有喜爱标签的用户而言,也采用随机抽取的办法。
    关于用户喜爱的计算时机,由于计算不是在服务器上完成的(用云引擎有点麻烦并且也不必占用服务器资源),因此考虑只要用户登陆了,就在后台计算用户偏好,每一个登陆周期偏好只计算一次。人工智能

    目前为止只作了简单的试验,算法能够获得较为合理的偏好值,可是在真实的应用场景中效果如何还有待进一步的测试。设计

相关文章
相关标签/搜索