新闻个性化推荐系统(python)-(附源码 数据集)
最近参加了一个评测,是关于新闻个性化推荐。说白了就是给你一个人的浏览记录,预测他下一次的浏览记录。花了一周时间写了一个集成系统,可以一键推荐新闻,但是准确率比较不理想,所以发到这里希望大家加以改进。用到的分词部分的代码借用的jieba分词。数据集和代码在下面会给出。
数据集
一共五个字段,以tab隔开。分别是user编号,news编号,时间编号,新闻标题,对应当前月份的日(3就是3号)。
代码部分
先来看下演示图
(1)算法说明
举个例子简单说明下算法,其实也比较简单,不妥的地方希望大家指正。我们有如下一条数据
[plain] view plaincopy
- 5738936 100649879 1394550848 MH370航班假护照乘客身份查明(更新) 11
5738936这名用户在11号看了“MH370航班假护照乘客...”这条新闻。我们通过jieba找出11号的热点词如下。
[plain] view plaincopy
- 失联 311 三周年 马方 偷渡客 隐形 护照 吉隆坡 航班 护照者
我们发现“航班”、“护照”这两个keywords出现在新闻里。于是我们就推荐5738936这名用户,11号出现“航班”、“护照”的其它新闻。同时我们对推荐集做了处理,比如说5738936浏览过的新闻不会出现,热度非常低的新闻不会出现等。
(2)使用方法
整个系统采用一键式启动,使用起来非常方便。首先建立一个test文件夹,然后在test里新建三个文件夹,注意命名要和图中的统一,因为新闻是有时效的,每一天要去分开来计算,要存储每一天的内容做成文档。test文档如下图,就可以自动生成。(代码文件夹提供了完整的test文档结构)
使用的时候,要先在Global_param.py中设置好test文件夹的路径参数。一切设置完毕,只要找到wordSplite_test包下面的main()函数,运行程序即可。
Global_param中设置参数说明:
number_jieba:控制提取关键词的数量
number_day:从第一天开始,要预测的天数
hot_rate:预测集预测的新闻热度,数值越大热度越高
(3)代码流程
首先我们从main()看起。
[python] view plaincopy
import Get_day_data
import Get_keywords
import Get_keynews
import Delete_Repeat
import Get_hot_result
import Global_param
def main():
for i in range(1,Global_param.number_day):
Get_day_data.TransforData(i)
Get_day_data.TransforDataset(i)
Get_keywords.Get_keywords(i)
Get_keynews.Get_keynews(i)
Delete_Repeat.Delete_Repeat()
Get_hot_result.get_hot_result(Global_param.hot_rate)
main()
1.首先Get_day_data.TransforData(i)函数,找到最后一次浏览的是第i天的新闻的用户行为,存放在test/train_lastday_set目录下。
2.Get_day_data.TransforDataset(i)函数,区分每一天的新闻,存放在test/train_date_set1目录下
3.Get_keywords.Get_keywords(i)函数,调用jieba库,挑出每一天最火的keywords,存放在test/key_words下
4.Get_keynews.Get_keynews(i)函数,通过每一个用户最后一次浏览的新闻,比对看有没有出现当天的热门keywords。如果出现,就推荐当天包含这个keywords的其它新闻。循环Global_param.number_day天,生成test/result.txt文件
5. Delete_Repeat.Delete_Repeat()函数,去除result中的重复项,生成test/result_no_repeat.txt
6.Get_hot_result.get_hot_result(Global_param.hot_rate)函数,因为上面生成的result_no_repeat函数可能出现,每个用户推荐过多的情况,影响准确率。所以用这个函数控制数量,每个用户只推荐新闻热度相对高的候选项。最终结果集
test/result_no_repeat_hot.txt
注意:test下的result.txt文件每执行一次程序要手动清空,其它文件都是自动生成不用处理。
(本文发布于http://blog.csdn.net/buptgshengod)
- rpc框架之 avro 学习 2 - 高效的序列化
- rpc框架之HA/负载均衡构架设计
- 使用Docker-Docker for Web Developers(2)
- 打造高效前端工作环境-tmuxinator
- 在Linux Mint上安装node.js和npm
- JS魔法堂:再识Number type
- (cljs/run-at (JSVM. :browser) "搭建刚好可用的开发环境!")
- (cljs/run-at (->JSVM :browser) "语言基础")
- 微博爬虫
- 电话域名受欢迎,微语言融资3000万
- 前端魔法堂——异常不仅仅是try/catch
- (cljs/run-at (JSVM. :all) "一起实现柯里化")
- (cljs/run-at (JSVM. :browser) "简单类型可不简单啊~")
- 前端魔法堂:解秘FOUC
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- FPGA设计心得(12)如何正确使用 in_system_ibert ?
- Java面试高频知识点汇总 垃圾回收(GC)机制专题
- Celery-分布式任务队列学习笔记
- Java面试高频知识点汇总 数据库专题
- Java面试高频知识点总结 Redis
- Java面试高频知识点总结 Spring
- 杂谈小程序
- pytest封神之路第四步 内置和自定义marker
- (译)SDL编程入门(3)事件驱动编程
- 一个简单的Angular search UI实现
- (译)SDL编程入门(2)在屏幕上显示图像
- 【Vue进阶】手把手教你在 Vue 中使用 JSX
- (译)SDL编程入门(1)Hello SDL
- Django使用Channels实现websocket
- (译)SDL编程入门(6)扩展库SDL_image