基于内容的简单相关新闻推荐系统方案

写作背景

最近接手一个新闻项目,项目比较小,属于官网的一个支站,官网新闻条目有700多万条,我负责的支站新闻条目11万条,我想拿这个小支站用来练练手,做一个小的基于内容的新闻推荐,当用户阅读某篇新闻时,旁边显示和这条新闻相关的新闻列表。

总体思路

站点比较小,简单 能实现要求就好,主要步骤如下所示
建立标签库,为每篇文章加要标签
标签库的建立主要有三种方案
1. 数据库新闻表中添加一个tag字段,多个标签一般用”,”分隔

            title                           tags
公共场所VIP现象泛滥 被指易引发不公平争议  公共场所VIP现象泛滥,被指易引发不公平争议
六成网友中学知识已忘光 四成学习就为考试    六成网友中学知识已忘光,四成学习就为考试
贵州镇远报京侗寨发生火灾 100余栋房屋被烧  贵州镇远报京侗寨发生火灾,100余栋房屋被烧
中国外交部:望平衡各自关切 重启六方会谈    中国外交部:望平衡各自关切,重启六方会谈
市领导带头捐款  专项用于生产生活污水治理   市领导带头捐款,专项用于生产生活污水治理
美国:暴风雪席卷东北部 陆空交通严重受阻    美国:暴风雪席卷东北部,陆空交通严重受阻
当情人节遭遇元宵节 西湖浓情上演美好快闪    当情人节遭遇元宵节,西湖浓情上演美好快闪
余额宝推一年期理财产品 150万人已预约认购  余额宝推一年期理财产品,150万人已预约认购
除夕至初三网银暂停跨行转账 ATM机不受影响  除夕至初三网银暂停跨行转账,ATM机不受影响
数据说春运:接送父母来过年 逆向迁徙渐热    数据说春运:接送父母来过年,逆向迁徙渐热
钱包“完璧归赵” 众人“接力”找失主  为让钱包“完璧归赵”,众人“接力”找失主
乌克兰:和谈破裂局势失控 美国威胁要制裁    乌克兰:和谈破裂局势失控,美国威胁要制裁

以上为原先数据库中的标签,这些标签可能是编辑不太懂,导致部分标签过长,有的甚至就是新闻名称,原先数据库就是按这种方式建立标签库的,这种标签并没有太大的做用,主要有以下几点缺点:
标签名过长
无法通过索引查找标签
无法统计标签新闻数量
总结原先库中的标签几乎没用

  1. 增加两张表,一张为标签表,一张为标签与文章映射表,如下
    标签表:
id  name   sore     num
1   新闻  1            4367
2   诸暨  0.730766    1375
3   中国  0.684373    883
4   浙江  0.634607    2860
5   杭州  0.605594    3450
6   广播  0.526306    954
7   我市  0.487695    2065
8   视频  0.444434    911

其中sore为标签权重 ,num为标签引用数量

标签与文章映射表:

id article_id tag_id
1   16802       728
2   24641       728
3   23955       729
4   22117       729
5   24362       738

文章中增加标签字段:

title                                     tags
如花女孩遭调戏不成被凶手杀死          如花, 遭调戏, 杀死, 女孩, 调戏, 凶手, 彭程程被杀案
嫩模拍粽子写真遭红绳捆绑 网友痛批:三俗        嫩模, 网友, 捆绑, 三俗, 粽子, 写真
曾一鸣逆袭秀唱功惊艳 心性被指不成熟      成熟, 唱功, 惊艳, 逆袭, 曾一鸣, 心性
美国4岁男孩因好奇玩枪误杀父亲     美国, 好奇, 男孩玩枪误杀, 男孩, 4岁男孩, 玩枪误杀父亲
LOL 搞笑时刻                        搞笑时刻, 英雄联盟, lol
山东一高考生临阵弃考跑去网吧打游戏       山东, 高考生, 一高, 考生, 打游戏, 网吧, 临阵
  1. 第三种思想与第2种是一样的,只不过把标签表与映射表放到NoSQL数据库中,如mongdb,Redis

我选择第2种方法,因为站点访问量不太,Mysql建立好索引,第2种方式没有什么问题,如果并发大了可以换成NOSQL

分词建立标签库

因为原先库中标签比较乱,所以我通过对文章标题、标签、描述进行分词,重新建立了一套标签库,标签数量在10万条左右,然后对文章重新打上标签
重新打过的标签如下:

29451   如花女孩遭调戏不成被凶手杀死  如花, 遭调戏, 杀死, 女孩, 调戏, 凶手, 彭程程被杀案
29452   嫩模拍粽子写真遭红绳捆绑 网友痛批:三俗    嫩模, 网友, 捆绑, 三俗, 粽子, 写真
29453   曾一鸣逆袭秀唱功惊艳 心性被指不成熟  成熟, 唱功, 惊艳, 逆袭, 曾一鸣, 心性
29454   美国4岁男孩因好奇玩枪误杀父亲 美国, 好奇, 男孩玩枪误杀, 男孩, 4岁男孩, 玩枪误杀父亲
29455   LOL 搞笑时刻    搞笑时刻, 英雄联盟, lol
29456   山东一高考生临阵弃考跑去网吧打游戏   山东, 高考生, 一高, 考生, 打游戏, 网吧, 临阵
29457   湖北钟祥高考生围堵异地监考老师 高考生, 钟祥, 异地, 监考老师, 围堵, 湖北
29458   LOL爆笑失误 英雄联盟, 爆笑失误, lol
29459   怀孕女星向奥巴马投毒被捕 曾演《行尸走肉》   投毒, 投毒奥巴马, 行尸走肉女星, 行尸走肉, 奥巴马, 女星, 被捕, 怀孕
29460   LOL搞笑视频 :卖萌的诱饵  英雄联盟搞笑, lol搞笑视频, 卖萌
29461   QQ炫舞2 Tenderness 节奏-Promise qq炫舞, tenderness, promise, 节奏
29462   LOL坑爹集锦_第23期 小苍亲自出境 亲自, 出境, 小苍, 英雄联盟

考虑文章相似度因素

计算两篇文章相似度的因素在我的应用中,我认为主要有三个:标签、分类、时间
1. 标签
标签相同自然文章比较相关,所以标签是重要的一个因素,所以标签在相似度计算中权重要大一些,比如一篇文章 标签完全相同,我计为10,分类完全相同我计为1,时间完全相同我计为1,计算两组标签的相似度算法,在上一篇文章中有介绍。

  1. 分类
    分类相似度计算比较简单,分类相同计为1,不同计为0

  2. 时间
    时间也是很重要的因素,我认为时间相隔太远,这种新闻它的新闻性就消失了,所有我将时间完全相同计为1,时间相隔大于一个月,就为0了,计算时间相似度代码如下

    /**
     * 计算时间相似度
     * 
     * @param time1
     * @param time2
     * @return
     */
    public static double UnixTimeSmiler(Long time1, Long time2) {
        double d = (double) Math.abs(time1 - time2) / MonthSecond;
        return d > 1 ? 0 : 1 - d;
    }

计算文章相似库

有了标签、分类、时间三种因素后就可以计算文章间的相似度了,但是有10万条,如果10万与10万遍历计算,就需要计算100亿次,本人暂时还不会大数据计算,所以这种方式不可取,我采取将数据库中标签至少有一条标签相同的文章进行计算,这样每篇文章平均只需要与200个计算,总共计算2亿次,数量不多,10万条只需要几个小时就算好了,然后对算好的按得分排序,就得到相关新闻了

结果展示

如下为文章id=22004的相关文章结果,总共有2000多条,以下前几条

 id     v_id     r_id     sore
329182  22004   21948   5.447735589921648
329199  22004   22011   5.442327017616469
329202  22004   22017   5.442047310826345
329184  22004   21954   5.440337820085604
329198  22004   22008   5.265800752723249
329183  22004   21950   5.263486709513373
329190  22004   21965   5.112192150102882
329189  22004   21961   5.11200580751029
329170  22004   21878   5.108163214917697
329186  22004   21958   4.979295111975028
329178  22004   21896   4.976424741604658
329612  22004   21966   4.925942888598685
329193  22004   22002   4.86436690356514
329175  22004   21884   4.858905483812053
329203  22004   22019   4.759566635517565
329191  22004   21967   4.758552360826207
329618  22004   22889   4.57655491715546
329201  22004   22016   4.448931486610339
329187  22004   21959   4.333413884953704
329172  22004   21880   4.329758020756174
329169  22004   21877   4.329617974459877
329200  22004   22014   4.308936570585663
329678  22004   21860   4.296562342190602
329176  22004   21885   4.230563733672629
329173  22004   21881   4.230374304660284
329171  22004   21879   4.230281326265222
329669  22004   21687   4.22662561379554
329192  22004   21978   4.1069833320875615
329649  22004   21953   4.105824767272747
329645  22004   21900   3.9469861026871893
329658  22004   21865   3.9419834020699054

下图为相关新闻的内容,可以看出新闻的相关性还是很大了,基本满足相关新闻推荐需求,相关新闻的时间也是比较相近的
基于内容的简单相关新闻推荐系统方案_第1张图片

雅安地震 上海车展为雅安捐款100万 美女车模现场祈福 |   民生  |   雅安地震, 100万, 捐款, 雅安庐山地震, 现场, 雅安, 美女祈福, 祈福, 上海车展, 最新消息, 美女车模  |   2013-04-22 22:14:39
【雅安地震】90后大学生在雅安 做志愿者牵挂父母    |   民生  |   牵挂, 现场, 生在, 四川雅安, 志愿者, 支援, 最新消息, 雅安地震, 大学, 90后, 雅安, 父母, 庐山地震    |   2013-04-22 22:26:41
雅安地震 好室友 一人救出6台电脑3台单反1只小龟   |   微视频 |   雅安地震, 电脑, 单反, 一人, 现场, 救出, 四川雅安, 支援, 最新消息, 芦山地震, 室友, 地震好室友   |   2013-04-22 22:50:39
雅安地震 陈光标携30万灾区发现金 网友标哥正能量作秀也支持  |   微视频 |   万发, 现场, 四川雅安地震, 最新消息, 30万, 芦山地震, 现金, 雅安地震, 灾区, 网友, 正能量, 陈光标, 陈光标发现金, 支持 |   2013-04-23 00:34:38
雅安地震已安置受灾群众17.1万人   |   微视频 |   雅安地震, 雅安志愿者, 现场, 四川雅安地震, 受灾群众, 支援, 万人, 最新消息, 庐山地震, 安置   |   2013-04-23 00:38:38
雅安地震灾区暂无水质污染报告  |   微视频 |   暂无, 现场, 地震灾区, 雅安, 四川雅安地震, 水质污染, 报告, 最新消息, 庐山地震  |   2013-04-23 00:46:39
雅安地震最新消息 成都志愿者全媒体平台启动   |   微视频 |   雅安地震, 成都, 启动, 雅安志愿者, 现场, 全媒体, 平台, 四川雅安地震, 志愿者, 支援, 最新消息, 庐山地震   |   2013-04-23 00:54:39
雅安地震:安徽人民伸援手 捐款捐物送灾区    |   微视频 |   雅安地震, 灾区, 捐款捐物, 现场, 四川, 支援, 伸援手, 庐山地震, 最新消息, 人民, 安徽 |   2013-04-23 00:56:38
关注雅安地震救援行动 5位创伤科专家赶赴现场  |   民生  |   雅安地震, 创伤, 现场, 四川, 支援, 专家, 最新消息, 芦山地震, 行动, 关注, 救援    |   2013-04-23 01:00:39
雅安地震 芦山县7.0级地震美专家认为雅安地震为汶川地震余震  |   民生  |   雅安地震, 芦山县, 余震, 现场, 认为, 汶川地震, 四川雅安地震, 美专家, 庐山地震, 最新消息, 地震    |   2013-04-23 01:08:42
四川雅安地震背后的警示 |   民生  |   雅安地震, 警示, 四川雅安地震, 四川, 庐山地震, 最新消息, 背后    |   2013-04-23 01:10:42
视频 李总理握伤员手称政府会管医药费不用担心  |   民生  |   救灾, 现场, 总理, 四川雅安地震, 手称, 支援, 最新消息, 芦山地震, 医药费, 政府, 不用, 担心, 视频, 伤员 |   2013-04-23 01:12:45
四川雅安地震 成都空军频繁出动战机 架起“宝兴孤岛”空中生命线 |   微视频 |   频繁, 出动, 现场, 四川雅安地震, 支援, 最新消息, 芦山地震, 架起, 宝兴孤岛, 成都空军, 战机, 生命, 空中  |   2013-04-23 02:22:37
雅安地震 雅安治安村附近山体出现裂缝 面临滑坡危险   |   微视频 |   面临, 治安, 现场, 四川雅安地震, 山体, 裂缝, 最新消息, 芦山地震, 雅安地震, 危险, 雅安, 出现, 滑坡, 裂缝滑坡, 附近  |   2013-04-23 02:26:37
四川雅安地震 婴儿地震丧母 志愿者哺乳获赞“最美妈妈” |   微视频 |   婴儿, 最美妈妈, 哺乳, 现场, 四川雅安地震, 志愿者, 支援, 最新消息, 芦山地震, 地震   |   2013-04-23 02:34:38
雅安震区有降水 需防次生灾害  |   微视频 |   震区, 现场, 降水, 雅安, 四川雅安地震, 支援, 庐山地震, 最新消息, 次生灾害    |   2013-04-23 02:40:39
四川雅安地震 芦山县灾民安置点的最新消息    |   微视频 |   芦山县, 安置点, 现场, 四川雅安地震, 支援, 最新消息, 庐山地震, 最新灾情, 灾民, 救援  |   2013-04-23 02:50:44
雅安小男孩抢镜唱歌向外婆报平安 |   民生  |   抢镜唱歌, 现场, 唱歌报平安, 向外婆, 四川雅安地震, 最新消息, 芦山地震, 雅安小男孩, 平安 |   2013-04-23 02:52:44
四川宝兴一中学雅安地震后成废墟 系汶川地震后重建    |   民生  |   现场, 四川雅安地震, 四川, 后成, 支援, 汶川, 最新消息, 废墟, 地震后, 中学, 雅安地震, 宝兴中学, 宝兴, 重建   |   2013-04-23 02:56:40
四川全省为芦山地震遇难者默哀3分钟   |   微视频 |   雅安地震, 全省, 3分钟, 四川雅安地震, 四川, 芦山地震, 默哀, 遇难者    |   2013-04-27 23:07:31

你可能感兴趣的:(Java,算法,新闻,标签,推荐,基于内容)