最近接手一个新闻项目,项目比较小,属于官网的一个支站,官网新闻条目有700多万条,我负责的支站新闻条目11万条,我想拿这个小支站用来练练手,做一个小的基于内容的新闻推荐,当用户阅读某篇新闻时,旁边显示和这条新闻相关的新闻列表。
站点比较小,简单 能实现要求就好,主要步骤如下所示
建立标签库,为每篇文章加要标签
标签库的建立主要有三种方案
1. 数据库新闻表中添加一个tag字段,多个标签一般用”,”分隔
title tags
公共场所VIP现象泛滥 被指易引发不公平争议 公共场所VIP现象泛滥,被指易引发不公平争议
六成网友中学知识已忘光 四成学习就为考试 六成网友中学知识已忘光,四成学习就为考试
贵州镇远报京侗寨发生火灾 100余栋房屋被烧 贵州镇远报京侗寨发生火灾,100余栋房屋被烧
中国外交部:望平衡各自关切 重启六方会谈 中国外交部:望平衡各自关切,重启六方会谈
市领导带头捐款 专项用于生产生活污水治理 市领导带头捐款,专项用于生产生活污水治理
美国:暴风雪席卷东北部 陆空交通严重受阻 美国:暴风雪席卷东北部,陆空交通严重受阻
当情人节遭遇元宵节 西湖浓情上演美好快闪 当情人节遭遇元宵节,西湖浓情上演美好快闪
余额宝推一年期理财产品 150万人已预约认购 余额宝推一年期理财产品,150万人已预约认购
除夕至初三网银暂停跨行转账 ATM机不受影响 除夕至初三网银暂停跨行转账,ATM机不受影响
数据说春运:接送父母来过年 逆向迁徙渐热 数据说春运:接送父母来过年,逆向迁徙渐热
钱包“完璧归赵” 众人“接力”找失主 为让钱包“完璧归赵”,众人“接力”找失主
乌克兰:和谈破裂局势失控 美国威胁要制裁 乌克兰:和谈破裂局势失控,美国威胁要制裁
以上为原先数据库中的标签,这些标签可能是编辑不太懂,导致部分标签过长,有的甚至就是新闻名称,原先数据库就是按这种方式建立标签库的,这种标签并没有太大的做用,主要有以下几点缺点:
标签名过长
无法通过索引查找标签
无法统计标签新闻数量
总结原先库中的标签几乎没用
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
山东一高考生临阵弃考跑去网吧打游戏 山东, 高考生, 一高, 考生, 打游戏, 网吧, 临阵
我选择第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,不同计为0
时间
时间也是很重要的因素,我认为时间相隔太远,这种新闻它的新闻性就消失了,所有我将时间完全相同计为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
下图为相关新闻的内容,可以看出新闻的相关性还是很大了,基本满足相关新闻推荐需求,相关新闻的时间也是比较相近的
雅安地震 上海车展为雅安捐款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