From 64ac592426f841f3ab31b05461b5dbcef03d9542 Mon Sep 17 00:00:00 2001 From: Tom Qian Date: Wed, 13 Dec 2017 11:30:01 +0800 Subject: [PATCH] refresh framework and offer test data --- .classpath | 37 ++-- .project | 6 + .settings/org.eclipse.core.resources.prefs | 2 +- .settings/org.eclipse.jdt.core.prefs | 1 + .settings/org.eclipse.m2e.core.prefs | 4 + README.md | 199 ++++++++++++++++- RecommandSystem.iml | 209 ------------------ bin/log4j.properties | 24 -- ...outUserBasedCollaborativeRecommender.class | Bin 6277 -> 3025 bytes .../quartz/CFCronTriggerRunner.class | Bin 2346 -> 1247 bytes .../quartz/CFJob.class | Bin 1168 -> 1092 bytes bin/top/qianxinyao/algorithms/JsonKit.class | Bin 4047 -> 1605 bytes .../qianxinyao/algorithms/PropGetKit.class | Bin 1937 -> 1112 bytes .../ContentBasedRecommender.class | Bin 8005 -> 2248 bytes .../contentbasedrecommend/TFIDF.class | Bin 1296 -> 1163 bytes .../UserPrefRefresher.class | Bin 8574 -> 6382 bytes .../quartz/CBCronTriggerRunner.class | Bin 2310 -> 1223 bytes .../contentbasedrecommend/quartz/CBJob.class | Bin 1116 -> 1068 bytes .../dbconnection/ConnectionFactory.class | Bin 4685 -> 3047 bytes .../quartz/HRCronTriggerRunner.class | Bin 2283 -> 1205 bytes .../hotrecommend/quartz/HRJob.class | Bin 742 -> 1050 bytes pom.xml | 123 +++++++++++ res/dbconfig.properties | 8 +- res/log4j.properties | 24 ++ res/paraConfig.properties | 9 +- src/.DS_Store | Bin 6148 -> 6148 bytes src/log4j.properties | 24 -- src/top/.DS_Store | Bin 6148 -> 6148 bytes src/top/qianxinyao/Main/JobSetter.java | 83 +++++++ src/top/qianxinyao/Main/Main.java | 42 ++++ .../qianxinyao/Main/TestDataProcessor.java | 108 +++++++++ ...houtUserBasedCollaborativeRecommender.java | 40 ++-- .../quartz/CFCronTriggerRunner.java | 4 +- .../quartz/CFJob.java | 2 +- .../algorithms/JsonKit.java | 0 .../algorithms/PropGetKit.java | 0 .../algorithms/RecommendAlgorithm.java | 2 +- .../algorithms/RecommendKit.java | 140 ++++++------ .../ContentBasedRecommender.java | 52 +++-- .../CustomizedComparator.java | 0 .../CustomizedHashMap.java | 0 .../MapValueComparator.java | 4 +- .../contentbasedrecommend/TFIDF.java | 0 .../UserPrefRefresher.java | 96 ++++---- .../quartz/CBCronTriggerRunner.java | 4 +- .../contentbasedrecommend/quartz/CBJob.java | 2 +- src/top/qianxinyao/dbconnection/DBKit.java | 104 +++++++++ .../dbconnection/StatementWatcher.java | 2 +- .../hotrecommend/HotRecommender.java | 51 +++-- .../quartz/HRCronTriggerRunner.java | 4 +- .../hotrecommend/quartz/HRJob.java | 0 src/top/qianxinyao/model/ModelGenerator.java | 49 ++++ src/top/qianxinyao/model/News.java | 11 + src/top/qianxinyao/model/Newslogs.java | 11 + src/top/qianxinyao/model/Newsmodules.java | 11 + src/top/qianxinyao/model/Recommendations.java | 11 + src/top/qianxinyao/model/Users.java | 11 + src/top/qianxinyao/model/_MappingKit.java | 26 +++ src/top/qianxinyao/model/base/BaseNews.java | 60 +++++ .../qianxinyao/model/base/BaseNewslogs.java | 52 +++++ .../model/base/BaseNewsmodules.java | 28 +++ .../model/base/BaseRecommendations.java | 60 +++++ src/top/qianxinyao/model/base/BaseUsers.java | 44 ++++ .../performance/Judge.java | 0 src/top/tomqian/Main/DataProcessor.java | 158 ------------- src/top/tomqian/Main/Main.java | 60 ----- .../dbconnection/ConnectionFactory.java | 163 -------------- target/classes/META-INF/MANIFEST.MF | 5 + .../recommender-system/pom.properties | 7 + .../top.tomqian/recommender-system/pom.xml | 123 +++++++++++ .../top/qianxinyao/Main/JobSetter.class | Bin 0 -> 2814 bytes target/classes/top/qianxinyao/Main/Main.class | Bin 0 -> 942 bytes .../qianxinyao/Main/TestDataProcessor.class | Bin 0 -> 4611 bytes ...outUserBasedCollaborativeRecommender.class | Bin 0 -> 6020 bytes .../quartz/CFCronTriggerRunner.class | Bin 0 -> 2366 bytes .../quartz/CFJob.class | Bin 0 -> 1166 bytes .../top/qianxinyao/algorithms/JsonKit$1.class | Bin .../top/qianxinyao/algorithms/JsonKit$2.class | Bin .../top/qianxinyao/algorithms/JsonKit$3.class | Bin .../top/qianxinyao/algorithms/JsonKit.class | Bin 0 -> 4047 bytes .../qianxinyao/algorithms/PropGetKit.class | Bin 0 -> 1937 bytes .../algorithms/RecommendAlgorithm.class | Bin 0 -> 625 bytes .../qianxinyao/algorithms/RecommendKit.class | Bin 0 -> 8887 bytes .../ContentBasedRecommender.class | Bin 0 -> 7983 bytes .../CustomizedComparator.class | Bin 0 -> 1222 bytes .../CustomizedHashMap.class | Bin 0 -> 2222 bytes .../MapValueComparator.class | Bin 0 -> 1242 bytes .../contentbasedrecommend/TFIDF.class | Bin 0 -> 1296 bytes .../UserPrefRefresher.class | Bin 0 -> 9239 bytes .../quartz/CBCronTriggerRunner.class | Bin 0 -> 2330 bytes .../contentbasedrecommend/quartz/CBJob.class | Bin 0 -> 1114 bytes .../top/qianxinyao/dbconnection/DBKit.class | Bin 0 -> 4193 bytes .../dbconnection/StatementWatcher.class | Bin 0 -> 937 bytes .../hotrecommend/HotRecommender.class | Bin 0 -> 5146 bytes .../quartz/HRCronTriggerRunner.class | Bin 0 -> 2303 bytes .../hotrecommend/quartz/HRJob.class | Bin 0 -> 742 bytes .../top/qianxinyao/model/ModelGenerator.class | Bin 0 -> 1868 bytes .../classes/top/qianxinyao/model/News.class | Bin 0 -> 541 bytes .../top/qianxinyao/model/Newslogs.class | Bin 0 -> 565 bytes .../top/qianxinyao/model/Newsmodules.class | Bin 0 -> 583 bytes .../qianxinyao/model/Recommendations.class | Bin 0 -> 607 bytes .../classes/top/qianxinyao/model/Users.class | Bin 0 -> 547 bytes .../top/qianxinyao/model/_MappingKit.class | Bin 0 -> 1005 bytes .../top/qianxinyao/model/base/BaseNews.class | Bin 0 -> 2418 bytes .../qianxinyao/model/base/BaseNewslogs.class | Bin 0 -> 2176 bytes .../model/base/BaseNewsmodules.class | Bin 0 -> 1388 bytes .../model/base/BaseRecommendations.class | Bin 0 -> 2548 bytes .../top/qianxinyao/model/base/BaseUsers.class | Bin 0 -> 1919 bytes .../top/qianxinyao/performance/Judge.class | Bin 0 -> 373 bytes test_data.sql | 117 ++++++++++ 110 files changed, 1550 insertions(+), 867 deletions(-) create mode 100644 .settings/org.eclipse.m2e.core.prefs delete mode 100644 RecommandSystem.iml delete mode 100644 bin/log4j.properties create mode 100644 pom.xml create mode 100644 res/log4j.properties delete mode 100644 src/log4j.properties create mode 100644 src/top/qianxinyao/Main/JobSetter.java create mode 100644 src/top/qianxinyao/Main/Main.java create mode 100644 src/top/qianxinyao/Main/TestDataProcessor.java rename src/top/{tomqian => qianxinyao}/UserBasedCollaborativeRecommender/MahoutUserBasedCollaborativeRecommender.java (71%) rename src/top/{tomqian => qianxinyao}/UserBasedCollaborativeRecommender/quartz/CFCronTriggerRunner.java (93%) rename src/top/{tomqian => qianxinyao}/UserBasedCollaborativeRecommender/quartz/CFJob.java (89%) rename src/top/{tomqian => qianxinyao}/algorithms/JsonKit.java (100%) rename src/top/{tomqian => qianxinyao}/algorithms/PropGetKit.java (100%) rename src/top/{tomqian => qianxinyao}/algorithms/RecommendAlgorithm.java (93%) rename src/top/{tomqian => qianxinyao}/algorithms/RecommendKit.java (59%) rename src/top/{tomqian => qianxinyao}/contentbasedrecommend/ContentBasedRecommender.java (72%) rename src/top/{tomqian => qianxinyao}/contentbasedrecommend/CustomizedComparator.java (100%) rename src/top/{tomqian => qianxinyao}/contentbasedrecommend/CustomizedHashMap.java (100%) rename src/top/{tomqian => qianxinyao}/contentbasedrecommend/MapValueComparator.java (68%) rename src/top/{tomqian => qianxinyao}/contentbasedrecommend/TFIDF.java (100%) rename src/top/{tomqian => qianxinyao}/contentbasedrecommend/UserPrefRefresher.java (64%) rename src/top/{tomqian => qianxinyao}/contentbasedrecommend/quartz/CBCronTriggerRunner.java (93%) rename src/top/{tomqian => qianxinyao}/contentbasedrecommend/quartz/CBJob.java (89%) create mode 100644 src/top/qianxinyao/dbconnection/DBKit.java rename src/top/{tomqian => qianxinyao}/dbconnection/StatementWatcher.java (97%) rename src/top/{tomqian => qianxinyao}/hotrecommend/HotRecommender.java (62%) rename src/top/{tomqian => qianxinyao}/hotrecommend/quartz/HRCronTriggerRunner.java (93%) rename src/top/{tomqian => qianxinyao}/hotrecommend/quartz/HRJob.java (100%) create mode 100644 src/top/qianxinyao/model/ModelGenerator.java create mode 100644 src/top/qianxinyao/model/News.java create mode 100644 src/top/qianxinyao/model/Newslogs.java create mode 100644 src/top/qianxinyao/model/Newsmodules.java create mode 100644 src/top/qianxinyao/model/Recommendations.java create mode 100644 src/top/qianxinyao/model/Users.java create mode 100644 src/top/qianxinyao/model/_MappingKit.java create mode 100644 src/top/qianxinyao/model/base/BaseNews.java create mode 100644 src/top/qianxinyao/model/base/BaseNewslogs.java create mode 100644 src/top/qianxinyao/model/base/BaseNewsmodules.java create mode 100644 src/top/qianxinyao/model/base/BaseRecommendations.java create mode 100644 src/top/qianxinyao/model/base/BaseUsers.java rename src/top/{tomqian => qianxinyao}/performance/Judge.java (100%) delete mode 100644 src/top/tomqian/Main/DataProcessor.java delete mode 100644 src/top/tomqian/Main/Main.java delete mode 100644 src/top/tomqian/dbconnection/ConnectionFactory.java create mode 100644 target/classes/META-INF/MANIFEST.MF create mode 100644 target/classes/META-INF/maven/top.tomqian/recommender-system/pom.properties create mode 100644 target/classes/META-INF/maven/top.tomqian/recommender-system/pom.xml create mode 100644 target/classes/top/qianxinyao/Main/JobSetter.class create mode 100644 target/classes/top/qianxinyao/Main/Main.class create mode 100644 target/classes/top/qianxinyao/Main/TestDataProcessor.class create mode 100644 target/classes/top/qianxinyao/UserBasedCollaborativeRecommender/MahoutUserBasedCollaborativeRecommender.class create mode 100644 target/classes/top/qianxinyao/UserBasedCollaborativeRecommender/quartz/CFCronTriggerRunner.class create mode 100644 target/classes/top/qianxinyao/UserBasedCollaborativeRecommender/quartz/CFJob.class rename {bin => target/classes}/top/qianxinyao/algorithms/JsonKit$1.class (100%) rename {bin => target/classes}/top/qianxinyao/algorithms/JsonKit$2.class (100%) rename {bin => target/classes}/top/qianxinyao/algorithms/JsonKit$3.class (100%) create mode 100644 target/classes/top/qianxinyao/algorithms/JsonKit.class create mode 100644 target/classes/top/qianxinyao/algorithms/PropGetKit.class create mode 100644 target/classes/top/qianxinyao/algorithms/RecommendAlgorithm.class create mode 100644 target/classes/top/qianxinyao/algorithms/RecommendKit.class create mode 100644 target/classes/top/qianxinyao/contentbasedrecommend/ContentBasedRecommender.class create mode 100644 target/classes/top/qianxinyao/contentbasedrecommend/CustomizedComparator.class create mode 100644 target/classes/top/qianxinyao/contentbasedrecommend/CustomizedHashMap.class create mode 100644 target/classes/top/qianxinyao/contentbasedrecommend/MapValueComparator.class create mode 100644 target/classes/top/qianxinyao/contentbasedrecommend/TFIDF.class create mode 100644 target/classes/top/qianxinyao/contentbasedrecommend/UserPrefRefresher.class create mode 100644 target/classes/top/qianxinyao/contentbasedrecommend/quartz/CBCronTriggerRunner.class create mode 100644 target/classes/top/qianxinyao/contentbasedrecommend/quartz/CBJob.class create mode 100644 target/classes/top/qianxinyao/dbconnection/DBKit.class create mode 100644 target/classes/top/qianxinyao/dbconnection/StatementWatcher.class create mode 100644 target/classes/top/qianxinyao/hotrecommend/HotRecommender.class create mode 100644 target/classes/top/qianxinyao/hotrecommend/quartz/HRCronTriggerRunner.class create mode 100644 target/classes/top/qianxinyao/hotrecommend/quartz/HRJob.class create mode 100644 target/classes/top/qianxinyao/model/ModelGenerator.class create mode 100644 target/classes/top/qianxinyao/model/News.class create mode 100644 target/classes/top/qianxinyao/model/Newslogs.class create mode 100644 target/classes/top/qianxinyao/model/Newsmodules.class create mode 100644 target/classes/top/qianxinyao/model/Recommendations.class create mode 100644 target/classes/top/qianxinyao/model/Users.class create mode 100644 target/classes/top/qianxinyao/model/_MappingKit.class create mode 100644 target/classes/top/qianxinyao/model/base/BaseNews.class create mode 100644 target/classes/top/qianxinyao/model/base/BaseNewslogs.class create mode 100644 target/classes/top/qianxinyao/model/base/BaseNewsmodules.class create mode 100644 target/classes/top/qianxinyao/model/base/BaseRecommendations.class create mode 100644 target/classes/top/qianxinyao/model/base/BaseUsers.class create mode 100644 target/classes/top/qianxinyao/performance/Judge.class create mode 100644 test_data.sql diff --git a/.classpath b/.classpath index 7144ddb..be86bf9 100644 --- a/.classpath +++ b/.classpath @@ -1,23 +1,20 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/.project b/.project index 5b5a27b..78e6160 100644 --- a/.project +++ b/.project @@ -10,8 +10,14 @@ + + org.eclipse.m2e.core.maven2Builder + + + + org.eclipse.m2e.core.maven2Nature org.eclipse.jdt.core.javanature diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index 6a1838d..a6d91f3 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -1,2 +1,2 @@ eclipse.preferences.version=1 -encoding//src/log4j.properties=UTF-8 +encoding//res/log4j.properties=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 3a21537..672496e 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -8,4 +8,5 @@ org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/README.md b/README.md index 3d3dad6..7785257 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,200 @@ -# 个性化新闻推荐系统 NewsRecommendSystem +[toc] + +# 个性化新闻推荐系统--TomRecommenderSystem + +## 说明 + +本推荐系统需要基于【新闻模块】使用,此处对于【新闻模块】的定义是:**有规律地进行新闻采集,并通过公共平台对用户进行新闻展示与推送的应用。** + +本推荐系统使用的推荐算法包括协同过滤(Collaborative Filtering)、基于内容相似度的推荐(Content-based Recommendation)与热点新闻推荐(Hot News Recommendation): + +- 协同过滤的实现依托于Mahout的提供库; +- 基于内容的相似度推荐在原始算法上基于相关论文做了自主的改进; +- 热点新闻推荐顾名思义是取最近被最多用户浏览过的新闻进行推荐。 + +**推荐算法的具体细节可参考文件[推荐系统介绍.pdf]** + +**主要使用的库(Lib): ** + +- [Ansj](https://github.com/NLPchina/ansj_seg):基于内容的推荐部分用以分词,以及其内含的TFIDF算法。 +- [Quartz](http://www.quartz-scheduler.org/):推荐系统定时运行的设定。 +- [Mahout](http://mahout.apache.org/):使用内置的协同过滤算法。 +- [Jfinal](http://www.jfinal.com/):使用内置的ActiveRecord与Db工具,对推荐系统中的数据库表做了实体类映射,以简化数据库相关操作。 + + +## 使用 + +### 预备工作 + +#### 数据库配合 + +**本推荐系统目前只支持与MYSQL数据库进行交互** + +本系统需要与五个表进行交互:用户表(users),新闻表(news),新闻模块表(newsmodules),浏览记录表(newslogs),推荐结果表(Recommendations)。 + +- 用户表users + +存储用户基本信息的表。要求至少拥有两个字段:用户id(id:bigint),用户喜好关键词列表(pref_list:json),用户最近登录时间(latest_log_time:timestamp)。 + +|字段名|类型|非空|主键|外键|自增|默认值| +|--|--|--|--|--|--|--| +|id|bigint|yes|yes||yes|| +|pref_list|text|yes||||{}| +|latest_log_time|timestamp|yes||||| + +- 新闻表news + +存储新闻基本信息的表。要求至少拥有三个字段:新闻id(id:bigint),新闻文本内容(content:text),所属模块(module_id)。 + +|字段名|类型|非空|主键|外键|自增|默认值| +|--|--|--|--|--|--|--| +|id|bigint|yes|yes||yes|| +|title|text|yes||||| +|content|text|yes||||| +|module_id|int|yes||yes||| + + +- 新闻模块表newsmodules + +存储新闻模块信息的表。要求至少拥有两个字段:模块id(id:int),模块名称(name:text),抓取时间/新闻日期(news_time:timestamp)。 + +|字段名|类型|非空|主键|外键|自增|默认值| +|--|--|--|--|--|--|--| +|id|int|yes|yes||yes|| +|name|text|yes||||| +|news_time|timestamp|yes||||| + + +- 浏览记录表newslogs + +存储用户浏览新闻记录的表。要求至少拥有三个字段:记录id(id:bigint),用户id(user_id:bigint),新闻id(news_id:bigint),浏览时间(view_time:timestamp),用户对新闻的偏好程度(prefer_degree[0:仅仅浏览,1:评论,2:收藏])。 + +|字段名|类型|非空|主键|外键|自增|默认值| +|--|--|--|--|--|--|--| +|id|bigint|yes|yes||yes|| +|user_id|bigint|yes||yes||| +|news_id|bigint|yes||yes||| +|view_time|timestamp|yes||||| +|prefer_degree|int|yes||||| + + + +- 推荐结果表Recommendations + +存储推荐系统为用户生成的推荐结果及用户反馈的表。要求至少拥有五个字段:推荐结果id(id:bigint),用户id(user_id:bigint),新闻id(news_id:bigint),推荐结果生成时间戳(derive_time:timestamp),用户反馈(feedback:bit[0:用户未浏览,1:用户进行了浏览]),结果生成的对应推荐算法(derive_algorithm:int[0:协同过滤,1:基于内容的推荐,2:热点新闻推荐]) + +|字段名|类型|非空|主键|外键|自增|默认值| +|--|--|--|--|--|--|--| +|id|bigint|yes|yes||yes|| +|user_id|bigint|yes||yes||| +|news_id|bigint|yes||yes||| +|derive_time|timestamp|yes||||| +|feedback|bit|||||0| +|derive_algorithm|int|yes||||| + + + +#### 数据库配置 + +在项目根目录下的res目录下,修改dbconfig.properties文件中有关数据库的配置: + +``` +url = jdbc:mysql://[数据库ip]/[数据库名]?useUnicode=true&characterEncoding=utf8 +user = [登录用户名] +password = [登录密码] +``` + +**注意,数据库的编码设置应为UTF8。** + +### 系统启动-Quick Start + +四个步骤: + +1.在com.qianxinyao.TomNewsRecommender包下,找到类Main; +2.选择推荐算法。设置boolean类型的enableCB,enableCF,enableHR变量,分别代表推荐过程中是否启用协同过滤推荐算法、基于内容的推荐算法、基于热点新闻的推荐算法。若均设为true,表示三种算法均工作,一起为用户生成推荐结果; +3.选择推荐对象。推荐对象分为三种:全体用户,活跃用户(最近一段时间有登录行为)与自定义用户(自己指定的用户),若选择自定义用户,需要构建包含目标用户id(long)的List; +4.选择系统运行方式。运行方式分为两种:一次运行和定时运行。一次运行即只为用户进行一次推荐生成,生成结束后则系统停止,若要再生成推荐,需要重新启动系统。而定时运行则可以定时为用户生成推荐结果,若不强制停止系统,则系统会一直运行下去。(定时运行时间在paraConfig.properties文件中设定) + +以下是示例代码: + +``` +package com.qianxinyao.TomNewsRecommender; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + +/** + * @author qianxinyao + * @email tomqianmaple@gmail.com + * @github https://github.com/bluemapleman + * @date 2016年10月20日 + * 推荐系统入口类,在此启动推荐系统。 + */ +public class Main +{ + + public static final Logger logger = Logger.getLogger(Main.class); + + /** + * 推荐系统运行入口 + * @param args + */ + public static void main(String[] args) + { + //选择要在推荐系统中运行的推荐算法 + boolean enableCF=true,enableCB=false,enableHR=false; + + List userList=new ArrayList(); + userList.add(1l); + userList.add(2l); + userList.add(3l); + + //为指定用户执行一次推荐 + new JobSetter(enableCF,enableCB,enableHR).executeInstantJobForCertainUsers(userList); + //定时执行推荐 +// new JobSetter(enableCF,enableCB,enableHR).executeQuartzJob(forActiveUsers); + } +} +``` + +### 日常使用 + +系统运行的各类参数都可以在根目录下src/main/res目录下的paraConfig.properties文件中进行配置。默认配置是推荐配置。 + +若要保持系统的日常运行,还需要【新闻模块】每天抓取一定量的新闻并入库。 + + +## 测试数据 + +在Mysql数据库中运行data.sql中的sql语句,可生成数据库结构与测试数据。 + +测试数据中包含以下几个部分: + +- users表:7个测试用户 +- news表:307个2017-12-12日从网易首页抓取的测试新闻 +- newsmodules表:17个测试模块 +- newslogs:测试推荐算法效果用的9条浏览记录 + + +按照上一节中提供的示例代码运行的话: + +- 若对测试数据进行一次协同过滤,将生成0条推荐。 +- 若对测试数据进行一次基于内容的推荐,将为用户1(id=1)推荐85,87,89,104这四条新闻(有重复标题的新闻,新闻标题中的“合同”关键词匹配上了用户的喜好关键词),为用户2推荐89新闻(重复标题的新闻),推荐用户3推荐87,85,100这三条新闻(新闻标题中的“合同”关键词匹配上了用户的喜好关键词)。 +- 若对测试数据进行一次基于热点新闻的推荐,将为每个用户生成20条推荐结果。 + + +## 额外说明 + +1.com.qianxinyao.TomNewsRecommender下的NewsScraper类是抓取网易的测试新闻时用的类,大家也可以用这个类继续采集新闻。该类默认对网易新闻首页的所有新闻进行一次抓取入库。 + +2. 协同过滤的效果目前不太稳定/可控,因为采用的是Mahout内置的协同过滤工具。一般来说,新闻模块的活跃用户越多,则协同过滤效果越好,也越明显。若有需求,我会在后期自己实现能稳定生成指定数量的推荐结果的协同过滤算法。 + +3. 一般当协同过滤与基于内容的推荐算法生成的推荐数目不足时,可以用基于热点新闻的推荐进行数量补充。 -推荐算法包括协同过滤、基于内容相似度的推荐,热点新闻推荐。 -A recommend system involved **collaborative filtering**,**content-based recommendation** and **hot news recommendation**, -***Lib: [Ansj](https://github.com/NLPchina/ansj_seg), [Quartz](http://www.quartz-scheduler.org/), [Mahout](http://mahout.apache.org/)*** -**系统相关细节可参考[推荐系统介绍.pdf]** diff --git a/RecommandSystem.iml b/RecommandSystem.iml deleted file mode 100644 index 1f89d77..0000000 --- a/RecommandSystem.iml +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/bin/log4j.properties b/bin/log4j.properties deleted file mode 100644 index 505cb5d..0000000 --- a/bin/log4j.properties +++ /dev/null @@ -1,24 +0,0 @@ -###设置### -log4j.rootLogger = stdout,D,E - -### 输出信息到控制台### -log4j.appender.stdout = org.apache.log4j.ConsoleAppender -log4j.appender.stdout.Target = System.out -log4j.appender.stdout.layout = org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n - -###输出DEBUG级别日志到/Users/hanbo/Desktop/debug.log ### -log4j.appender.D = org.apache.log4j.DailyRollingFileAppender -log4j.appender.D.File = /Users/hanbo/Desktop/debug.log -log4j.appender.D.Append = true -log4j.appender.D.Threshold = DEBUG -log4j.appender.D.layout = org.apache.log4j.PatternLayout -log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n - -###输出ERROR级别日志到/Users/hanbo/Desktop/error.log### -log4j.appender.E = org.apache.log4j.DailyRollingFileAppender -log4j.appender.E.File =/Users/hanbo/Desktop/error.log -log4j.appender.E.Append = true -log4j.appender.E.Threshold = ERROR -log4j.appender.E.layout = org.apache.log4j.PatternLayout -log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n \ No newline at end of file diff --git a/bin/top/qianxinyao/UserBasedCollaborativeRecommender/MahoutUserBasedCollaborativeRecommender.class b/bin/top/qianxinyao/UserBasedCollaborativeRecommender/MahoutUserBasedCollaborativeRecommender.class index efe137c7fa542978f39e11f343cfd9dd9eff6e1d..a1d62b4cefa7f8db0f51589e019cddb1ce20a833 100644 GIT binary patch literal 3025 zcmeHJOH&g;5blYQJd6fGd_NXn1f|HulTcJi04vrK(F97pO*YMDaCauoPAKvty!dCV z(ki|C5BwosEqga4p&+`UJaFN#voo__f73JD{Z0S){pA|~Jb}k4NHBO~RIB(waJeUB zhpXadfO?q+*eEH_<8`IE5xe*r9p(Ed8>oxxys6qI7MFq~gYg}{%ZnbDZt-P(2OX1w zF$Qyo*5sb6v@lISDE1e6)|+E6<|)@j%^+>tQE!1kMo5CL@J_&hmFcMvZc#{KmKdBV z%x*DAmQ({%FwP)9@M2YKrPDCMl0P@4#z1+y*sy4GE#c8lm9$z~)jjlsr&cyoYoaCm zmeR&j+MVYu?$C_GrBueMqtzogMV{O#bwgsvPqB=$xMeym%x3-y%4RlHU|fyWSN5_} z9&)*%ar?!}a%qJdzD^$rTcwlgK&%stCEk}i8q!>Le zC<}SGl!F{hF_wjkieugu5-V-Lj=IK4?-)$j%HiG?g-kf!pG=yjAccKr zA5!f8Isfl15lXr4T`mkJ_uXw9;T3HWn8?{oRk)Iywk9`c4kH$iZg7dL(r||*evP2< z@d*_Z5~ulpn*RrCfrHt4GWpLSOBWF-73DW2FI7Y3G~8n_{qJm`f`=@F1D44`In;`5 zRkgK)Ya*11xe?31`A~LJFiT}w_wr?sTkl?EHM;ZymqPfA0CiLJ%)h~!x%mdVMxHkXdg51h~DA(6#f8= CG{4jU literal 6277 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 OfQPx)BX~?QNBs>y(QttP literal 2346 zcmb_dTUQ%Z7~Kbw91;d;X=xd0X}Qz}3dB}>BNUYYS_o7L1<_hNgku;8Ght@Z1^ywQ z`vMDD%OBv6QumpJFadmV`7(1Z-(`RMyPQA&`uz_8pTn1E5m*S^N@mZtoPFClu-wdR zUwPA(uQqdTxomB?o)y^d)v_wOySvKSR9E|rwGTy-4fNyG%M zY+LWGOxbcunO7Uzsu&0)CT+(KrUY8k!>ah6Z}R;-P( z66ngiMXS7OdA8oy4`acW?F%gC|3}DK!U-&YN8nyMA0n>?b~%%`{UBT0hmjNl&vr^# zjXpKIUsRRAb{!JfC2-sIN~fF@id$;4T2@{|Mj%FZ$#z1sDWF!Ent*X(6|!lNe|~QQ_4!* zX^u98Fz;^6sKBzzF9|4xJ|rau1YZ329MPh-Gi2Z%J`rg5RluWM+47nE>vaahtb}Jw zibPuAY6LXp7t}!;Mp%2fIqn{&a37<(+{OgDqc$3u)jl%@KE*>S(I*WE+(<{csF|fh zE&G|l9(pX$LHc+xV+GctRS__o`8&JHw&AHjyvhdiQ+N&%IzceauR|410MoOcx z415=kjtUzyCM8Gx5+rTQ;bWPP8mDv%PY{H=v78Z0in)>>j zJ7qZ>63ms#YKQ9ve$Zgze!$Vl5m-yb*(4#Q#U_6AggXnWUV~IT#pTtznGF|3(TJmd z&FPhFsIXcum8DR}_GwT$(E@j(f?-iKqSgY`=+t=YLDzIfF6jJQA?cY~RQv3O-l)#G z1PcgG#O??Ujoi`zLy0~B2bI%DVCWpTmrhVd9F_zdGJHEE9HyXoyh{*ZgRJah`SiVIA`_* zM{N#iYCXUT#;7}vcjQIk5%%yH`*;%4@CHd8Se*vFdP-SM(*fS#CsNQx`M3BvB*&%= ziwI2qH&7(wIojEz)damr{DKm{?|8lio2zZwsS&O1?$BYx15PeS4Zn6YY0xd0HHJrkwd*MX+kcd(N3Lw!BiKBNjN?dL1)ayhEzkq*) z1QOi&QHa?Mq>;!0gnIFMyl>{cc^-fN@%bx&hqxc0B=E%BQFNx2nQAjrHagD8Jy#j^ z+BQv9Y@PCYLhmTC!y%a-x#(=Hoc|ED4_?_gKt*8VR83TrD$|eN#;25cf%V7QX#Z58 z+bTzK0WPgDO78J%fDqoU_O zJ6d81QN`st)^J5&v(-KK^3XeN`un-pjjlHIW;~3^9Vxa?pxL#FN>7y2dHn0J;s-ht zc-H-|``;G`sA!vcwp-m5E)=4|MT1#@8!UbqxcFDaj=;yi7>4ES3o~0FJhWq%(1Fff z42yx^%ROiPFHK@irZZ2*ztH5AO9rz5cX{GjTmUI>ZG}pK`fHtKd{;+2H5u-K6Zka( zCEl%Jo!6jvon_tu;TKfjH^Wb;e=9HzUULk15H@(N&r!IFCP&PP>s)D*_Z5z|7PU%z gGOxA0qSnreT4mhioDy!~Hh;lNbIvmEU>93I0mXPY$N&HU literal 1168 zcmbtUT~8B16g{^sENmB1C z#%F(&@$POxDIv!Au=8>6nRD;lduD(9{PGRJ13a~mB0Mv?;qEKpx0HV0x zBSWJ+x1yS?kVV3Wf9~Lh*wLZ+t3+)qAR7&?gJs+$^aiK;B@DK+KFcL;Zbk(4W$tN5 z#V-hf)t=n&_i@7Td7U0MPPIDQfnE8dI-4d?e!aBHO0+k17}VstibQY64{Ir^7pB0q z=C6w%Y>H=oCp`A@&gGeS?wUV_{W*3!Ja)&%A@uRuNdUNle%^87xW*&{yw31$Fs5m- zCC!%n!U={5Cm7>bH+6)W?K%Z ehx;5O$0w%wPm{t!J`?4WSRTcfdCayHp8NuI#54f_ diff --git a/bin/top/qianxinyao/algorithms/JsonKit.class b/bin/top/qianxinyao/algorithms/JsonKit.class index f69612823a661e71ba4e36f8a5f0b31ce8f95047..d5263ea87eb8baa5f8f35ca7a69af4bcd8e0fd38 100644 GIT binary patch literal 1605 zcmc&!O-~d-5Uqxl{SXCKQ1NpRNmvfd#e;E?3u0Vdl(-9t7n9zZVriV|9(#JoqQA-$ zi6(OQM;WVUmtmqSh%xcfJzZ0;s`|a^`u6?vR{(eb3q=@VFlSWcz875fggoHNnT1+|P8vRg00 z6eT?|uWPMz39c~cZAp!>3ii==JQYSF;6^CvL|RcDVf@Icl>4{Z;8BFy@wk-AI308{ zoKX&U%t3_bajn24%vd_EGMHKXwPed%wToseM!li@B*2E>Lb~AmFy}r#F(PouiP$K& zL|1Z?XyW$a*@%@~0S#%ei@LsAFTpLwO8<+Ya+@f9jXS7OdUyu$wjnpUj&Z%`VU$XE zx>6QkC8hTGLkM*`>Cx9>Q{xVy87vRswlV0yR1WI&cj!Ok@hiys=pTm5 z-|M*F{<5-ss8cAiBvo1}(H=e(cH)c=X4tYF3or*XtZ4QDy+~$<6s<)%xwJEDT{?u) zC;AwH3a$1xz${#(b-eFD`z1P+;WA8+#e$axAuC^C@=djR2-8Po%|}>BBaEcDYjBx$KM=+f1JbLhC3PlZict9e~*8g!#hO6asGQ5{`CAGGdvBZwDS8u09Z=H AOaK4? literal 4047 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 literal 1937 zcma)6ZBrXn6n-ugHd(f`4N#!UTT9DZ!$PID3REo?jHFPcqWHcfw_)kB8#kLy`BrD_ z=oj^i!}vDpj5_#12Wg$aNa+vocQj1=)PLZ3?%f3frDHRb-Mi=YInO!w{Qd7=_W|_5 zR8Ydu>N#osL({Ntn)ZU>=!TVYT+^GK&*)cNCq2TwQPWd!fZ_0*al_Cp!%perGjlxQ zF_c?QD#cxf`ncn!bR%sfX1PwnzBxTERs9TVdOHro(YTC~^-N2~=dNe+3|WN+5|(M3 z-UWuz_Kqor14B-dt2l^53Mv_DACo}CVH{xyr?}^5WH{aKCy`KxEF+WY?|3Y}Fc_*d zl%ZTf4MX*Q@KjWzRzn?BDtSPn6mG{fC<61v{YJ-kra*aiDIZJE^g9uO*_@!F{R)HQ6#aOjy`N!JZ7h} z9_hI;ui)gCQc~i3UCf$RlDi?a5&78+ce|6OtD*y43OaXndvYP;@p%oW5oM?#q60h& zRL6d3ir5bTs?gD^pl5ej30}h)Jj0;eFsv*ezqTi&KWNmxo!Q$C*^0BGCoLhIV<^*I zp3zmb;yDe^gP1Ef(rIod8KO^wF`%PAgh48@TgRSk}FiaGd*YjU2=2yPoytTBs_{oFyTr?WJkpFq5 z@aHcN?|l?)&VT+x{@WiP-uuSa7FL(@_dovU%dZQ|%bTAr7H-}4sUDQ)Hw924t^ zPGPZM=v_w7FjUf4(APP#5WlJjTZ48Nk#$s0uj1%k)US}Z1W(aZl}0t>Sc|8n6y#1D zEC{00n~}V%a}^CcZsk%~C0#V%0F7uO!!Vj9LV;j|&%(#Q-LV2T?>L z)ekg~tdX=$=p_ULIDtW&r0dltQ8r7?hB1k&WZO#xzm6$FJ}6Ib(CJN*SD-YlV0=`; zgrIVoLi%K$q2z*x5S2oZ-}-~jK7&3LT}4!c@U~16#yfa7@IN2;R|fuTcrS;PY|U~VhJFGg2kelgEG8?djp6|>nJ^3znC;?a zRz+!HsorNT9VNG|97r3nnJE${9<-`LC+_SU!a1js6W>xf+tQkV>Z zzC?0|K>v~|^DvAM7(Q0AthLe+7$xNWw$$8F)*&xbG^ZvkW`vTord846w)2F>qFYr? zgSkdWtO&jAx)C*Yh_b|XjdL}fh%bIKG%+WsJmbb z$H9F*pn3XV6&r(LI3I^Nj1w47n(;cBruv&C1&j~E!=T) zvfosNLm-pu%EaHwa7@E!`x+1!Yf7pcVWo1yF`l4kK~y9&b&XP{yAcZ~jmY4x2wW%d zt%uy~Eylf}{&gncoy82xGgGSWFsqL4SWEQi{<>q7Esl8k8FQ+6R!jSC>u_|Iz?(m1 z3kX6-ShA{)X_L-$pSh50x)qm_*$CVsApdW~2%Od2R)_or*J{;p8*{xg!CXhVSK@Kk zWRLc`X_zE1^=qTBLZS`_t0Nw_*l0$Ub{&~cc0|n8MZoHU^s4G-q8@h_m-vcs zOTy$SPu84UQo?YbK)4y)Fg(OJ#jnK#;(5QsZD9#?U<&Y+!EXTD%MgYLzMK;fg_zf$ z@%jN=kHZkQXT5jT#RJ4X!SL?rxeqY*1xF#cfbF2SG71;*KklR867mB6PrwyKO?ud? zZKe>8eWq&xOql?t5KvUzV!F|0>T5II3}8A6WV#J^+Dy}JrejTs0H(JAOi`GDyKSaf fk7>s9YsoL!hR6PDR}S$jtqp} literal 8005 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 E3E_KZSpWb4 literal 2310 zcmbtVTUQ%Z7~Kbw91;d;X=xd0X}Qz}q(rQimLRnR(6%Yn20?7C9fo5V2s2@3;sXDW z&wYV~tmO~zN2&WvLYM$PxO|y8m+!K_{awzVfBpUkfX@&}vlZ6mvD|X* z<@%PgLxI$c<2vE2Kznv{MIce|HdF@fNE=8ZCD2`TT(wl&Sy%qDwO&yIJw?y9Dl3-n z=zZfb5pFtxz?0(tgqbIV&xESnFk3l0y~=lBN+4Malpkd92qbZuU|L}}%ov!#7wn5_jcxMq0=%(WsdrO; z^!$;;V}WeUL6jwyuWrpC7wgk{!e)`~z?{GbEj>)`W-)JIL31a`%#yXEB)(#(G1J=E z!d}%^LBMv%U=ib5@0o$;C^9?LYZVa~Xd$=tHX?Zm-$=X^xNx`Y#`L{ySbJSLQ?1lcg&Y1)Y2u{J?7!A$b z(f~t=5BmM;$*>gi>Pg^CFL^cJR*Q~)Z~9s~ zq5hgpXge4L+mml3(8d*?D}E(+IsOIz$+1IpypOIk{OW7qIy(6^>H_?CaYtb2rm0I@ zC%C(eD_phVsx~KfdDg-G{xN#j4sm_y-Vyo)rW3~);Qsb>(oFUY9$?r^9^>v>&*&jO zKEQ;TJiw00emR{oQ$0@(P&mfo+V~;9o|b0Hlm~eF8!}vT^}}ihL0Yx15PeS4Zn6YY0xd0{hEuq7h2TUH2cjTA3mh6MarADi#8uYb+D?`53;0J! zAi|pb}P8{D!A&n VNij9t!fpD3lomPbxPyDx`3-($FQ5Pb literal 1116 zcmb7ETTc@~6#h*Vpd=9^-|97-3s`P5Vp5B6Vs6$1&vtyA$y*mdF7?6;Lu>1YEf!no(xdRRshQoG7k zdXEs#7fuL?1FtGg#F4gOV1zJHR<3;0Zd9cIUR3ImFj@8-Q9lvB3ie%NLVr{(!cO_W zlPwVp*^y3LGxtiqd_BR#(4#!}Ah>l$mx3hC!;T}HnyoDZ8A9%cGksVZ)0i=Ehp=!1 zv`cSc7Iz6&O=_;rOR0sb6K3*-fwUq|DUEwrFfdQZT<4Aa78a2sjCI+B7Du8s5z zT%{2#6O!$g^jjuYv1Z^tAv-`FVJ$pBp1a1}gtdHmu-m1=u*twWD={Ebvl1^I*(lbRob$-Yw^M zHgXAio6%Y6C|PfL!nOBbRocq`ST;%*j2XumG8)q%Gv>IrTG-7eXqr)6HeK<=L_HbO zscaM>zJ#2lqwR)Zbf);Q{GgDacNtx*sYbfd_MSTFLsTlAbL}HzAYR%oSMKcq_yLrZ zTTeHYr|YgTn#W3Grm_%sN&!izzNp5SryD5cbRaHku0=yg4e9ubEp2^=(OV0Pdr)3e z`yx))5PMMAyz44AK?^MQ`>up<Q{z%9ZB>PJY~YP(2IY#3pwmsA@rIwHq4FRPYY zi^?@@?lhQE=ho3KS*0AoWeFX&nai#juSHy$Ga!fmY@pbN^HDsG3^=jO;o=RWl%jdM zK0$NzDTZR9e?gc&pDfr?Y_%Fy;Z`_W*K871W(JMK%S=qAn+9W6>z22_$hqtCk*uKW2NTlgZv!lrK_=Hr&=%b{_PLb$I+z}X?( z*Yr)Kzi%VrY=>~mv=WK?E&}&c2zQshkHoD;;C|`hQnW@nR6UOx#c18XnOEz2F9QEt V4+v z!ZN!uY27yBqnXw=Y>En|X+ljxC=wjyJ~d+5wlcD@A%JoTvYE2=PH~MXKAzUbW|C*{ zl4im&lDdQm&F#_kkpN~(sEAp~+GJmPTcWmy(AC!4#&)4VZdn&?y=Maj=a7k*)TXSo z(`D;|GsjdSpe8vB1t~tjiAG7vVg|y@~7giPU zDGpfqsD!F2i!%ErZ~ei##1mS6DxH z1hEpUWYjT&ZY~QI%!`JdF+C;9M?t-~>Xa0-+hOQpy{)z;tV;Z!QSjO?BYbpOo3)gO zp28dF123V{f8qSOd*3Dn^DtlB_wF*RMT?Ae5~k;UE1;ubJvPv@n5{FR@=63Ajg3A$ z^Ax%@g>J0XcjS+Rg^fZ{ql`^ViGLT!ywE1iVPmj^XhXZmg!@DQeMsc>MN&qBZO3)Q&!xZwH53yz z3Ag$yEZa0$Vy=v@kA`Jz8`WO3jZt`*R^TAR9+cLdjW!Kd_%(VBw5lzD9jqqJl_4rpRAzLTZnK=wz;yB>MSdvYi0`@`I`E=RU*#K?2ANf zJ!9$XiAk;7$~bDQQ+2eoqpKn<)TCf_vqk;SDjBZFB{cs}bq28yUlx_|qy#M+;<3Fa zJRXMs?nFEq6$G!jkGPEiYvuKUHC_e5d0N8q>i}oGjsTuzGKy^ONEp3(I)HW< zhqy4s;xM~|M?4~7vaQFM+MFgj#8Vx_0UQ-*enmq1|BUAN7zlhzqehphIT@QRKYXob z@)6Tq##gQJUS&@Z7}v%Pc8zc1H5uO;-G%yCA4vtTVkUroK2a)%sO*^9X>hFa0dW$83NGMHwn;6O z(oGI~HP>pB;~ey`2n$me6Ny3J@(#Ee@#uzis4tzjGRCD{>6uD<_+(EdHAK{?_WHUrH%}o9=`nO-wwVwa{Bbu zeTPQ&?9HCPH~7@>>xYMrzADDZUnuw`e#P?AZQJ5VJL<*BdBhjzH%zXP6MIK4T^eh8 zzKq{WnBz~&wU)Em%9!!|kR;=Gxfw+uwk}WLn3NJPM&V&Cyv!yBtd zYvp+`JN$_vq5i^9EWA zeEaF#SNQgo+|TswXK{anZ+|20aCW7wQZduH-vQi=1@z!!+|}?~{FR2JLELfx^}zZZ?3_1#n_tS>l=HCJ%sAR^O>|30nw9~aPEOdr-1 zd{~q9VFqUBeYly30GsK<7AWXoxVB&h?k9&v=wk%CGw;g{V|}^L^Cg=1Ikwt`~S~yY!5$_xrb9p(Sho?!DaZ0R&MQVzU*o?X3I#Ee# z5qDeM*w6Odkz8n|qUZw(NHQ5D(=Y3^2BP@Gxb>kIF~zMY`~)yOX?= zy*w$!m++Y9T-d!jFntL7+L=6|U}#ckYN&DmPYBc51fEP6KxJiAHih50Bre5M*zYM? z?gkU67{UQp(KDgvLeGa@2)#Ifm&U5vM^%qA@AldBUiod>Q7wd0+;3AOMX#?X~M};^Unr8SjcN_-E3J@Rxr9CZFyw diff --git a/bin/top/qianxinyao/hotrecommend/quartz/HRCronTriggerRunner.class b/bin/top/qianxinyao/hotrecommend/quartz/HRCronTriggerRunner.class index f57443fa1e7791437b601a3012f27b740c5612ca..5d26fdcc3beb061e21da2969b5c89908049972ac 100644 GIT binary patch literal 1205 zcmb_cO>fgc5Ph4bbz=f)1EDRS=73Z<;7f&oRK1i`d<2l1P>JKlSvlJ}yY6~jCHyN+ zl|X_!KMFB+LmH8a1jJ=$#xwKgd3I*M|M>hBz!vU0C@?&>I`)qxR|BbrT>Cw3jR(7Hv-^3{RT>#;#74El-XZ z?r%18lBt!E-;{~1pV>L-mNim^^^B<77z84=Qme#4l~}ccp6I5LFk=TpsU<_jZEA@2 z)8B!&r-64aEau=k_2ImA4P&%f#yTrh-YX*#9i51-M^_Nbh-Zwv*l21^KY8Z4rDj-b0ZMDZeJB-Cd!X6K-Hp5xrwmU8{XU4Bi%|L#oJI{sXGJ4sMqyHQGTFm;b zi24#&1ouE2O0NJ=AdNPYPKPX?BqO=_@D$6Ra<@xo<_6YqiO%v_0LjZ_Fu8;+K1}eDK@_4-gC^22~2l{S-`D4>Nf6>%u#;=FBf1a literal 2283 zcmbVNTUQ%Z7~KbwoFoj=rln=1rR7o^kP>SZXo9E>AZ^oB34+*KI}BqONM^!h;sXDW z&wYVKS<4^bk5c!UgfIbI%jL_=xqO%X?eB8_{OkQ606s%qqDx@fcWaqF+i>=6=fH3? z+ph0frdzFA&Q@lxVR-&;ndOzd=Q^vNT`pVRO2ct1Pa-04Wyko{$W#ocoO!vqW0}4{ zY|eIUe_o(FJ-#Lo$-7%t65U8>h$1G?SFjzc*r;w=-m0-#u>?{D*EA|?hG(mN>oDSP z+jW82!v8~;qi5f!?+V;Y7XpwC->zf|cHPf4_W|gV@7Yc{r+_9G_f4zj+pa@eQUbSK zuY4MQ$=tTK8WqcH%LpV&cG)rfhQ|mVpZ76$(Z~FyekE=QjD}p<)mkM}^0(S9mkiT) zy@MqBk?4VrL5U9q216?6MK#>QZ2_%p`Ryx#f%JIcGNqivoz7?j2+!Qj1bY{<(D!#{?^C zd4;=&N!-VzDxwDh{b3vJBr2a74WHm4mFSZO1a73mVK>dvp^|;1u?apG=p|FUSTKC! zg;5jGJE=Om%Ed7w5N*^gub#wXkh?6wbi!_#(J+TE*afu)n_~77yrB|l_D*j6;*rFc zBt7IHNDix3HDWyz>dI!G=8=fwiNFUP9ZT-!v7lj5aVN=4(WqJy-!RmWX=QA2zvfx> zI=di=B}^*4XBwWP!0b@3Q$%2>gWS&BfaD^+m3S#|?QBrAdq~4~!9b|72mO+7n7gZ< zVOl*X;d_ZyR!Rt5yOK4mVO`Z!t0$Qqfw>MGDq%tG=EA9OO|MgygL%MQSvlo!L&J{> zOtkKE;Bl}uQ*kylNU7PukD6O&LA7d-il?}|R^zg_!YJBtw5~a*5^WV$>!q?3>fJdF zN+nw0PFOG~igwgWfEs-YZ!74g&cp?se=8(4K22+%y)YQoIhSAo!Qs~*qM@Bz8ek~l zv3^iH9qnW1xV>~(GUA{l*pR`CAmK0tos(RG07FkuGYK5!CAZ<3){?DWmw}E>Xue%j z$_|FX_T)ndbaBPUiC@WGhJV3-bm9o{cfoa%Uv&-KL=V4OQ-J?o?g$KhG2seuljxivRjhtYJ`@7kw9!(7&VpNZw;QmHx{0JW(VoHx5 z;?vYLm$U09n5X1d*_a+neSL`h36?e{kFcDTdQ6vxc=|h%Tyyn8kLXc7c8ry7tm~0u z{2=g-ke=Zc-k?Y*DwHPy)LVo##MKCc8s^I~in|!Y6lZppqc)E;wI;F3lUL;AE$6C* zN7%zO_AwLC@EQpfSc?X=nxU+s=>V_s6Df#O{tbQ($gyd|AOfBLO_*dnPg`5G8lxA9 zUr^@vEzh@MbG1V|O`?_EUD~biWCUG*)1;IT5>*LTLYF8>3`q_vo)uN1_9)o}?;lGY BWYz!x diff --git a/bin/top/qianxinyao/hotrecommend/quartz/HRJob.class b/bin/top/qianxinyao/hotrecommend/quartz/HRJob.class index 7c20160017cb40043e6b09cb1ea36250a66205e0..a8fa9e7b14a363abaeea6fcef31978603fa8aff3 100644 GIT binary patch literal 1050 zcmcIjO>fgc5Ph4Zbz%Z3frj$gg_Ge>UpP_3r3xy@fJ8$jj%#O?Y-R7d>rIvL3;0J! zAi!e)Hzd?Cj59U%vx*ibozA41qIwc&db+E4>gVoEm3kVzNx? zadO-@i7ohZe)ui8vEsD)c0L7oW()F>F3pTDcbt&EWAdL+ikdrH2kf?;Ja{ z*4Q?#Fcy5!Ru(2blVeU*a+M0FjOMvDaVoRo8TUJ*spKlljdk4E$=*@~PlVRS@mTV| z1eb%PR%>c;XSm>QkxRcrh~Zo&vr_nh(N50Ye`E~jiOj2>|Lth4ijOv~cCmqL4BJ6; zKFcF#m7eUEv+hMo%eS*EmUbj)d<^}_BqBW)R+aIe!g5gPY(W~BP@MP5?QSJm$ zO~X}vf7MIj;TGv!2d@6Lahu`u1@3)4`_ksh;2)WpP2@{e4$QB1d#@ZX>3^jYqYG6y zsokNHR@h{^@bG|^o5XqG3^!_2GIZalqM&OT(Sj6s2uh$g1~kaqz$RI*dUH+k0RJ1> zAN&3nbbnNs9@!F8+AXr(B?{Nkr-*9eCNXW3-=b)+;%d;zl53}iYf!`0#2w0M;4bdb P7o-%lXHDG4E(X5==KLsX literal 742 zcma)4%TC)s6g`tTaqGANlJW?B@hpKw&4OL3ZX&9vvQmjg>?h7N401flWDJ47>Z+6l zAJC7gxMN5wkSHuX_jP>kopa~+pUW!%d)RW3W2hT73`UYC6PcWG6&xv}MWhA;k@SL5 z%C$KUS_fZL*M-9{d(2OG5c8xTeC-~K$hasnl$GvJv4mtOew2wcpBVD>?L!8qsd~ag z9wi?xo-xdXG7;@`&=tDFyRl%Xgev0kA=lEzw@Jqw$uYxD_|zF246c}nC^ba6UJvii zwVzd_N}4J$VqzM0HgA6tiJ_tF*u_hRl?VR$3-hpmB^Qe{*Z;<9DRVH@QD`4EEHljY zh3Tjv)!O289Llkwo7cC)Ox4uLIIy`!39s?i#T!!gZpFttD_;5iX>oF}ziEk>^k@zg_KD=z_A8dQ9f)+_%fu2o{EUl2v=M)8G8QH?l zPk2AFvQK9*OIGoMeE$Z3GG-{E7lb(?sgUnbRLy8w + 4.0.0 + top.tomqian + recommender-system + 0.0.1-SNAPSHOT + + src + + + src + + **/*.java + + + + + + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + + + + + + + com.jfinal + jfinal + 3.0 + + + + + + org.ansj + ansj_seg + 5.0.3 + + + + + com.mchange + c3p0 + 0.9.5.1 + + + + + + com.fasterxml.jackson.core + jackson-core + 2.5.3 + + + + + + log4j + log4j + 1.2.16 + + + + + + mysql + mysql-connector-java + 5.1.40 + + + + + + org.quartz-scheduler + quartz + 2.2.2 + + + + + + org.postgresql + postgresql + 42.1.1 + + + + + + org.apache.mahout + mahout-core + 0.9 + + + + + + org.apache.mahout + mahout-integration + 0.12.2 + + + + + + org.jsoup + jsoup + 1.8.3 + + + c3p0 + c3p0 + 0.9.1.1 + + + + + \ No newline at end of file diff --git a/res/dbconfig.properties b/res/dbconfig.properties index f7689a8..30ff92d 100644 --- a/res/dbconfig.properties +++ b/res/dbconfig.properties @@ -1,5 +1,3 @@ -#url=jdbc:mysql://121.42.36.199/recommand_system -#user= -#password= -#dbname=recommand_system -#ip= +url = jdbc:mysql://121.42.36.199/recommender-system?useUnicode=true&characterEncoding=utf8 +user = root +password = qxysay1+1=2 \ No newline at end of file diff --git a/res/log4j.properties b/res/log4j.properties new file mode 100644 index 0000000..534e8ed --- /dev/null +++ b/res/log4j.properties @@ -0,0 +1,24 @@ +####设置### +#log4j.rootLogger = D,E +# +#### 输出信息到控制台### +#log4j.appender.stdout = org.apache.log4j.ConsoleAppender +#log4j.appender.stdout.Target = logs/info.log +#log4j.appender.stdout.layout = org.apache.log4j.PatternLayout +#log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n +# +####输出DEBUG级别日志到/res/logs ### +#log4j.appender.D = org.apache.log4j.DailyRollingFileAppender +#log4j.appender.D.File = logs/debug.log +#log4j.appender.D.Append = true +#log4j.appender.D.Threshold = DEBUG +#log4j.appender.D.layout = org.apache.log4j.PatternLayout +#log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n +# +####输出ERROR级别日志到/res/logs/error.log### +#log4j.appender.E = org.apache.log4j.DailyRollingFileAppender +#log4j.appender.E.File =logs/error.log +#log4j.appender.E.Append = true +#log4j.appender.E.Threshold = ERROR +#log4j.appender.E.layout = org.apache.log4j.PatternLayout +#log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n \ No newline at end of file diff --git a/res/paraConfig.properties b/res/paraConfig.properties index 28a4671..1e775f7 100644 --- a/res/paraConfig.properties +++ b/res/paraConfig.properties @@ -1,22 +1,28 @@ #---Recommend System Parameter--- -#Recommend Executing Moment(Quartz's CronExpression) + +#Recommendation Executing Moment (Please refer to [Quartz's CronExpression]) startAt=0 0 0 ? * * + + #---Specific Algorithm Parameter--- + #-RecommendKit- #Valid specific day the news published after which are still valuable beforeDays=-30 #Valid specific day after which those who has browsed news can be regarded "active" activeDay=-30 + #-Collaborative Filtering Recommendation- #Recommend Num from CF(Collaborative Filtering) CFRecNum=5 #Valid specific day after which users' browsing history would be calculated CFValidDay=-30 + #-Content-Based Recommendation- #Recommend Num from CB(Content-Based Recommend) CBRecNum=5 @@ -25,5 +31,6 @@ previousDays=-30 #TF-IDF's extracting numbers of keywords from every news TFIDFKeywordsNum=10 + #-Hot Recommendation- diff --git a/src/.DS_Store b/src/.DS_Store index ea1b97fc4cc82ed065748b08c7154f6aca02418d..4de0ded2fb8099a07518498d5d313400c3820f3e 100644 GIT binary patch delta 82 zcmZoMXfc=|#>AjHu~3+iaq??MX+b6i2w((KKrFzp`8%Tk+hzf#`HY*{Iruq%iZ?Sd aeP^D`FQUi^Qj`EvKiPywd2@`&3T6OrBo5~Q delta 322 zcmZoMXfc=|#>B`mu~3YagMono$Pkfb0y01VL^Col2rv{EB<18M0eL5r3MLjVuLnsm zGn6poGZZA1BTMFF7MBwRJOr?gs)!py$AV yA4NYPO*Rl=+04zs%>fLdjfLNtC-aLavVuIXFxgNCJzu~2NHo}wrt0|NsP3otNLFk~|1F;p@nGUQJzRF?!va4{4D1rve7 xNRpdbnVDEOD=;TAZD!}-=KvbDS&;cV^JIPzT~3gu13=6$*@j1YbBxFmW&rFI7G?kd delta 355 zcmZoMXfc=|#>B)qu~2NHo}wrd0|Nsi1A_nqLncEaLtavOaY0hf#*NDvCmV>c)Uz{` zFyu4jG87`q<|hI5oJ=an$t*50Fu2ah#LU9V#?HaX$-&9X5gVM5UmjeNSW;T-lvorE z=4Ga&CPCRD`T03;c4AUkW@>r7fQWN`UP)qRUTP7N@|f_>*+ z89>coo8ko|s;iAHO>`8DOpI!E6spb54RjPtjLm9mIXJ{s4Q)LWax1H userList=forActiveUsers?RecommendKit.getActiveUsers():RecommendKit.getAllUsers(); + + //设定推荐任务每天的执行时间 + String cronExpression=PropGetKit.getString("startAt"); + + try + { + new CFCronTriggerRunner().task(userList,cronExpression); + new CBCronTriggerRunner().task(userList,cronExpression); + new HRCronTriggerRunner().task(userList,cronExpression); + } + catch (SchedulerException e) + { + e.printStackTrace(); + } + logger.info("本次推荐结束!"); + } + + /** + * 执行一次新闻推荐 + * 参数forActiveUsers表示是否只针对活跃用户进行新闻推荐,true为是,false为否。 + * @param forActiveUsers + */ + public void executeInstantJob(boolean forActiveUsers) { + //加载系统配置文件 + PropGetKit.loadProperties("paraConfig"); + + List userList=forActiveUsers?RecommendKit.getActiveUsers():RecommendKit.getAllUsers(); + + List userIDList=new ArrayList(); + + for(Users user:userList) + userIDList.add(user.getId()); + + HotRecommender.formTodayTopHotNewsList(); + new MahoutUserBasedCollaborativeRecommender().recommend(userIDList); + new ContentBasedRecommender().recommend(userIDList); + new HotRecommender().recommend(userIDList); + + logger.info("本次推荐结束!"); + } +} + diff --git a/src/top/qianxinyao/Main/Main.java b/src/top/qianxinyao/Main/Main.java new file mode 100644 index 0000000..b79839a --- /dev/null +++ b/src/top/qianxinyao/Main/Main.java @@ -0,0 +1,42 @@ +/** + * + */ +package top.qianxinyao.Main; + +import java.sql.SQLException; + +import org.apache.log4j.Logger; + +import top.qianxinyao.algorithms.PropGetKit; +import top.qianxinyao.dbconnection.DBKit; + +/** + * @author qianxinyao + * @email tomqianmaple@gmail.com + * @github https://github.com/bluemapleman + * @date 2016年10月20日 + */ +public class Main +{ + + public static final Logger logger = Logger.getLogger(Main.class); + +// static ResultSet rs=null; + + /** + * @param args + * @throws SQLException + */ + public static void main(String[] args) throws SQLException + { + //加载系统配置文件 + PropGetKit.loadProperties("paraConfig"); + + //初始化操作:主要是数据库的连接 + DBKit.initalize(); + + new JobSetter().executeInstantJob(true); + + } +} + diff --git a/src/top/qianxinyao/Main/TestDataProcessor.java b/src/top/qianxinyao/Main/TestDataProcessor.java new file mode 100644 index 0000000..b5195e9 --- /dev/null +++ b/src/top/qianxinyao/Main/TestDataProcessor.java @@ -0,0 +1,108 @@ +package top.qianxinyao.Main; + +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.sql.SQLException; +import java.util.Date; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.log4j.Logger; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import top.qianxinyao.dbconnection.DBKit; +import top.qianxinyao.model.News; +import top.qianxinyao.model.Newsmodules; + +public class TestDataProcessor{ + + public static final Logger logger=Logger.getLogger(TestDataProcessor.class); + + /** + * 从新闻门户抓取一次新闻 + * 目前使用的新闻门户是网易新闻 + * @param args + * @throws IOException + * @throws SQLException + */ + + public static void main(String[] args) throws IOException, SQLException + { + DBKit.initalize(); + + String url="http://www.163.com/"; + Document docu1=Jsoup.connect(url).get(); + Elements lis=docu1.getElementsByTag("li"); + for(Element li: lis) { + if(li.getElementsByTag("a").size()==0) + continue; + else { + Element a=li.getElementsByTag("a").get(0); + String title=a.text(); + //去除标题小于5个字的、非新闻的
  • 标签 + String regex=".{10,}"; + Pattern pattern=Pattern.compile(regex); + Matcher match=pattern.matcher(title); + if(!match.find()) + continue; + String newsUrl=a.attr("href"); + + + //图集类忽略,Redirect表示广告类忽略 + if(newsUrl.contains("photoview") || newsUrl.contains("Redirect") || newsUrl.contains("{")) + continue; + + try + { + Document docu2=Jsoup.connect(newsUrl).get(); + Elements eles=docu2.getElementsByClass("post_crumb"); + //没有面包屑导航栏的忽略:不是正规新闻 + if(eles.size()==0) + continue; + String moduleName=eles.get(0).getElementsByTag("a").get(1).text(); + + System.out.println(title+"("+moduleName+"):"+newsUrl); + + News news=new News(); + news.set("title",title).set("module_id", getModuleID(moduleName)) + .set("url",newsUrl).set("news_time", new Date()).save(); + + } + catch (SocketTimeoutException e) + { + continue; + } + catch(Exception e) { + e.printStackTrace(); + } + } + } + logger.info("本次新闻抓取完毕!"); + } + + /** + * 初次使用,填充新闻模块信息:将默认RSS源所有模块填入。 + */ + private static int getModuleID(String moduleName) { + int mododuleID=-1; + try { + String sql="select id from newsmodules where name=?"; + Newsmodules newsmodule=Newsmodules.dao.findFirst(sql,moduleName); + if(newsmodule==null) { + Newsmodules module=new Newsmodules(); + module.setName(moduleName); + module.save(); + return Newsmodules.dao.findFirst(sql,moduleName).getId(); + } + else + return newsmodule.getId(); + } + catch (Exception e) { + logger.error(e.getMessage()); + } + return mododuleID; + } +} \ No newline at end of file diff --git a/src/top/tomqian/UserBasedCollaborativeRecommender/MahoutUserBasedCollaborativeRecommender.java b/src/top/qianxinyao/UserBasedCollaborativeRecommender/MahoutUserBasedCollaborativeRecommender.java similarity index 71% rename from src/top/tomqian/UserBasedCollaborativeRecommender/MahoutUserBasedCollaborativeRecommender.java rename to src/top/qianxinyao/UserBasedCollaborativeRecommender/MahoutUserBasedCollaborativeRecommender.java index abc0197..c052202 100644 --- a/src/top/tomqian/UserBasedCollaborativeRecommender/MahoutUserBasedCollaborativeRecommender.java +++ b/src/top/qianxinyao/UserBasedCollaborativeRecommender/MahoutUserBasedCollaborativeRecommender.java @@ -3,9 +3,6 @@ */ package top.qianxinyao.UserBasedCollaborativeRecommender; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; import java.util.Date; import java.util.HashSet; import java.util.List; @@ -13,7 +10,7 @@ import java.util.Set; import org.apache.log4j.Logger; import org.apache.mahout.cf.taste.common.TasteException; -import org.apache.mahout.cf.taste.impl.model.jdbc.PostgreSQLBooleanPrefJDBCDataModel; +import org.apache.mahout.cf.taste.impl.model.jdbc.MySQLBooleanPrefJDBCDataModel; import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood; import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender; import org.apache.mahout.cf.taste.impl.similarity.LogLikelihoodSimilarity; @@ -25,7 +22,8 @@ import org.apache.mahout.cf.taste.similarity.UserSimilarity; import top.qianxinyao.algorithms.PropGetKit; import top.qianxinyao.algorithms.RecommendAlgorithm; import top.qianxinyao.algorithms.RecommendKit; -import top.qianxinyao.dbconnection.ConnectionFactory; +import top.qianxinyao.dbconnection.DBKit; +import top.qianxinyao.model.Newslogs; /** * @author qianxinyao @@ -59,26 +57,24 @@ public class MahoutUserBasedCollaborativeRecommender implements RecommendAlgorit */ @SuppressWarnings("unused") @Override - public void recommend(List users) + public void recommend(List users) { int count=0; try { System.out.println("CF start at "+new Date()); - PostgreSQLBooleanPrefJDBCDataModel dataModel = ConnectionFactory.getPostgreSQLBooleanPrefJDBCDataModel(); + MySQLBooleanPrefJDBCDataModel dataModel = DBKit.getMySQLJDBCDataModel(); - Statement stmt = ConnectionFactory.getNewStatement(); - - ResultSet rs1 = stmt.executeQuery("select " + ConnectionFactory.PREF_TABLE_USERID + "," - + ConnectionFactory.PREF_TABLE_NEWSID + "," + ConnectionFactory.PREF_TABLE_TIME + " from newslogs"); + List newslogList=Newslogs.dao.find("select " + DBKit.PREF_TABLE_USERID + "," + + DBKit.PREF_TABLE_NEWSID + "," + DBKit.PREF_TABLE_TIME + " from newslogs"); // 移除过期的用户浏览新闻行为,这些行为对计算用户相似度不再具有较大价值 - while (rs1.next()) + for (Newslogs newslog:newslogList) { - if (rs1.getTimestamp(3).before(RecommendKit.getInRecTimestamp(inRecDays))) + if (newslog.getViewTime().before(RecommendKit.getInRecTimestamp(inRecDays))) { - dataModel.removePreference(Long.parseLong(rs1.getString(1)), Long.parseLong(rs1.getString(2))); + dataModel.removePreference(newslog.getUserId(), newslog.getNewsId()); } } @@ -89,24 +85,24 @@ public class MahoutUserBasedCollaborativeRecommender implements RecommendAlgorit Recommender recommender = new GenericUserBasedRecommender(dataModel, neighborhood, similarity); - for (String user : users) + for (Long user : users) { long start = System.currentTimeMillis(); - Long userid = Long.parseLong(user); + Long userid = user; List recItems = recommender.recommend(userid, N); - Set hs = new HashSet(); + Set hs = new HashSet(); for (RecommendedItem recItem : recItems) { - hs.add(String.valueOf(recItem.getItemID())); + hs.add(recItem.getItemID()); } // 过滤掉已推荐新闻和已过期新闻 - RecommendKit.filterOutDateNews(hs, String.valueOf(userid)); - RecommendKit.filterReccedNews(hs, String.valueOf(userid)); + RecommendKit.filterOutDateNews(hs,userid); + RecommendKit.filterReccedNews(hs,userid); // 无可推荐新闻 if (hs == null) @@ -118,7 +114,7 @@ public class MahoutUserBasedCollaborativeRecommender implements RecommendAlgorit RecommendKit.removeOverNews(hs, N); } - RecommendKit.insertRecommend(String.valueOf(userid), hs.iterator(),RecommendAlgorithm.CF); + RecommendKit.insertRecommend(userid, hs.iterator(),RecommendAlgorithm.CF); count+=hs.size(); } @@ -128,7 +124,7 @@ public class MahoutUserBasedCollaborativeRecommender implements RecommendAlgorit logger.error("CB算法构造偏好对象失败!"); e.printStackTrace(); } - catch (SQLException e) + catch (Exception e) { logger.error("CB算法数据库操作失败!"); e.printStackTrace(); diff --git a/src/top/tomqian/UserBasedCollaborativeRecommender/quartz/CFCronTriggerRunner.java b/src/top/qianxinyao/UserBasedCollaborativeRecommender/quartz/CFCronTriggerRunner.java similarity index 93% rename from src/top/tomqian/UserBasedCollaborativeRecommender/quartz/CFCronTriggerRunner.java rename to src/top/qianxinyao/UserBasedCollaborativeRecommender/quartz/CFCronTriggerRunner.java index a490a90..f6f1102 100644 --- a/src/top/tomqian/UserBasedCollaborativeRecommender/quartz/CFCronTriggerRunner.java +++ b/src/top/qianxinyao/UserBasedCollaborativeRecommender/quartz/CFCronTriggerRunner.java @@ -14,6 +14,8 @@ import org.quartz.impl.JobDetailImpl; import org.quartz.impl.StdSchedulerFactory; import org.quartz.impl.triggers.CronTriggerImpl; +import top.qianxinyao.model.Users; + /** * @author qianxinyao * @email tomqianmaple@gmail.com @@ -22,7 +24,7 @@ import org.quartz.impl.triggers.CronTriggerImpl; */ public class CFCronTriggerRunner { - public void task(List users,String cronExpression) throws SchedulerException + public void task(List users,String cronExpression) throws SchedulerException { // Initiate a Schedule Factory SchedulerFactory schedulerFactory = new StdSchedulerFactory(); diff --git a/src/top/tomqian/UserBasedCollaborativeRecommender/quartz/CFJob.java b/src/top/qianxinyao/UserBasedCollaborativeRecommender/quartz/CFJob.java similarity index 89% rename from src/top/tomqian/UserBasedCollaborativeRecommender/quartz/CFJob.java rename to src/top/qianxinyao/UserBasedCollaborativeRecommender/quartz/CFJob.java index 6f3dfaf..6c58f75 100644 --- a/src/top/tomqian/UserBasedCollaborativeRecommender/quartz/CFJob.java +++ b/src/top/qianxinyao/UserBasedCollaborativeRecommender/quartz/CFJob.java @@ -24,7 +24,7 @@ public class CFJob implements Job @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { - List users=(List) arg0.getJobDetail().getJobDataMap().get("users"); + List users=(List) arg0.getJobDetail().getJobDataMap().get("users"); new MahoutUserBasedCollaborativeRecommender().recommend(users); } diff --git a/src/top/tomqian/algorithms/JsonKit.java b/src/top/qianxinyao/algorithms/JsonKit.java similarity index 100% rename from src/top/tomqian/algorithms/JsonKit.java rename to src/top/qianxinyao/algorithms/JsonKit.java diff --git a/src/top/tomqian/algorithms/PropGetKit.java b/src/top/qianxinyao/algorithms/PropGetKit.java similarity index 100% rename from src/top/tomqian/algorithms/PropGetKit.java rename to src/top/qianxinyao/algorithms/PropGetKit.java diff --git a/src/top/tomqian/algorithms/RecommendAlgorithm.java b/src/top/qianxinyao/algorithms/RecommendAlgorithm.java similarity index 93% rename from src/top/tomqian/algorithms/RecommendAlgorithm.java rename to src/top/qianxinyao/algorithms/RecommendAlgorithm.java index 800bf7b..990e901 100644 --- a/src/top/tomqian/algorithms/RecommendAlgorithm.java +++ b/src/top/qianxinyao/algorithms/RecommendAlgorithm.java @@ -32,6 +32,6 @@ public interface RecommendAlgorithm /** * 针对特定用户返回推荐结果 */ - public void recommend(List users); + public void recommend(List users); } diff --git a/src/top/tomqian/algorithms/RecommendKit.java b/src/top/qianxinyao/algorithms/RecommendKit.java similarity index 59% rename from src/top/tomqian/algorithms/RecommendKit.java rename to src/top/qianxinyao/algorithms/RecommendKit.java index 7cebfec..e7a0582 100644 --- a/src/top/tomqian/algorithms/RecommendKit.java +++ b/src/top/qianxinyao/algorithms/RecommendKit.java @@ -3,9 +3,6 @@ */ package top.qianxinyao.algorithms; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -17,8 +14,12 @@ import java.util.Iterator; import java.util.List; import java.util.Set; +import org.apache.log4j.Logger; + import top.qianxinyao.contentbasedrecommend.CustomizedHashMap; -import top.qianxinyao.dbconnection.ConnectionFactory; +import top.qianxinyao.model.News; +import top.qianxinyao.model.Recommendations; +import top.qianxinyao.model.Users; /** * @author qianxinyao @@ -28,6 +29,9 @@ import top.qianxinyao.dbconnection.ConnectionFactory; */ public class RecommendKit { + + public static final Logger logger=Logger.getLogger(RecommendKit.class); + /** * 推荐新闻的时效性天数,即从推荐当天开始到之前beforeDays天的新闻属于仍具有时效性的新闻,予以推荐。 */ @@ -62,25 +66,24 @@ public class RecommendKit /** * 过滤方法filterOutDateNews() 过滤掉失去时效性的新闻(由beforeDays属性控制) */ - public static void filterOutDateNews(Collection col, String userId) + public static void filterOutDateNews(Collection col, Long userId) { try { String newsids = getInQueryString(col.iterator()); if (!newsids.equals("()")) { - ResultSet rs = ConnectionFactory.getStatement() - .executeQuery("select newsid,ntime from news where newsid in " + newsids); - while (rs.next()) + List newsList = News.dao.find("select news_id,news_time from news where id in " + newsids); + for(News news:newsList) { - if (rs.getTimestamp(2).before(getInRecTimestamp(beforeDays))) + if (news.getNewsTime().before(getInRecTimestamp(beforeDays))) { - col.remove(rs.getString(1)); + col.remove(news.getId()); } } } } - catch (SQLException e) + catch (Exception e) { e.printStackTrace(); } @@ -89,22 +92,20 @@ public class RecommendKit /** * 过滤方法filterBrowsedNews() 过滤掉已经用户已经看过的新闻 */ - public static void filterBrowsedNews(Collection col, String userId) + public static void filterBrowsedNews(Collection col, Long userId) { try { - Statement stmt = ConnectionFactory.getNewStatement(); - ResultSet rs; - rs = stmt.executeQuery("select nlnewsid from newslogs where nluserid='" + userId + "'"); - while (rs.next()) + List newsList = News.dao.find("select news_id from newslogs where user_id=?",userId); + for (News news:newsList) { - if (col.contains(rs.getString(1))) + if (col.contains(news.getId())) { - col.remove(rs.getString(1)); + col.remove(news.getId()); } } } - catch (SQLException e) + catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -114,22 +115,20 @@ public class RecommendKit /** * 过滤方法filterReccedNews() 过滤掉已经推荐过的新闻(在recommend表中查找) */ - public static void filterReccedNews(Collection col, String userId) + public static void filterReccedNews(Collection col, Long userId) { try { - Statement stmt = ConnectionFactory.getNewStatement(); - ResultSet rs; - rs = stmt.executeQuery("select rnewsid from recommend where ruserid='" + userId + "' and rrectime>"+getInRecDate()); - while (rs.next()) + List newsList = News.dao.find("select news_id from recommendations where user_id=? and derive_time>?",userId,getInRecDate()); + for (News news:newsList) { - if (col.contains(rs.getString(1))) + if (col.contains(news.getId())) { - col.remove(rs.getString(1)); + col.remove(news.getId()); } } } - catch (SQLException e) + catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -141,18 +140,18 @@ public class RecommendKit * * @return */ - public static ArrayList getUserList() + public static ArrayList getUserList() { - ArrayList users = new ArrayList(); + ArrayList users = new ArrayList(); try { - ResultSet rs = ConnectionFactory.getNewStatement().executeQuery("select userid from users"); - while (rs.next()) + List userList = Users.dao.find("select id from users"); + for (Users user:userList) { - users.add(rs.getString(1)); + users.add(user.getId()); } } - catch (SQLException e) + catch (Exception e) { e.printStackTrace(); } @@ -183,26 +182,24 @@ public class RecommendKit * * @return */ - public static HashMap>> getUserPrefListMap( - Collection userSet) + public static HashMap>> getUserPrefListMap( + Collection userSet) { - ResultSet rs = null; - HashMap>> userPrefListMap = null; + HashMap>> userPrefListMap = null; try { String userPrefListQuery = getInQueryStringWithSingleQuote(userSet.iterator()); if (!userPrefListQuery.equals("()")) { - rs = ConnectionFactory.getNewStatement() - .executeQuery("select userid,upreflist from users where userid in " + userPrefListQuery); - userPrefListMap = new HashMap>>(); - while (rs.next()) + List userList = Users.dao.find("select id,pref_list from users where id in " + userPrefListQuery); + userPrefListMap = new HashMap>>(); + for (Users user:userList) { - userPrefListMap.put(rs.getString(1), JsonKit.jsonPrefListtoMap(rs.getString(2))); + userPrefListMap.put(user.getId(), JsonKit.jsonPrefListtoMap(user.getPrefList())); } } } - catch (SQLException e) + catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -257,58 +254,61 @@ public class RecommendKit * @param recAlgo * 标明推荐结果来自哪个推荐算法(RecommendAlgorithm.XX) */ - public static void insertRecommend(String userId, Iterator newsIte, int recAlgo) + public static void insertRecommend(Long userId, Iterator newsIte, int recAlgo) { try { - String insertValues = ""; while (newsIte.hasNext()) { - insertValues += "(" + userId + "," + newsIte.next() + ",'" + new Timestamp(System.currentTimeMillis()) - + "'," + recAlgo + "),"; - } - if (insertValues.length() > 0) - { - insertValues = insertValues.substring(0, insertValues.length() - 1); - ConnectionFactory.getNewStatement() - .execute("insert into recommend (ruserid,rnewsid,rrectime,rrecalgo) values " + insertValues); + Recommendations rec=new Recommendations(); + rec.setUserId(userId); + rec.setDeriveAlgorithm(recAlgo); + rec.setNewsId(newsIte.next()); } } - catch (SQLException e) + catch (Exception e) { e.printStackTrace(); } } /** - * Acquire list of "active" users' ids - * "Active" means who use app recently(determined by method getInRecDate()) + * Acquire a list of active users + * "Active" means who read news recently ('recent' determined by method getInRecDate(), default in a month) * * @return */ - public static List getActiveUsers() + public static List getActiveUsers() { try { int activeDay=PropGetKit.getInt("activeDay"); - ResultSet rs1; - rs1 = ConnectionFactory.getNewStatement() - .executeQuery("select distinct nluserid from newslogs where nltime>" + getInRecDate(activeDay)); - List users = new ArrayList(); - while (rs1.next()) - { - users.add(rs1.getString(1)); - } - return users; + List userList=Users.dao.find("select distinct id,name from users where latest_log_time>" + getInRecDate(activeDay)); + return userList; } - catch (SQLException e) + catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } - System.out.println("return null"); + logger.info("获取活跃用户异常!"); return null; } + + public static List getAllUsers(){ + try + { + List userList=Users.dao.find("select distinct id,name from users"); + return userList; + } + catch (Exception e) + { + e.printStackTrace(); + } + logger.info("获取全体用户异常!"); + return null; + } + /** * 去除数量上超过为算法设置的推荐结果上限值的推荐结果 @@ -317,10 +317,10 @@ public class RecommendKit * @param N * @return */ - public static void removeOverNews(Set set, int N) + public static void removeOverNews(Set set, int N) { int i = 0; - Iterator ite = set.iterator(); + Iterator ite = set.iterator(); while (ite.hasNext()) { if (i >= N) diff --git a/src/top/tomqian/contentbasedrecommend/ContentBasedRecommender.java b/src/top/qianxinyao/contentbasedrecommend/ContentBasedRecommender.java similarity index 72% rename from src/top/tomqian/contentbasedrecommend/ContentBasedRecommender.java rename to src/top/qianxinyao/contentbasedrecommend/ContentBasedRecommender.java index 161fb28..f795e38 100644 --- a/src/top/tomqian/contentbasedrecommend/ContentBasedRecommender.java +++ b/src/top/qianxinyao/contentbasedrecommend/ContentBasedRecommender.java @@ -3,7 +3,6 @@ */ package top.qianxinyao.contentbasedrecommend; -import java.sql.ResultSet; import java.util.ArrayList; import java.util.Collections; import java.util.Date; @@ -21,7 +20,7 @@ import org.apache.log4j.Logger; import top.qianxinyao.algorithms.PropGetKit; import top.qianxinyao.algorithms.RecommendAlgorithm; import top.qianxinyao.algorithms.RecommendKit; -import top.qianxinyao.dbconnection.ConnectionFactory; +import top.qianxinyao.model.News; /** * @author qianxinyao @@ -50,7 +49,7 @@ public class ContentBasedRecommender implements RecommendAlgorithm private static final int N = PropGetKit.getInt("CBRecNum"); @Override - public void recommend(List users) + public void recommend(List users) { try { @@ -59,27 +58,26 @@ public class ContentBasedRecommender implements RecommendAlgorithm // 首先进行用户喜好关键词列表的衰减更新+用户当日历史浏览记录的更新 new UserPrefRefresher().refresh(users); // 新闻及对应关键词列表的Map - HashMap> newsKeyWordsMap = new HashMap>(); - HashMap newsModuleMap = new HashMap(); + HashMap> newsKeyWordsMap = new HashMap>(); + HashMap newsModuleMap = new HashMap(); // 用户喜好关键词列表 - HashMap>> userPrefListMap = RecommendKit + HashMap>> userPrefListMap = RecommendKit .getUserPrefListMap(users); - ResultSet rs = ConnectionFactory.getStatement() - .executeQuery("select newsid,ntitle,ncontent,nmoduleid from news where ntime>" - + RecommendKit.getInRecDate() + " and ncontent not like ' newsList=News.dao.find("select id,title,content,module_id from news where news_time>" + + RecommendKit.getInRecDate()); + for (News news:newsList) { - newsKeyWordsMap.put(rs.getString(1), TFIDF.getTFIDE(rs.getString(2), rs.getString(3), KEY_WORDS_NUM)); - newsModuleMap.put(rs.getString(1), rs.getInt(4)); + newsKeyWordsMap.put(news.getId(), TFIDF.getTFIDE(news.getTitle(), news.getContent(), KEY_WORDS_NUM)); + newsModuleMap.put(news.getId(), news.getModuleId()); } - for (String userId : users) + for (Long userId : users) { - Map tempMatchMap = new HashMap(); - Iterator ite = newsKeyWordsMap.keySet().iterator(); + Map tempMatchMap = new HashMap(); + Iterator ite = newsKeyWordsMap.keySet().iterator(); while (ite.hasNext()) { - String newsId = ite.next(); + Long newsId = ite.next(); int moduleId = newsModuleMap.get(newsId); if (null != userPrefListMap.get(userId).get(moduleId)) tempMatchMap.put(newsId, @@ -92,7 +90,7 @@ public class ContentBasedRecommender implements RecommendAlgorithm if (!(tempMatchMap.toString().equals("{}"))) { tempMatchMap = sortMapByValue(tempMatchMap); - Set toBeRecommended=tempMatchMap.keySet(); + Set toBeRecommended=tempMatchMap.keySet(); //过滤掉已经推荐过的新闻 RecommendKit.filterReccedNews(toBeRecommended,userId); //过滤掉用户已经看过的新闻 @@ -133,19 +131,19 @@ public class ContentBasedRecommender implements RecommendAlgorithm return matchValue; } - private void removeZeroItem(Map map) + private void removeZeroItem(Map map) { - HashSet toBeDeleteItemSet = new HashSet(); - Iterator ite = map.keySet().iterator(); + HashSet toBeDeleteItemSet = new HashSet(); + Iterator ite = map.keySet().iterator(); while (ite.hasNext()) { - String newsId = ite.next(); + Long newsId = ite.next(); if (map.get(newsId) <= 0) { toBeDeleteItemSet.add(newsId); } } - for (String item : toBeDeleteItemSet) + for (Long item : toBeDeleteItemSet) { map.remove(item); } @@ -156,17 +154,17 @@ public class ContentBasedRecommender implements RecommendAlgorithm * @param map * @return */ - public static Map sortMapByValue(Map oriMap) { + public static Map sortMapByValue(Map oriMap) { if (oriMap == null || oriMap.isEmpty()) { return null; } - Map sortedMap = new LinkedHashMap(); - List> entryList = new ArrayList>( + Map sortedMap = new LinkedHashMap(); + List> entryList = new ArrayList>( oriMap.entrySet()); Collections.sort(entryList, new MapValueComparator()); - Iterator> iter = entryList.iterator(); - Map.Entry tmpEntry = null; + Iterator> iter = entryList.iterator(); + Map.Entry tmpEntry = null; while (iter.hasNext()) { tmpEntry = iter.next(); sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue()); diff --git a/src/top/tomqian/contentbasedrecommend/CustomizedComparator.java b/src/top/qianxinyao/contentbasedrecommend/CustomizedComparator.java similarity index 100% rename from src/top/tomqian/contentbasedrecommend/CustomizedComparator.java rename to src/top/qianxinyao/contentbasedrecommend/CustomizedComparator.java diff --git a/src/top/tomqian/contentbasedrecommend/CustomizedHashMap.java b/src/top/qianxinyao/contentbasedrecommend/CustomizedHashMap.java similarity index 100% rename from src/top/tomqian/contentbasedrecommend/CustomizedHashMap.java rename to src/top/qianxinyao/contentbasedrecommend/CustomizedHashMap.java diff --git a/src/top/tomqian/contentbasedrecommend/MapValueComparator.java b/src/top/qianxinyao/contentbasedrecommend/MapValueComparator.java similarity index 68% rename from src/top/tomqian/contentbasedrecommend/MapValueComparator.java rename to src/top/qianxinyao/contentbasedrecommend/MapValueComparator.java index 507888f..534399b 100644 --- a/src/top/tomqian/contentbasedrecommend/MapValueComparator.java +++ b/src/top/qianxinyao/contentbasedrecommend/MapValueComparator.java @@ -13,10 +13,10 @@ import java.util.Map.Entry; * @github https://github.com/bluemapleman * @date 2016年12月2日 */ -class MapValueComparator implements Comparator> { +class MapValueComparator implements Comparator> { @Override - public int compare(Entry me1, Entry me2) { + public int compare(Entry me1, Entry me2) { return me1.getValue().compareTo(me2.getValue()); } diff --git a/src/top/tomqian/contentbasedrecommend/TFIDF.java b/src/top/qianxinyao/contentbasedrecommend/TFIDF.java similarity index 100% rename from src/top/tomqian/contentbasedrecommend/TFIDF.java rename to src/top/qianxinyao/contentbasedrecommend/TFIDF.java diff --git a/src/top/tomqian/contentbasedrecommend/UserPrefRefresher.java b/src/top/qianxinyao/contentbasedrecommend/UserPrefRefresher.java similarity index 64% rename from src/top/tomqian/contentbasedrecommend/UserPrefRefresher.java rename to src/top/qianxinyao/contentbasedrecommend/UserPrefRefresher.java index dcb16e2..0dda879 100644 --- a/src/top/tomqian/contentbasedrecommend/UserPrefRefresher.java +++ b/src/top/qianxinyao/contentbasedrecommend/UserPrefRefresher.java @@ -3,8 +3,6 @@ */ package top.qianxinyao.contentbasedrecommend; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -14,9 +12,13 @@ import java.util.List; import org.ansj.app.keyword.Keyword; +import com.jfinal.plugin.activerecord.Db; + import top.qianxinyao.algorithms.JsonKit; import top.qianxinyao.algorithms.RecommendKit; -import top.qianxinyao.dbconnection.ConnectionFactory; +import top.qianxinyao.model.News; +import top.qianxinyao.model.Newslogs; +import top.qianxinyao.model.Users; /** * @author qianxinyao @@ -25,9 +27,7 @@ import top.qianxinyao.dbconnection.ConnectionFactory; * @date 2016年11月3日 每次用户浏览新的新闻时,用以更新用户的喜好关键词列表 */ public class UserPrefRefresher -{ - ResultSet rs=null; - +{ //设置TFIDF提取的关键词数目 private static final int KEY_WORDS_NUM = 10; @@ -39,29 +39,30 @@ public class UserPrefRefresher } @SuppressWarnings("unchecked") - public void refresh(Collection userIdsCol){ + public void refresh(Collection userIdsCol){ //首先对用户的喜好关键词列表进行衰减更新 autoDecRefresh(userIdsCol); - //用户浏览新闻纪录:userBrowsexMap:(newsid List)> - HashMap> userBrowsedMap=getBrowsedHistoryMap(); + //用户浏览新闻纪录:userBrowsexMap:(newsid List)> + HashMap> userBrowsedMap=getBrowsedHistoryMap(); //用户喜好关键词列表:userPrefListMap: - HashMap>> userPrefListMap=RecommendKit.getUserPrefListMap(userBrowsedMap.keySet()); + HashMap>> userPrefListMap=RecommendKit.getUserPrefListMap(userBrowsedMap.keySet()); //新闻对应关键词列表与模块ID:newsTFIDFMap:>, HashMap newsTFIDFMap=getNewsTFIDFMap(); //开始遍历用户浏览记录,更新用户喜好关键词列表 //对每个用户(外层循环),循环他所看过的每条新闻(内层循环),对每个新闻,更新它的关键词列表到用户的对应模块中 - Iterator ite=userBrowsedMap.keySet().iterator(); + Iterator ite=userBrowsedMap.keySet().iterator(); while(ite.hasNext()){ - String userId=ite.next(); - ArrayList newsList=userBrowsedMap.get(userId); - for(String news:newsList){ + Long userId=ite.next(); + ArrayList newsList=userBrowsedMap.get(userId); + for(Long news:newsList){ Integer moduleId=(Integer) newsTFIDFMap.get(news+"moduleid"); //获得对应模块的(关键词:喜好)map CustomizedHashMap rateMap=userPrefListMap.get(userId).get(moduleId); //获得新闻的(关键词:TFIDF值)map + @SuppressWarnings("unlikely-arg-type") List keywordList=(List) newsTFIDFMap.get(news); Iterator keywordIte=keywordList.iterator(); while(keywordIte.hasNext()){ @@ -77,14 +78,14 @@ public class UserPrefRefresher userPrefListMap.get(userId); } } - Iterator iterator=userBrowsedMap.keySet().iterator(); + Iterator iterator=userBrowsedMap.keySet().iterator(); while(iterator.hasNext()){ - String userId=iterator.next(); + Long userId=iterator.next(); try { - ConnectionFactory.getStatement().executeUpdate("update users set upreflist='"+userPrefListMap.get(userId)+"' where userid='"+userId+"'"); + Db.update("update users set upreflist='"+userPrefListMap.get(userId)+"' where userid=?",userId); } - catch (SQLException e) + catch (Exception e) { e.printStackTrace(); } @@ -102,20 +103,20 @@ public class UserPrefRefresher /** * 所有用户的喜好关键词列表TFIDF值随时间进行自动衰减更新 */ - public void autoDecRefresh(Collection userIdsCol){ + public void autoDecRefresh(Collection userIdsCol){ try { String inQuery=RecommendKit.getInQueryStringWithSingleQuote(userIdsCol.iterator()); if(inQuery.equals("()")){ return; } - ResultSet rs=ConnectionFactory.getStatement().executeQuery("select userid,upreflist from users where userid in "+inQuery); + List userList=Users.dao.find("select id,pref_list from users where id in "+inQuery); //用以更新的用户喜好关键词map的json串 //用于删除喜好值过低的关键词 ArrayList keywordToDelete=new ArrayList(); - while(rs.next()){ + for(Users user:userList){ String newPrefList="{"; - HashMap> map=JsonKit.jsonPrefListtoMap(rs.getString(2)); + HashMap> map=JsonKit.jsonPrefListtoMap(user.getPrefList()); Iterator ite=map.keySet().iterator(); while(ite.hasNext()){ //用户对应模块的喜好不为空 @@ -142,10 +143,10 @@ public class UserPrefRefresher newPrefList+=moduleMap.toString()+","; } newPrefList="'"+newPrefList.substring(0,newPrefList.length()-1)+"}'"; - ConnectionFactory.getNewStatement().executeUpdate("update users set upreflist="+newPrefList+" where userid='"+rs.getString(1)+"'"); + Db.update("update users set pref_list="+newPrefList+" where id=?",user.getId()); } } - catch (SQLException e) + catch (Exception e) { e.printStackTrace(); } @@ -155,35 +156,40 @@ public class UserPrefRefresher * 提取出当天所有用户浏览新闻纪录 * @return */ - private HashMap> getBrowsedHistoryMap(){ - HashMap> userBrowsedMap=null; + private HashMap> getBrowsedHistoryMap(){ + HashMap> userBrowsedMap=null; try { - userBrowsedMap=new HashMap>(); - ResultSet rs = ConnectionFactory.getStatement().executeQuery("select * from newslogs where nltime>"+RecommendKit.getSpecificDayFormat(0)); - while(rs.next()){ - if(userBrowsedMap.containsKey(rs.getString(2))){ - userBrowsedMap.get(rs.getString(2)).add(rs.getString(3)); + userBrowsedMap=new HashMap>(); + List newslogsList=Newslogs.dao.find("select * from newslogs where view_time>"+RecommendKit.getSpecificDayFormat(0)); + for(Newslogs newslogs:newslogsList){ + if(userBrowsedMap.containsKey(newslogs.getUserId())){ + userBrowsedMap.get(newslogs.getUserId()).add(newslogs.getNewsId()); } else{ - userBrowsedMap.put(rs.getString(2), new ArrayList()); - userBrowsedMap.get(rs.getString(2)).add(rs.getString(3)); + userBrowsedMap.put(newslogs.getUserId(), new ArrayList()); + userBrowsedMap.get(newslogs.getUserId()).add(newslogs.getNewsId()); } } } - catch (SQLException e) + catch (Exception e) { e.printStackTrace(); } return userBrowsedMap; } - private HashSet getBrowsedNewsSet(){ - HashMap> browsedMap=getBrowsedHistoryMap(); - HashSet newsIdSet=new HashSet(); - Iterator ite=getBrowsedHistoryMap().keySet().iterator(); + + /** + * 获得浏览过的新闻的集合 + * @return + */ + private HashSet getBrowsedNewsSet(){ + HashMap> browsedMap=getBrowsedHistoryMap(); + HashSet newsIdSet=new HashSet(); + Iterator ite=getBrowsedHistoryMap().keySet().iterator(); while(ite.hasNext()){ - Iterator inIte=browsedMap.get(ite.next()).iterator(); + Iterator inIte=browsedMap.get(ite.next()).iterator(); while(inIte.hasNext()){ newsIdSet.add(inIte.next()); } @@ -199,7 +205,7 @@ public class UserPrefRefresher HashMap newsTFIDFMap=null; try { - Iterator ite=getBrowsedNewsSet().iterator(); + Iterator ite=getBrowsedNewsSet().iterator(); String newsIdListQuery="("; while(ite.hasNext()){ newsIdListQuery+=ite.next()+","; @@ -208,18 +214,18 @@ public class UserPrefRefresher if(newsIdListQuery.length()>1){ newsIdListQuery=newsIdListQuery.substring(0, newsIdListQuery.length()-1)+")"; //提取出所有新闻的关键词列表及对应TF-IDf值,并放入一个map中 - rs=ConnectionFactory.getStatement().executeQuery("select newsid,ntitle,ncontent,nmoduleid from news where newsid in "+newsIdListQuery); + List newsList=News.dao.find("select id,title,content,module_id from news where newsid in "+newsIdListQuery); newsTFIDFMap=new HashMap(); - while(rs.next()){ - newsTFIDFMap.put(rs.getString(1), TFIDF.getTFIDE(rs.getString(2), rs.getString(3),KEY_WORDS_NUM)); - newsTFIDFMap.put(rs.getString(1)+"moduleid", rs.getInt(4)); + for(News news:newsList){ + newsTFIDFMap.put(String.valueOf(news.getId()), TFIDF.getTFIDE(news.getTitle(), news.getContent(),KEY_WORDS_NUM)); + newsTFIDFMap.put(news.getId()+"moduleid", news.getModuleId()); } } else return null; } - catch (SQLException e) + catch (Exception e) { e.printStackTrace(); } diff --git a/src/top/tomqian/contentbasedrecommend/quartz/CBCronTriggerRunner.java b/src/top/qianxinyao/contentbasedrecommend/quartz/CBCronTriggerRunner.java similarity index 93% rename from src/top/tomqian/contentbasedrecommend/quartz/CBCronTriggerRunner.java rename to src/top/qianxinyao/contentbasedrecommend/quartz/CBCronTriggerRunner.java index 2a05fda..26a17a6 100644 --- a/src/top/tomqian/contentbasedrecommend/quartz/CBCronTriggerRunner.java +++ b/src/top/qianxinyao/contentbasedrecommend/quartz/CBCronTriggerRunner.java @@ -14,6 +14,8 @@ import org.quartz.impl.JobDetailImpl; import org.quartz.impl.StdSchedulerFactory; import org.quartz.impl.triggers.CronTriggerImpl; +import top.qianxinyao.model.Users; + /** * @author qianxinyao * @email tomqianmaple@gmail.com @@ -22,7 +24,7 @@ import org.quartz.impl.triggers.CronTriggerImpl; */ public class CBCronTriggerRunner { - public void task(List users,String cronExpression) throws SchedulerException + public void task(List users,String cronExpression) throws SchedulerException { // Initiate a Schedule Factory SchedulerFactory schedulerFactory = new StdSchedulerFactory(); diff --git a/src/top/tomqian/contentbasedrecommend/quartz/CBJob.java b/src/top/qianxinyao/contentbasedrecommend/quartz/CBJob.java similarity index 89% rename from src/top/tomqian/contentbasedrecommend/quartz/CBJob.java rename to src/top/qianxinyao/contentbasedrecommend/quartz/CBJob.java index 78bd4f1..42fb47e 100644 --- a/src/top/tomqian/contentbasedrecommend/quartz/CBJob.java +++ b/src/top/qianxinyao/contentbasedrecommend/quartz/CBJob.java @@ -24,7 +24,7 @@ public class CBJob implements Job @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { - List users=(List) arg0.getJobDetail().getJobDataMap().get("users"); + List users=(List) arg0.getJobDetail().getJobDataMap().get("users"); new ContentBasedRecommender().recommend(users); } diff --git a/src/top/qianxinyao/dbconnection/DBKit.java b/src/top/qianxinyao/dbconnection/DBKit.java new file mode 100644 index 0000000..23d0e16 --- /dev/null +++ b/src/top/qianxinyao/dbconnection/DBKit.java @@ -0,0 +1,104 @@ +package top.qianxinyao.dbconnection; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.Properties; + +import javax.sql.DataSource; + +import org.apache.log4j.Logger; +import org.apache.mahout.cf.taste.impl.model.jdbc.MySQLBooleanPrefJDBCDataModel; + +import com.jfinal.plugin.activerecord.ActiveRecordPlugin; +import com.jfinal.plugin.c3p0.C3p0Plugin; + +import top.qianxinyao.model.News; +import top.qianxinyao.model.Newslogs; +import top.qianxinyao.model.Newsmodules; +import top.qianxinyao.model.Recommendations; +import top.qianxinyao.model.Users; + +public class DBKit{ + + public static final Logger logger=Logger.getLogger(DBKit.class); + + //偏好表表名 + public static final String PREF_TABLE="newslogs"; + //用户id列名 + public static final String PREF_TABLE_USERID="user_id"; + //新闻id列名 + public static final String PREF_TABLE_NEWSID="news_id"; + //偏好值列名 + public static final String PREF_TABLE_PREFVALUE="prefer_degree"; + //用户浏览时间列名 + public static final String PREF_TABLE_TIME="view_time"; + + private static C3p0Plugin cp; + + public static void initalize() + { + try + { + HashMap info = getDBInfo(); + cp = new C3p0Plugin(info.get("url"), info.get("user"), info.get("password")); + + ActiveRecordPlugin arp = new ActiveRecordPlugin(cp); + arp.addMapping("users", Users.class); + arp.addMapping("news", News.class); + arp.addMapping("newsmodules", Newsmodules.class); + arp.addMapping("newslogs", Newslogs.class); + arp.addMapping("recommendations", Recommendations.class); + + + if(cp.start() && arp.start()) + logger.info("数据库连接池插件启动成功......"); + else + logger.info("c3p0插件启动失败!"); + + + + logger.info("数据库初始化工作完毕!"); + } + catch (Exception e) + { + logger.error("数据库连接初始化错误!"); + } + return; + } + + public static HashMap getDBInfo() + { + HashMap info = null; + try + { + Properties p = new Properties(); + p.load(new FileInputStream(System.getProperty("user.dir") + "/res/dbconfig.properties")); + info = new HashMap(); + info.put("url", p.getProperty("url")); + info.put("user", p.getProperty("user")); + info.put("password", p.getProperty("password")); + } + catch (FileNotFoundException e) + { + logger.error("读取属性文件--->失败!- 原因:文件路径错误或者文件不存在"); + } + catch (IOException e) + { + logger.error("装载文件--->失败!"); + } + return info; + } + + public static DataSource getDataSource() { + if(cp==null) + initalize(); + return cp.getDataSource(); + } + + public static MySQLBooleanPrefJDBCDataModel getMySQLJDBCDataModel(){ + return new MySQLBooleanPrefJDBCDataModel(DBKit.getDataSource(), PREF_TABLE, PREF_TABLE_USERID, + PREF_TABLE_NEWSID,PREF_TABLE_TIME); + } +} diff --git a/src/top/tomqian/dbconnection/StatementWatcher.java b/src/top/qianxinyao/dbconnection/StatementWatcher.java similarity index 97% rename from src/top/tomqian/dbconnection/StatementWatcher.java rename to src/top/qianxinyao/dbconnection/StatementWatcher.java index 25f7698..dc7e7ba 100644 --- a/src/top/tomqian/dbconnection/StatementWatcher.java +++ b/src/top/qianxinyao/dbconnection/StatementWatcher.java @@ -22,7 +22,7 @@ public class StatementWatcher extends Thread //防止还未开始 try { - Thread.sleep(10000); + Thread.sleep(20000); } catch (InterruptedException e1) { diff --git a/src/top/tomqian/hotrecommend/HotRecommender.java b/src/top/qianxinyao/hotrecommend/HotRecommender.java similarity index 62% rename from src/top/tomqian/hotrecommend/HotRecommender.java rename to src/top/qianxinyao/hotrecommend/HotRecommender.java index aa7fb5f..dfeae32 100644 --- a/src/top/tomqian/hotrecommend/HotRecommender.java +++ b/src/top/qianxinyao/hotrecommend/HotRecommender.java @@ -3,8 +3,6 @@ */ package top.qianxinyao.hotrecommend; -import java.sql.ResultSet; -import java.sql.SQLException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Calendar; @@ -13,9 +11,12 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import org.apache.log4j.Logger; + import top.qianxinyao.algorithms.RecommendAlgorithm; import top.qianxinyao.algorithms.RecommendKit; -import top.qianxinyao.dbconnection.ConnectionFactory; +import top.qianxinyao.model.Newslogs; +import top.qianxinyao.model.Recommendations; /** * @author qianxinyao @@ -25,29 +26,33 @@ import top.qianxinyao.dbconnection.ConnectionFactory; */ public class HotRecommender implements RecommendAlgorithm { + + public static final Logger logger=Logger.getLogger(HotRecommender.class); + // 热点新闻的有效时间 public static int beforeDays = -10; // 推荐系统每日为每位用户生成的推荐结果的总数,当CF与CB算法生成的推荐结果数不足此数时,由该算法补充 public static int TOTAL_REC_NUM = 20; // 将每天生成的“热点新闻”ID,按照新闻的热点程度从高到低放入此List - private static ArrayList topHotNewsList = new ArrayList(); + private static ArrayList topHotNewsList = new ArrayList(); @Override - public void recommend(List users) + public void recommend(List users) { System.out.println("HR start at "+new Date()); int count=0; Timestamp timestamp = getCertainTimestamp(0, 0, 0); - for (String userId : users) + for (Long userId : users) { try { - ResultSet rs = ConnectionFactory.getNewStatement() - .executeQuery("select ruserid,count(*) as recnums from recommend where rrectime>'" + timestamp - + "' and ruserid='" + userId + "' group by ruserid"); - boolean flag=rs.next(); - int delta=flag?TOTAL_REC_NUM - rs.getInt("recnums"):TOTAL_REC_NUM; - Set toBeRecommended = new HashSet(); + Recommendations recommendation=Recommendations.dao.findFirst("select user_id,count(*) as recnums from recommendations where derive_time>'" + timestamp + + "' and user_id='" + userId + "' group by user_id"); + + boolean flag=recommendation!=null; + + int delta=flag?TOTAL_REC_NUM - recommendation.getInt("recnums"):TOTAL_REC_NUM; + Set toBeRecommended = new HashSet(); if (delta > 0) { int i = topHotNewsList.size() > delta ? delta : topHotNewsList.size(); @@ -59,12 +64,12 @@ public class HotRecommender implements RecommendAlgorithm RecommendKit.insertRecommend(userId, toBeRecommended.iterator(), RecommendAlgorithm.HR); count+=toBeRecommended.size(); } - catch (SQLException e) + catch (Exception e) { e.printStackTrace(); } } - System.out.println("HR has contributed " + (count/users.size()) + " recommending news on average"); + System.out.println("HR has contributed " + (users.size()==0?0:count/users.size()) + " recommending news on average"); System.out.println("HR end at "+new Date()); } @@ -72,29 +77,27 @@ public class HotRecommender implements RecommendAlgorithm public static void formTodayTopHotNewsList() { topHotNewsList.clear(); - ArrayList hotNewsTobeReccommended = new ArrayList(); + ArrayList hotNewsTobeReccommended = new ArrayList(); try { - ResultSet rs = ConnectionFactory.getNewStatement() - .executeQuery("select nlnewsid,count(*) as visitNums from newslogs where nltime>" - + RecommendKit.getInRecDate(beforeDays) + " group by nlnewsid order by visitNums desc"); - while (rs.next()) + List newslogsList=Newslogs.dao.find("select news_id,count(*) as visitNums from newslogs where view_time>" + + RecommendKit.getInRecDate(beforeDays) + " group by news_id order by visitNums desc"); + for (Newslogs newslog:newslogsList) { - hotNewsTobeReccommended.add(rs.getString(1)); + hotNewsTobeReccommended.add(newslog.getNewsId()); } - for (String news : hotNewsTobeReccommended) + for (Long news : hotNewsTobeReccommended) { topHotNewsList.add(news); } - System.out.println(topHotNewsList); } - catch (SQLException e) + catch (Exception e) { e.printStackTrace(); } } - public static List getTopHotNewsList() + public static List getTopHotNewsList() { return topHotNewsList; } diff --git a/src/top/tomqian/hotrecommend/quartz/HRCronTriggerRunner.java b/src/top/qianxinyao/hotrecommend/quartz/HRCronTriggerRunner.java similarity index 93% rename from src/top/tomqian/hotrecommend/quartz/HRCronTriggerRunner.java rename to src/top/qianxinyao/hotrecommend/quartz/HRCronTriggerRunner.java index 40c4ccd..4a136a5 100644 --- a/src/top/tomqian/hotrecommend/quartz/HRCronTriggerRunner.java +++ b/src/top/qianxinyao/hotrecommend/quartz/HRCronTriggerRunner.java @@ -14,6 +14,8 @@ import org.quartz.impl.JobDetailImpl; import org.quartz.impl.StdSchedulerFactory; import org.quartz.impl.triggers.CronTriggerImpl; +import top.qianxinyao.model.Users; + /** * @author qianxinyao * @email tomqianmaple@gmail.com @@ -22,7 +24,7 @@ import org.quartz.impl.triggers.CronTriggerImpl; */ public class HRCronTriggerRunner { - public void task(List users,String cronExpression) throws SchedulerException + public void task(List users,String cronExpression) throws SchedulerException { // Initiate a Schedule Factory SchedulerFactory schedulerFactory = new StdSchedulerFactory(); diff --git a/src/top/tomqian/hotrecommend/quartz/HRJob.java b/src/top/qianxinyao/hotrecommend/quartz/HRJob.java similarity index 100% rename from src/top/tomqian/hotrecommend/quartz/HRJob.java rename to src/top/qianxinyao/hotrecommend/quartz/HRJob.java diff --git a/src/top/qianxinyao/model/ModelGenerator.java b/src/top/qianxinyao/model/ModelGenerator.java new file mode 100644 index 0000000..36bd73e --- /dev/null +++ b/src/top/qianxinyao/model/ModelGenerator.java @@ -0,0 +1,49 @@ +/** + * + */ +package top.qianxinyao.model; + +import com.jfinal.kit.PathKit; +import com.jfinal.plugin.activerecord.dialect.MysqlDialect; +import com.jfinal.plugin.activerecord.generator.Generator; + +import top.qianxinyao.dbconnection.DBKit; + +/** + * @author qianxinyao + * + */ + +public class ModelGenerator +{ + /** + * @param dataSource + * @param baseModelPackageName + * @param baseModelOutputDir + * @param modelPackageName + * @param modelOutputDir + */ + public static void main(String[] args) + { + // base model 所使用的包名 + String baseModelPackageName = "top.qianxinyao.model.base"; + // base model 文件保存路径 + String baseModelOutputDir = PathKit.getRootClassPath() + "/../../src/top/qianxinyao/model/base"; + System.out.println("rootclasspath:"+baseModelOutputDir); + // model 所使用的包名 (MappingKit 默认使用的包名) + String modelPackageName = "top.qianxinyao.model"; + // model 文件保存路径 (MappingKit 与 DataDictionary 文件默认保存路径) + String modelOutputDir = baseModelOutputDir+"/.."; + System.out.println(baseModelOutputDir); + // 创建生成器 + Generator gernerator = new Generator(DBKit.getDataSource(), baseModelPackageName, baseModelOutputDir, + modelPackageName, modelOutputDir); + gernerator.setDialect(new MysqlDialect()); + // 设置是否在 Model 中生成 dao 对象 + gernerator.setGenerateDaoInModel(true); + // 设置是否生成字典文件 + gernerator.setGenerateDataDictionary(false); + // 生成 + gernerator.generate(); + } +} diff --git a/src/top/qianxinyao/model/News.java b/src/top/qianxinyao/model/News.java new file mode 100644 index 0000000..c9103a8 --- /dev/null +++ b/src/top/qianxinyao/model/News.java @@ -0,0 +1,11 @@ +package top.qianxinyao.model; + +import top.qianxinyao.model.base.BaseNews; + +/** + * Generated by JFinal. + */ +@SuppressWarnings("serial") +public class News extends BaseNews { + public static final News dao = new News().dao(); +} diff --git a/src/top/qianxinyao/model/Newslogs.java b/src/top/qianxinyao/model/Newslogs.java new file mode 100644 index 0000000..20c7201 --- /dev/null +++ b/src/top/qianxinyao/model/Newslogs.java @@ -0,0 +1,11 @@ +package top.qianxinyao.model; + +import top.qianxinyao.model.base.BaseNewslogs; + +/** + * Generated by JFinal. + */ +@SuppressWarnings("serial") +public class Newslogs extends BaseNewslogs { + public static final Newslogs dao = new Newslogs().dao(); +} diff --git a/src/top/qianxinyao/model/Newsmodules.java b/src/top/qianxinyao/model/Newsmodules.java new file mode 100644 index 0000000..2f29a89 --- /dev/null +++ b/src/top/qianxinyao/model/Newsmodules.java @@ -0,0 +1,11 @@ +package top.qianxinyao.model; + +import top.qianxinyao.model.base.BaseNewsmodules; + +/** + * Generated by JFinal. + */ +@SuppressWarnings("serial") +public class Newsmodules extends BaseNewsmodules { + public static final Newsmodules dao = new Newsmodules().dao(); +} diff --git a/src/top/qianxinyao/model/Recommendations.java b/src/top/qianxinyao/model/Recommendations.java new file mode 100644 index 0000000..512dec9 --- /dev/null +++ b/src/top/qianxinyao/model/Recommendations.java @@ -0,0 +1,11 @@ +package top.qianxinyao.model; + +import top.qianxinyao.model.base.BaseRecommendations; + +/** + * Generated by JFinal. + */ +@SuppressWarnings("serial") +public class Recommendations extends BaseRecommendations { + public static final Recommendations dao = new Recommendations().dao(); +} diff --git a/src/top/qianxinyao/model/Users.java b/src/top/qianxinyao/model/Users.java new file mode 100644 index 0000000..ad8a53e --- /dev/null +++ b/src/top/qianxinyao/model/Users.java @@ -0,0 +1,11 @@ +package top.qianxinyao.model; + +import top.qianxinyao.model.base.BaseUsers; + +/** + * Generated by JFinal. + */ +@SuppressWarnings("serial") +public class Users extends BaseUsers { + public static final Users dao = new Users().dao(); +} diff --git a/src/top/qianxinyao/model/_MappingKit.java b/src/top/qianxinyao/model/_MappingKit.java new file mode 100644 index 0000000..7fcb09d --- /dev/null +++ b/src/top/qianxinyao/model/_MappingKit.java @@ -0,0 +1,26 @@ +package top.qianxinyao.model; + +import com.jfinal.plugin.activerecord.ActiveRecordPlugin; + +/** + * Generated by JFinal, do not modify this file. + *
    + * Example:
    + * public void configPlugin(Plugins me) {
    + *     ActiveRecordPlugin arp = new ActiveRecordPlugin(...);
    + *     _MappingKit.mapping(arp);
    + *     me.add(arp);
    + * }
    + * 
    + */ +public class _MappingKit { + + public static void mapping(ActiveRecordPlugin arp) { + arp.addMapping("news", "id", News.class); + arp.addMapping("newslogs", "id", Newslogs.class); + arp.addMapping("newsmodules", "id", Newsmodules.class); + arp.addMapping("recommendations", "id", Recommendations.class); + arp.addMapping("users", "id", Users.class); + } +} + diff --git a/src/top/qianxinyao/model/base/BaseNews.java b/src/top/qianxinyao/model/base/BaseNews.java new file mode 100644 index 0000000..214bc72 --- /dev/null +++ b/src/top/qianxinyao/model/base/BaseNews.java @@ -0,0 +1,60 @@ +package top.qianxinyao.model.base; + +import com.jfinal.plugin.activerecord.Model; +import com.jfinal.plugin.activerecord.IBean; + +/** + * Generated by JFinal, do not modify this file. + */ +@SuppressWarnings("serial") +public abstract class BaseNews> extends Model implements IBean { + + public void setId(java.lang.Long id) { + set("id", id); + } + + public java.lang.Long getId() { + return get("id"); + } + + public void setContent(java.lang.String content) { + set("content", content); + } + + public java.lang.String getContent() { + return get("content"); + } + + public void setNewsTime(java.util.Date newsTime) { + set("news_time", newsTime); + } + + public java.util.Date getNewsTime() { + return get("news_time"); + } + + public void setTitle(java.lang.String title) { + set("title", title); + } + + public java.lang.String getTitle() { + return get("title"); + } + + public void setModuleId(java.lang.Integer moduleId) { + set("module_id", moduleId); + } + + public java.lang.Integer getModuleId() { + return get("module_id"); + } + + public void setUrl(java.lang.String url) { + set("url", url); + } + + public java.lang.String getUrl() { + return get("url"); + } + +} diff --git a/src/top/qianxinyao/model/base/BaseNewslogs.java b/src/top/qianxinyao/model/base/BaseNewslogs.java new file mode 100644 index 0000000..b40eadc --- /dev/null +++ b/src/top/qianxinyao/model/base/BaseNewslogs.java @@ -0,0 +1,52 @@ +package top.qianxinyao.model.base; + +import com.jfinal.plugin.activerecord.Model; +import com.jfinal.plugin.activerecord.IBean; + +/** + * Generated by JFinal, do not modify this file. + */ +@SuppressWarnings("serial") +public abstract class BaseNewslogs> extends Model implements IBean { + + public void setId(java.lang.Long id) { + set("id", id); + } + + public java.lang.Long getId() { + return get("id"); + } + + public void setUserId(java.lang.Long userId) { + set("user_id", userId); + } + + public java.lang.Long getUserId() { + return get("user_id"); + } + + public void setNewsId(java.lang.Long newsId) { + set("news_id", newsId); + } + + public java.lang.Long getNewsId() { + return get("news_id"); + } + + public void setViewTime(java.util.Date viewTime) { + set("view_time", viewTime); + } + + public java.util.Date getViewTime() { + return get("view_time"); + } + + public void setPreferDegree(java.lang.Integer preferDegree) { + set("prefer_degree", preferDegree); + } + + public java.lang.Integer getPreferDegree() { + return get("prefer_degree"); + } + +} diff --git a/src/top/qianxinyao/model/base/BaseNewsmodules.java b/src/top/qianxinyao/model/base/BaseNewsmodules.java new file mode 100644 index 0000000..0a148aa --- /dev/null +++ b/src/top/qianxinyao/model/base/BaseNewsmodules.java @@ -0,0 +1,28 @@ +package top.qianxinyao.model.base; + +import com.jfinal.plugin.activerecord.Model; +import com.jfinal.plugin.activerecord.IBean; + +/** + * Generated by JFinal, do not modify this file. + */ +@SuppressWarnings("serial") +public abstract class BaseNewsmodules> extends Model implements IBean { + + public void setId(java.lang.Integer id) { + set("id", id); + } + + public java.lang.Integer getId() { + return get("id"); + } + + public void setName(java.lang.String name) { + set("name", name); + } + + public java.lang.String getName() { + return get("name"); + } + +} diff --git a/src/top/qianxinyao/model/base/BaseRecommendations.java b/src/top/qianxinyao/model/base/BaseRecommendations.java new file mode 100644 index 0000000..fceca23 --- /dev/null +++ b/src/top/qianxinyao/model/base/BaseRecommendations.java @@ -0,0 +1,60 @@ +package top.qianxinyao.model.base; + +import com.jfinal.plugin.activerecord.Model; +import com.jfinal.plugin.activerecord.IBean; + +/** + * Generated by JFinal, do not modify this file. + */ +@SuppressWarnings("serial") +public abstract class BaseRecommendations> extends Model implements IBean { + + public void setId(java.lang.Long id) { + set("id", id); + } + + public java.lang.Long getId() { + return get("id"); + } + + public void setUserId(java.lang.Long userId) { + set("user_id", userId); + } + + public java.lang.Long getUserId() { + return get("user_id"); + } + + public void setNewsId(java.lang.Long newsId) { + set("news_id", newsId); + } + + public java.lang.Long getNewsId() { + return get("news_id"); + } + + public void setDeriveTime(java.util.Date deriveTime) { + set("derive_time", deriveTime); + } + + public java.util.Date getDeriveTime() { + return get("derive_time"); + } + + public void setFeedback(java.lang.Boolean feedback) { + set("feedback", feedback); + } + + public java.lang.Boolean getFeedback() { + return get("feedback"); + } + + public void setDeriveAlgorithm(java.lang.Integer deriveAlgorithm) { + set("derive_algorithm", deriveAlgorithm); + } + + public java.lang.Integer getDeriveAlgorithm() { + return get("derive_algorithm"); + } + +} diff --git a/src/top/qianxinyao/model/base/BaseUsers.java b/src/top/qianxinyao/model/base/BaseUsers.java new file mode 100644 index 0000000..7c89dd3 --- /dev/null +++ b/src/top/qianxinyao/model/base/BaseUsers.java @@ -0,0 +1,44 @@ +package top.qianxinyao.model.base; + +import com.jfinal.plugin.activerecord.Model; +import com.jfinal.plugin.activerecord.IBean; + +/** + * Generated by JFinal, do not modify this file. + */ +@SuppressWarnings("serial") +public abstract class BaseUsers> extends Model implements IBean { + + public void setId(java.lang.Long id) { + set("id", id); + } + + public java.lang.Long getId() { + return get("id"); + } + + public void setPrefList(java.lang.String prefList) { + set("pref_list", prefList); + } + + public java.lang.String getPrefList() { + return get("pref_list"); + } + + public void setLatestLogTime(java.util.Date latestLogTime) { + set("latest_log_time", latestLogTime); + } + + public java.util.Date getLatestLogTime() { + return get("latest_log_time"); + } + + public void setName(java.lang.String name) { + set("name", name); + } + + public java.lang.String getName() { + return get("name"); + } + +} diff --git a/src/top/tomqian/performance/Judge.java b/src/top/qianxinyao/performance/Judge.java similarity index 100% rename from src/top/tomqian/performance/Judge.java rename to src/top/qianxinyao/performance/Judge.java diff --git a/src/top/tomqian/Main/DataProcessor.java b/src/top/tomqian/Main/DataProcessor.java deleted file mode 100644 index 4a3b026..0000000 --- a/src/top/tomqian/Main/DataProcessor.java +++ /dev/null @@ -1,158 +0,0 @@ -///** -// * -// */ -//package top.qianxinyao.Main; -// -//import java.io.File; -//import java.io.FileInputStream; -//import java.io.FileNotFoundException; -//import java.io.IOException; -//import java.text.DecimalFormat; -//import java.util.HashMap; -//import java.util.Iterator; -// -//import org.apache.log4j.Logger; -//import org.apache.poi.hssf.usermodel.HSSFCell; -//import org.apache.poi.hssf.usermodel.HSSFRow; -//import org.apache.poi.hssf.usermodel.HSSFSheet; -//import org.apache.poi.hssf.usermodel.HSSFWorkbook; -//import org.apache.poi.ss.usermodel.Cell; -//import org.apache.poi.ss.usermodel.Row; -// -// -///** -// * @author qianxinyao -// * @email tomqianmaple@gmail.com -// * @github https://github.com/bluemapleman -// * @date 2016年10月16日 -// */ -// -//public class DataProcessor -//{ -// -// private static Logger logger = Logger.getLogger(DataProcessor.class); -// -// private static HashMap> userLikes; -// -// /** -// * 读取数据表,获得用户的喜好数据 -// */ -// public static void readDataTable(){ -// -// } -// -// /** -// * 读取excel文件,获得用户的喜好数据 -// * -// * @param file -// */ -// -// public static void readExcelData(File file) -// { -// userLikes=new HashMap>(); -// -// HSSFWorkbook wb=null; -// -// try -// { -// wb = new HSSFWorkbook(new FileInputStream(file)); -// -// HSSFSheet sheet = wb.getSheetAt(0); -// -// // Iterate over each row in the sheet -// -// Iterator rows = sheet.rowIterator(); -// -// while (rows.hasNext()) -// { -// HashMap likes=new HashMap(); -// -// HSSFRow row = (HSSFRow) rows.next(); -// -// // Iterate over each cell in the row and print out the cell"s -// -// // content -// -// Iterator cells = row.cellIterator(); -// -// -// while (cells.hasNext()) -// { -// Cell cell=cells.next(); -// -// String cellValue=getCellValue((HSSFCell) cell); -// -// -// logger.info(cellValue); -// -// } -// } -// } -// catch (FileNotFoundException fe) -// { -// logger.error("Exception:" + fe.toString()); -// } -// catch (Exception e) -// { -// logger.error("Exception:" + e.toString()); -// } -// finally -// { -// if(null!=wb){ -// try -// { -// wb.close(); -// } -// catch (IOException e) -// { -// // TODO Auto-generated catch block -// logger.error("XSSFWorkbook close failed!"); -// } -// } -// logger.info("程序出现异常!请检查!"); -// } -// } -// -// -// /** -// * 返回各种类型单元格值的字符串形式的方法 -// * @param cell -// * @return -// */ -// private static String getCellValue(HSSFCell cell) { -// String cellValue = ""; -// DecimalFormat df = new DecimalFormat("#"); -// switch (cell.getCellType()) { -// case HSSFCell.CELL_TYPE_STRING: -// cellValue = cell.getRichStringCellValue().getString().trim(); -// break; -// case HSSFCell.CELL_TYPE_NUMERIC: -// cellValue = df.format(cell.getNumericCellValue()).toString(); -// break; -// case HSSFCell.CELL_TYPE_BOOLEAN: -// cellValue = String.valueOf(cell.getBooleanCellValue()).trim(); -// break; -// case HSSFCell.CELL_TYPE_FORMULA: -// cellValue = cell.getCellFormula(); -// break; -// default: -// cellValue = ""; -// } -// return cellValue; -// } -// -// -// -// -// -// /** -// * 分隔用户所喜好新闻数据的方法,获得用户喜好的所有新闻信息。 -// * @param likes -// * @param seperator 新闻数据分隔符 -// * @return -// */ -//// private static String[] seperateLikes(String likes,String seperator){ -//// return likes.split(seperator); -//// } -// -//} diff --git a/src/top/tomqian/Main/Main.java b/src/top/tomqian/Main/Main.java deleted file mode 100644 index 53d8af1..0000000 --- a/src/top/tomqian/Main/Main.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * - */ -package top.qianxinyao.Main; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - -import top.qianxinyao.UserBasedCollaborativeRecommender.MahoutUserBasedCollaborativeRecommender; -import top.qianxinyao.algorithms.PropGetKit; -import top.qianxinyao.algorithms.RecommendKit; -import top.qianxinyao.contentbasedrecommend.ContentBasedRecommender; -import top.qianxinyao.hotrecommend.HotRecommender; - -/** - * @author qianxinyao - * @email tomqianmaple@gmail.com - * @github https://github.com/bluemapleman - * @date 2016年10月20日 - */ -public class Main -{ - static ResultSet rs=null; - - /** - * @param args - * @throws SQLException - */ - public static void main(String[] args) throws SQLException - { - //加载系统配置文件 - PropGetKit.loadProperties("paraConfig"); - //仅给最近一个月有活动的用户进行推荐动作 - List users=RecommendKit.getActiveUsers(); - //设定推荐任务每天的执行时间 -// String cronExpression=PropGetKit.getString("startAt"); -// try -// { -// new CFCronTriggerRunner().task(users,cronExpression); -// new CBCronTriggerRunner().task(users,cronExpression); -// new HRCronTriggerRunner().task(users,cronExpression); -// } -// catch (SchedulerException e) -// { -// // TODO Auto-generated catch block -// e.printStackTrace(); -// } - HotRecommender.formTodayTopHotNewsList(); -// new MahoutUserBasedCollaborativeRecommender().recommend(users); -// new ContentBasedRecommender().recommend(users); - new HotRecommender().recommend(users); - - - - - - } -} - diff --git a/src/top/tomqian/dbconnection/ConnectionFactory.java b/src/top/tomqian/dbconnection/ConnectionFactory.java deleted file mode 100644 index 46a537c..0000000 --- a/src/top/tomqian/dbconnection/ConnectionFactory.java +++ /dev/null @@ -1,163 +0,0 @@ -/** - * - */ -package top.qianxinyao.dbconnection; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.HashMap; -import java.util.Properties; - -import javax.sql.DataSource; - -import org.apache.log4j.Logger; -import org.apache.mahout.cf.taste.impl.model.jdbc.MySQLJDBCDataModel; -import org.apache.mahout.cf.taste.impl.model.jdbc.PostgreSQLBooleanPrefJDBCDataModel; -import org.postgresql.jdbc3.Jdbc3SimpleDataSource; - - -/** - * @author qianxinyao - * @email tomqianmaple@gmail.com - * @github https://github.com/bluemapleman - * @date 2016年10月21日 - */ -public class ConnectionFactory -{ - public static final Logger logger = Logger.getLogger(ConnectionFactory.class); - //偏好表表名 - public static final String PREF_TABLE="newslogs"; - //用户id列名 - public static final String PREF_TABLE_USERID="nlonguserid"; - //新闻id列名 - public static final String PREF_TABLE_NEWSID="nlnewsid"; - //偏好值列名 - public static final String PREF_TABLE_PREFVALUE="nprefer"; - //用户浏览时间列名 - public static final String PREF_TABLE_TIME="nltime"; - - public static final String MYSQL="com.mysql.jdbc.Driver"; - public static final String POSTGRE="org.postgresql.Driver"; - - public static Connection conn; - - public static Statement stmt; - -// private static void initalize(String database) -// { -// try -// { -// Class.forName(database).newInstance(); -// HashMap info = getDBInfo(); -// conn = (Connection) DriverManager.getConnection(info.get("url"), info.get("user"), info.get("password")); -// } -// catch (ClassNotFoundException e) -// { -// logger.error("找不到驱动程序类 ,加载驱动失败!"); -// } -// catch (SQLException se) -// { -// logger.error("数据库连接失败!"); -// } -// catch (Exception e) -// { -// logger.error("数据库连接初始化错误!"); -// } -// return; -// } - - public static Connection getConnection() - { - if (null == conn) - { - try - { - conn=getDataSource().getConnection(); - } - catch (SQLException e) - { - e.printStackTrace(); - } - } - return conn; - } - - public static Statement getStatement(){ - if(null==stmt){ - try - { - stmt=getConnection().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_UPDATABLE); - } - catch (SQLException e) - { - e.printStackTrace(); - } - } - return stmt; - } - - public static Statement getNewStatement(){ - Statement watchedStmt=null; - try - { - watchedStmt=getConnection().createStatement(); - new StatementWatcher(watchedStmt).start(); - } - catch (SQLException e) - { - e.printStackTrace(); - } - return watchedStmt; - } - - public static DataSource getDataSource() - { - Jdbc3SimpleDataSource dataSource=new Jdbc3SimpleDataSource(); - - HashMap info=getDBInfo(); - dataSource.setUrl(info.get("url")); - dataSource.setUser(info.get("user")); - dataSource.setPassword(info.get("password")); - return dataSource; - } - - public static PostgreSQLBooleanPrefJDBCDataModel getPostgreSQLBooleanPrefJDBCDataModel(){ - return new PostgreSQLBooleanPrefJDBCDataModel(ConnectionFactory.getDataSource(), PREF_TABLE, PREF_TABLE_USERID, - PREF_TABLE_NEWSID,PREF_TABLE_TIME); - } - - public static MySQLJDBCDataModel getMySQLJDBCDataModel(){ - return new MySQLJDBCDataModel(ConnectionFactory.getDataSource(), "user_likes", "uid", - "nid", "likes", "recording_time"); - } - - private static HashMap getDBInfo() - { - HashMap info = null; - try - { - Properties p = new Properties(); - p.load(new FileInputStream(System.getProperty("user.dir") + "/res/dbconfig.properties")); - info = new HashMap(); - info.put("url", p.getProperty("url")); - info.put("user", p.getProperty("user")); - info.put("password", p.getProperty("password")); - } - catch (FileNotFoundException e) - { - logger.error("读取属性文件--->失败!- 原因:文件路径错误或者文件不存在"); - } - catch (IOException e) - { - logger.error("装载文件--->失败!"); - } - return info; - } - -} diff --git a/target/classes/META-INF/MANIFEST.MF b/target/classes/META-INF/MANIFEST.MF new file mode 100644 index 0000000..c84cb62 --- /dev/null +++ b/target/classes/META-INF/MANIFEST.MF @@ -0,0 +1,5 @@ +Manifest-Version: 1.0 +Built-By: qianxinyao +Build-Jdk: 1.8.0_77 +Created-By: Maven Integration for Eclipse + diff --git a/target/classes/META-INF/maven/top.tomqian/recommender-system/pom.properties b/target/classes/META-INF/maven/top.tomqian/recommender-system/pom.properties new file mode 100644 index 0000000..1f74d35 --- /dev/null +++ b/target/classes/META-INF/maven/top.tomqian/recommender-system/pom.properties @@ -0,0 +1,7 @@ +#Generated by Maven Integration for Eclipse +#Mon Dec 11 21:12:02 CST 2017 +version=0.0.1-SNAPSHOT +groupId=top.tomqian +m2e.projectName=Recommender System +m2e.projectLocation=/Users/hanbo/Desktop/\u8FB9\u57CE/work_space/Recommender System +artifactId=recommender-system diff --git a/target/classes/META-INF/maven/top.tomqian/recommender-system/pom.xml b/target/classes/META-INF/maven/top.tomqian/recommender-system/pom.xml new file mode 100644 index 0000000..e68a939 --- /dev/null +++ b/target/classes/META-INF/maven/top.tomqian/recommender-system/pom.xml @@ -0,0 +1,123 @@ + + 4.0.0 + top.tomqian + recommender-system + 0.0.1-SNAPSHOT + + src + + + src + + **/*.java + + + + + + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + + + + + + + com.jfinal + jfinal + 3.0 + + + + + + org.ansj + ansj_seg + 5.0.3 + + + + + com.mchange + c3p0 + 0.9.5.1 + + + + + + com.fasterxml.jackson.core + jackson-core + 2.5.3 + + + + + + log4j + log4j + 1.2.16 + + + + + + mysql + mysql-connector-java + 5.1.40 + + + + + + org.quartz-scheduler + quartz + 2.2.2 + + + + + + org.postgresql + postgresql + 42.1.1 + + + + + + org.apache.mahout + mahout-core + 0.9 + + + + + + org.apache.mahout + mahout-integration + 0.12.2 + + + + + + org.jsoup + jsoup + 1.8.3 + + + c3p0 + c3p0 + 0.9.1.1 + + + + + \ No newline at end of file diff --git a/target/classes/top/qianxinyao/Main/JobSetter.class b/target/classes/top/qianxinyao/Main/JobSetter.class new file mode 100644 index 0000000000000000000000000000000000000000..43bfaa59124673069ce8cd23f9e14c7ab76349a5 GIT binary patch literal 2814 zcmai0TUQfT6#fnb28K}(6sve?truc}QKYB@R6r3VpaOzYdpRVBFgVP_$%zJQTdlpf z+OE~7cD1XkPxiqV+qD#%uC6}!U-X6ct^c5QpGinU0EI>7%*o#SeEZw`+lN2@`}KDK zZTM0{3Bz{j#?7l1cT$!!&s}qfTaJ0gof;KV3Qt3Tp=Op}n0a<;RzxI2x$VYc z!eiJHcDOiMBPs~2oUsxNJHyW;h|;VPDG^CZaX!gCd4s4U-^R({cm=jG=yC4x zUe}qnVmfxh-0bb^^;~Dnvs6=#BppY1I$BY$KH3c&#t~Idp18uW zCyOVa-bygRaSa^|$BW=ZTt^B=PANp*5|ud!J*z-CsvsOiy9Uxgdr`OuZh0yJDCpgyczXK0|*3WncOOK->ue!!vLcO)rZ!|M!n zdGBt|Q-C>bpq zJWCxhso>JAO5z&Lf*GC|_L0%NpVX1U4Gr@Q`-{*l>->IK7AV@l+p2drQf(Lhd<5=^3`!i9eD@06kW7R;TGK*N>2kPGl~kR7lv)mYG{UCEBZgLF~6Xy z=k-xH=|x1Jr7pttxm&(PnbLJbm8Sm;=u%gAC#?dgfJT2r1ic06seUSJ*#h)mQ1g&p zN>EFm<^ESYQ0MQc5OjrR-AsBa$Flv8v8mXl!FMq-2H1=j$WWcXl|JcAR!)e@XzyHY z!veN9e1pmbynG+!3kVL?HZ7oKIE~gzkI~lD{0Oh6ag^2}weC!#i`K{0`ow+c9f2)@ zN9g_;HMM<@(Erdsr3)u$qz3#HT4)3U`{=YFVQL}_2e1bR>9>_;?;)~mBinYI#u1#Q znXXc8%V5jmCX@(ch$7dK$1quyP?W>8d!DlBA=?p*(rIJlsWQ%3T_CG*+S!Icb&rOL zr)Wk%17oz-a0&G6QS`o+xSqyM@_U!adM}MTwEU2kAEl9^<;S%ABu|`b3sv)0N&@evc_Quk*jU)eh`Pw3=Anurku^IqWta=j(uQuB-y@+IYW0sp^x7to zDr(vbyHER}=ozV1>R_H>I=e)=AN%dM!HKVks}$Pf32$ljNk%RfaKpiMhQ*QEJdSiC z&CXuxze#j&QD3^4(bdGBjDXmsFkAj5?%kv z;|zJ(Dp9i9@K}Bo4ptfFNAj{^+0vc1Fh(RUR#3Bx@8J&aQYS=Tga<}ESE=F3P$216 z|B%fCPa+~(`Hy-eNLwEyp?D^3(@M6;npKaqp>d+wrP;GBrmq}|aOkBlIyGpwPpQlX zaKB^f8y&__rnQi{YN%uu3qhSePV;HEiQ~(Mm>x~3WGUWJ0A?^tfhDRxN5GfpJ5Qd= zS@kWlSeR=0$^h2}So(#P_lLNh|ADnr)G}p&ZZb}-D`JVz>q8Z)xQF}XXY_ws>JR<_ DZ9&!g literal 0 HcmV?d00001 diff --git a/target/classes/top/qianxinyao/Main/TestDataProcessor.class b/target/classes/top/qianxinyao/Main/TestDataProcessor.class new file mode 100644 index 0000000000000000000000000000000000000000..68fd93cc25b83ff13dbdcbb5271bdc506c59dd1a GIT binary patch literal 4611 zcma)93wRV)75;Btv)K$JT_AKzm4G}F8W;kU!X~tZ1Te4(kE9^9kWMzkX2R~yGCND4 zShYS{i`7bVpxnTOlKnuxtf+ z0wo>#PF;)Wv9PwLwZjNG0tFE(95!qLf6%hSnjY6f?S{se3p%u*J5(*;sR>2QnCV z2owj+n9-PwwigoTDW5Yh3u;`TUgV-w#dvrK)@e5r0yBfJD^UzL zFUk}Ol$PI|g|*4C%~-fvM(f=R+m1}xGDQ?_J~y&Wj1TD8Mms? z(Mlgt-J!fN$Mds&)VAw(ld&Ud#6kwuV7RA-^dx#}!!`v(a2eE$iHb1V8T&Rf*5)Q{ zvj-h~ZnuqXGC2_yQLwY~7#Ts#$ObXc2k!E2S_jeBcvg9;v zsv?P<E#tgf#a_IRh1;n|lE#{C!*Z71MEXmX<$|@k6YrP$`vFPTkz~|^`xtMzH2jc? z`|)8?QjfFOgY4oLcY94lQCFFuNoDL9m+(pec$@o|Yz ziOZx!VhTP%sTd~8Q3_c^Ycx6&UK~cL2M-D4JEjxi26z~sR`D4eVVV7 zKz-dP38r2=ilYi1;}$wd>H3(%-nL~~k4dE)A|shWF8l-oO4<<*QbZ7A=q-*JH5Bv+ zj2&!G9x#}LZj{PI^r|@FHeW*D$+stQO2L=1wzV1CW(`Y6f66x~_@=;Q7ktccv?eRG-Ef*275ifVnUn@Q%)T8r!qzWO9D|w6 zhy%IM#yze|;Hs=0bm)f0BSmgR9ziB$nGD;8Xp=sHjj%azEZ>!6$<(wcOY6Zx4AE<8 z?dt4EHvL*kPqM5x*^x{D^B6jJPlEKO8P}*sskGeCI$hwSHU*axG@O!#GkR)iml2_% zWZ?TTE(aR)xO;|EaN2`Dp4ZYDDl^;4w%Jy+Od?4`OO$nT6EVtSgt+8}LY&3#6`T_& z8x>?`o{B%E5)|2r#?;?a=z$qTiNjcQSo1SZtzgg zHb~8uop@2jB`JztsT%wm(8GLPB!nt*WZUE$wk^*+vhV|%BI>24?I1n8gNdg^r&GhX zO;*wl87tfqLFr|m8*?N%dCsL1eyWg(@(|CvJb0k+Kl90_3jWG}g+9>(@8c*r%7+~I zcr9>;N-@rTBVF(;pP8odS5C~I)r|?mr;K-}sA&UC#FaEGW-cR*Tp`-}Qv1ysN4+mpiWfieCunf0;XKPI!Z3o9=TLqZsP z4Daa0otykh58m62dwln%@In7rUVIP8yCPmv*q_3|UL4-kjRyn8{$k%JCDu=!!eQUT z{;@syTn`?}JU=dHxFcWeMK>oLPd}#cSO6Kb;0tYWXdkiJMuch$J zQKtG3j*B`xj}v04`zxR8$xrz#e{X)2$lkpxl(3bFi%Bn;ymevF^MOWZHu zryMOJ>I3*0J*&iiAAU~HV`#k{zu@RtVqc73;#d5zUcnV##7q1FU(NP<5x?e)-w@+5 zcrKv~1qyzvfM5O#6{bSr?#kFF4SlU(WoF=76lL3|2iz+?@Ncui<2S{nf=?GPIqmfl z?t=Q7(>Mb{!SnojI(dm1837pM=fQ?qWm}4gw8>{2Ejcy5GY!Y^yUM($kh>{&R#OUp zJcYB3v!6j#FV2#Jf06w-D}`75B>vwwUT&MhKT`O27dzSgrMHsG6fW>wGpUQE%RxQX zlX|PL&izeOa2^v0ez)Y{76REq4cSV~XdxMICHZuct(7wj&Iq%-?X>7{sd7Dm6Si9@ zDP&tjE@?o8MT5v^@p9-XAPR7vg`1A)%*lCDrHR4I;^nx-qfT8UBi)>zy~MKR@RoYV M+(EGT^eYPg2U&;Zxc~qF literal 0 HcmV?d00001 diff --git a/target/classes/top/qianxinyao/UserBasedCollaborativeRecommender/MahoutUserBasedCollaborativeRecommender.class b/target/classes/top/qianxinyao/UserBasedCollaborativeRecommender/MahoutUserBasedCollaborativeRecommender.class new file mode 100644 index 0000000000000000000000000000000000000000..bb7c02606996dd1be64071e62c5aea565f27f595 GIT binary patch literal 6020 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 literal 0 HcmV?d00001 diff --git a/bin/top/qianxinyao/algorithms/JsonKit$1.class b/target/classes/top/qianxinyao/algorithms/JsonKit$1.class similarity index 100% rename from bin/top/qianxinyao/algorithms/JsonKit$1.class rename to target/classes/top/qianxinyao/algorithms/JsonKit$1.class diff --git a/bin/top/qianxinyao/algorithms/JsonKit$2.class b/target/classes/top/qianxinyao/algorithms/JsonKit$2.class similarity index 100% rename from bin/top/qianxinyao/algorithms/JsonKit$2.class rename to target/classes/top/qianxinyao/algorithms/JsonKit$2.class diff --git a/bin/top/qianxinyao/algorithms/JsonKit$3.class b/target/classes/top/qianxinyao/algorithms/JsonKit$3.class similarity index 100% rename from bin/top/qianxinyao/algorithms/JsonKit$3.class rename to target/classes/top/qianxinyao/algorithms/JsonKit$3.class diff --git a/target/classes/top/qianxinyao/algorithms/JsonKit.class b/target/classes/top/qianxinyao/algorithms/JsonKit.class new file mode 100644 index 0000000000000000000000000000000000000000..f69612823a661e71ba4e36f8a5f0b31ce8f95047 GIT binary patch literal 4047 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 R2IWf15@{LgU|31f>L+^ekTU=P literal 0 HcmV?d00001 diff --git a/target/classes/top/qianxinyao/algorithms/RecommendKit.class b/target/classes/top/qianxinyao/algorithms/RecommendKit.class new file mode 100644 index 0000000000000000000000000000000000000000..dfa6d4ec7c682001fdffcc00ae010ed4e2f9364d GIT binary patch literal 8887 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 literal 0 HcmV?d00001 diff --git a/target/classes/top/qianxinyao/contentbasedrecommend/CustomizedHashMap.class b/target/classes/top/qianxinyao/contentbasedrecommend/CustomizedHashMap.class new file mode 100644 index 0000000000000000000000000000000000000000..9a30b2fbb0b8541e49410a1ea2ee6ca31f1cf8ca GIT binary patch literal 2222 zcmbVNYgZdp6x}xooe+kW#*zRQEwok=9;u4862ww0HYI=>8io3rB)4H;G82*s7Q6aG z^bho_eo3va<#+v0KK7kVLV|R;7O>Xbd(XM&vG+OW=Fh)>{T;wO4m1P=Zn{o2bzmCy zW79q|oK(@VU1_@oqb^G|S#&BDX_rzfjk@bp%AXjH>w&!0vGp;LnGC2O)KS# z1%~RfW*Syr*6OBXKgfI}Anpqct~hqxHEcI;SPj|71k|4pIJaoprn@8%oJ!;cLMu*5 zMi9h#9T5x&T*#WX+-Ot^vbJRuEGZDpIza~fvZ3MX&qNa2QncBpz_^O3;ysV**j z=cmvUK>}~9et1VY=MEHf&DRUN~KsXE=$kpTxt+coMN zUP(A8JBsA2j&*Dhs61#G7Ms6^ns&N7VSK{0o;+11pXtb9izb$|%kHi>bQz_{>-ZdB z2=vz*g}UFVv8hbvlwyRj!z`bwIXqckcDia?b`l$>rS+P&-CEQKsqZ!Q6BQUe#X`-H z8lWIowtLPsiu-(h{GlH%I@P1qnp5E$vEO-`1af}Gz2H5%bmEM|%;^0&vuqn~qegVa zmqzGJ{aGV*9H>6p)nQ_fv{oDLvSpFE?!aUstsc!ms~3MalfCc-Cc0Se(RJbqL~>4} zR+OuzdTwL?dHd&7-39J0t}S%6fM3V_DYB)mnEnq%CmP=@mRJ22U<`dY$5rDgfH0*@ z1q1x*lq_=FyGG59k#L0sTh830542d{Y-a1l|SUg?os;)x@I7{7EUuF^6@*-2EoP2A1W;A4Rw z|M_D&8gF9l2lPibv(GT$c?eE7@oA{k!~@^gwr@546N8652y?^;CKf~-gBT%{QSQcw zcm(%xnIk)nJm36nT)}sk^q?kN$@@@)I3%=(gf<8ZU*aqB7e^9b;~RQaL|oxYu)ME` zXx;j@bIYK%K>2xu{=$%k84cHN#K-Bch!Sr}>H>J=)!`v`0iLxap_P*gMynDLPdvjS j&Uz`vTG#v(X@GquC%klybt;{fu0mY^HctUKe#q*-;TbCy literal 0 HcmV?d00001 diff --git a/target/classes/top/qianxinyao/contentbasedrecommend/MapValueComparator.class b/target/classes/top/qianxinyao/contentbasedrecommend/MapValueComparator.class new file mode 100644 index 0000000000000000000000000000000000000000..305336863a69f34b8d27f57add3715528df13839 GIT binary patch literal 1242 zcmbVLTW=CU6#j>Bw`zW7q3 z52nxlDC3#gZGpf8@nLq(eZKFUvw!~n`VHU}Yy&Zd*Sx)0cF&c*kbaj> zMBfuVcQg{RZ=dpUhYthMbVpBp^=e#=<3_ESN$A=y6IZBU=3ICHb zVK{F8C-6FhL9~bly-+K)XJCnB@tyR&X?>;9YB8kGoPp$ipmKwixhG++?n&E~gQ%9) z-?{GUOwo^Bhz&;v?~byepffy)PLGizA$lug7@2Ds8PEFg%|J6j53xX|*z- zSQ9yHGi1)(!0U!4TjvO=UhnVysml}W<*sfmq0$!FBR~Zq!^y4 zigbs*;*GC}Snds>cuE#Up+=R|>)CSU3i&FXOFUDL&Qqb*Xp4eU(vlTXD5FBUnsFXg I9Hr9#0MVQ{-2eap literal 0 HcmV?d00001 diff --git a/target/classes/top/qianxinyao/contentbasedrecommend/TFIDF.class b/target/classes/top/qianxinyao/contentbasedrecommend/TFIDF.class new file mode 100644 index 0000000000000000000000000000000000000000..5a17fd5fc35f6a4fa72d0d1629a7f7bc9fe90627 GIT binary patch literal 1296 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 QNscYQnLg8-!QUx3;+NC literal 0 HcmV?d00001 diff --git a/target/classes/top/qianxinyao/contentbasedrecommend/quartz/CBJob.class b/target/classes/top/qianxinyao/contentbasedrecommend/quartz/CBJob.class new file mode 100644 index 0000000000000000000000000000000000000000..8b13cb9b35a4949cfb76afccc9c12c39f3068bfc GIT binary patch literal 1114 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 Hd*J;I3Q28Z literal 0 HcmV?d00001 diff --git a/target/classes/top/qianxinyao/hotrecommend/quartz/HRJob.class b/target/classes/top/qianxinyao/hotrecommend/quartz/HRJob.class new file mode 100644 index 0000000000000000000000000000000000000000..7c20160017cb40043e6b09cb1ea36250a66205e0 GIT binary patch literal 742 zcma)4%TC)s6g`tTaqGANlJW?B@hpKw&4OL3ZX&9vvQmjg>?h7N401flWDJ47>Z+6l zAJC7gxMN5wkSHuX_jP>kopa~+pUW!%d)RW3W2hT73`UYC6PcWG6&xv}MWhA;k@SL5 z%C$KUS_fZL*M-9{d(2OG5c8xTeC-~K$hasnl$GvJv4mtOew2wcpBVD>?L!8qsd~ag z9wi?xo-xdXG7;@`&=tDFyRl%Xgev0kA=lEzw@Jqw$uYxD_|zF246c}nC^ba6UJvii zwVzd_N}4J$VqzM0HgA6tiJ_tF*u_hRl?VR$3-hpmB^Qe{*Z;<9DRVH@QD`4EEHljY zh3Tjv)!O289Llkwo7cC)Ox4uLIIy`!39s?i#T!!gZpFttD_;5iX>oF}ziEk>^k@zg_KD=z_A8dQ9f)+_%fu2o{EUl2v=M)8G8QH?l zPk2AFvQK9*OIGoMeE$Z3GG-{E7lb(?sgUnbRLy8wt@0 zAJzU4oHEltpnp`SZ|_n_ATv6hx!JvaUq1WZ=e>P@|MTZx02WX)FvM^z^qYJ~3GbEi z_Jq$HeoeZ3RjLdqQ_m5Y+fRYgl0m|!@6+;6e1+?otbOyazOa|G`A4Zih4dBWw} zD&*@Te7T}R3m0G$6?GXt^8Ikh6|I(5F`Uh0Pex#~cUn_9t^bD|D~|0l^-3_N7G^#%rN zO1P8~U)`fvi}At41B~ieOBPm9W-wcnV5}p=OzAB#yDs!%HQ2g^Z}5m(g21|L%cAff zdeI=FH=lVL8$P!1tv0m#3`0>=5%nV2({N8Le5VIcs#`VD_x-5%EG_8&g3K~D@L)*1>*lbho0X2FwVfviMBTtL4 zbQ;AtPLYJ1*%+-OB>OFWx^#f_=4+gNjd%BPC4H@fnGUk6e_&QC((@#ojb$Ayq(3Wb z>1@}y5G(QtvL>U21KcI3&u`Ao*@=C8l~3Bq13cK=$JZUK*vUi(Yj$$DgAF^`LFFju zJcR~aq&zRf#udu#D&{ebWz3*V^Xv&ScuM<^$YPs@(+&-!pULW1nm#(wdvP+@Br6cg qFL;LMl&XyyzNfz-LR-NP^fyeHw+ZJt60}~zPY}c@LzVo7;QR}7TlgXX literal 0 HcmV?d00001 diff --git a/target/classes/top/qianxinyao/model/News.class b/target/classes/top/qianxinyao/model/News.class new file mode 100644 index 0000000000000000000000000000000000000000..5fddcf3f54f9639f4a791cd95beb4e0cb2fa8071 GIT binary patch literal 541 zcmZutO-}+b6rA$SvWnm*deRekurculAyE@gD;Erj$FfwcSz26nQGb>(kwg>Y*&k(m zUAbs>lWqIv&Gb#@>-+5kzzKGX$S^b_Gv)V6=trfWgy9o2k^%3@hglIhhJ)1hP|PGh zqs8(VvLj&__PkWCrL-AJ9Y0W7MO~sdTLXsNIZblFP;ud+#8BuYeG9F+$fL^8Y_>e# zO!(c6(jwr~ARa5tg&(Q845e?v5x=y4+hr2ftf;_H^^}&qcrujXl^6z+q3#)91OpK& zTPL7{EGlFox>fW5r*GoWmlw*i%hvJHotO(c_tjX7C=LlfO@H5?EIR3&B!g}n`(!gq z;Zy9^E1fbZp-4ZCqUxAx`_3D$v literal 0 HcmV?d00001 diff --git a/target/classes/top/qianxinyao/model/Newslogs.class b/target/classes/top/qianxinyao/model/Newslogs.class new file mode 100644 index 0000000000000000000000000000000000000000..aa99893e34a758a1b054edfb4713576874842d9a GIT binary patch literal 565 zcmZuuO-lnY5Pj))w_9uLX9W>2(t0om-nR6hAPBXWO2K2gjWx2})a`E7pCy6?1@Y{U z5+`f-q75XInR##KW%Bj?_5t7oJ9(rSc0)bk_e%JW%6}4?kM&S`yel83o*qr}$S@o% zg$%@0@>4nzEJJ!IG{atJDL#QY4272KDPM(cqBNR)hRhjtwZKraVWYs1YsGmJTCtHu zg`v@Cc3eH?cQ?ux9-ny8Ncmj2p_<7+x;hy0OQYQ>5~*rPIfhC{`LY|02Qs)415Yy4 zI@%RpUj)kdanM2dX|#)LJ*lVGgM;8Lr3VF1u^uV~kJEIlBWY5zRQ*{ZSWpnp{wVRA z*h7#E%zWE>-!|Vr@1Fopu~$ZpVL$Tc{6PutNqNu0=QDpIT|SVHA!)HI!!imC-AvS2 zgp!}plY%qkC&Fhqv@YlZ)1|^>osg|h^8@T=3F8fGUtq6jypS`87QH2c0tPk`k4{A! gUC}v79W5R$vH71;O(^Cc09&i-+ew-o>?X4P3+|kXfdBvi literal 0 HcmV?d00001 diff --git a/target/classes/top/qianxinyao/model/Recommendations.class b/target/classes/top/qianxinyao/model/Recommendations.class new file mode 100644 index 0000000000000000000000000000000000000000..533aa139485ccb6c41170aa328c87c4336a14f3f GIT binary patch literal 607 zcmZ`$%Sr<=6g}y?)6v>mA9W{)w1Nh~T}u}VuBr3X@P-uI;(kko_v(fA`WX?#61BQ|d7X^k~JF45% zs*5bj42?#!OG^2}ozlYR6Mr^RnhP&fa~Y6_V8}15p;nPd6-&x7l)FmH%h`A!gKIJH zB}27qJmL36pllo^9i&kr5#ha>GB`am3p{zQEV>pGfAk>cf}z+`BQ3&NK#-ec*Z)0M zI~gA9)9SRaOFq){eGGMLhE6FIkf%ukC_1Ltj>-qv?E=mlR=&VqvGzjA6sol52nsk@ lk23Zudfg?R({8KTg9U1FN-?6ie*kPOyKhF%S_~lm!3) literal 0 HcmV?d00001 diff --git a/target/classes/top/qianxinyao/model/Users.class b/target/classes/top/qianxinyao/model/Users.class new file mode 100644 index 0000000000000000000000000000000000000000..678f7966fb6a341615519acc8522e4fe13c879f1 GIT binary patch literal 547 zcmZuuO-}+b5PjvFWfj3sh!^7pJlL3cgK&_<)9M8!@mQ9MCCe`E2hpEpOeE37c=ksb zr-h4Vo3zuJd2i-*`u+3%3E&*fA~FokIGFQCCHyDlKZ}6Rg0b}YZ6w2}h#bRlYJMal z$uHWD4z>ARtp(QHwef4N=xpPiB!|10z=hNzPwImBN^U^ktZ4IPT&e} zC_<%u6SR;;g+#;;Dq^q(K@z(1QfahhB%e;jLNJsEYT}DH2`SM}f8pP8bkjkrG4wh( zBBfdS0)~c`OScS4DAJ~8Hzxl*_MF0Q* literal 0 HcmV?d00001 diff --git a/target/classes/top/qianxinyao/model/_MappingKit.class b/target/classes/top/qianxinyao/model/_MappingKit.class new file mode 100644 index 0000000000000000000000000000000000000000..e335eeea155975cd50c43ae3c5f00ee8eac43b40 GIT binary patch literal 1005 zcmbVLO>fgc5Pg#-wVMVS+%~jG+3R3C0e%)2 zkT~!I_)&=2BvNxoLG&{7=Hq#0XU4yN|M&^u5$-$45jL~9FFtB%K5O$u#v+OX6^eHU zvftOH`%-5P@`Q3v4y6dC>55mKp7Jxo{8Mdo_KYxBtG5aHeI^z$hlLUfm?tc?v{8qH zsH2i&*$EZFYsJ0{+cMGCo;dT_2b~hOTmR~#NpPZZSA@s4mLEr=_g)(rihelgY9pkd z>7h!LA18r$J~G~njMt-hv)*=bi90pwQ|e-wkkf&KRl@qr+J~H0#AU2ISR*|6?|LOv zafMKnK`@ynp;v32PVy*Ac*M=WdiFz^rp@{}Uh86m;M%u_aW{2vov?A{J8g=KEyAKD z@C^(?#he>w-G`mcB+JE3UbdZj6e$zPOvi?)w+TBl%h{DoWxA*n3WHQ7Ou9p;&Lo}K zIG>tK`h|ufdZFzpmZuJU*KPz`;Lr1a0pu9*1+#S660C`Jq46E=*HO60 z(uRRD7Fm|Y39K)$wSbFQVvi*cksrnO8eZA+yp?aLylr?_8D1O1O@`ZJxWn+)7}gjz mEIh4O<%+;E*IPjatK4n{clkJJi;!^9K;`VstrB> literal 0 HcmV?d00001 diff --git a/target/classes/top/qianxinyao/model/base/BaseNews.class b/target/classes/top/qianxinyao/model/base/BaseNews.class new file mode 100644 index 0000000000000000000000000000000000000000..a6a21ad55c6833a9a1dd5fdb5ed5487052c9cb1b GIT binary patch literal 2418 zcma)+TT|0O9L3L;OG>%O#a8i-0#Xnn3V3Nn1x3+<4or>~BwY_wT=7zX8mlq#-46-L?1iPs*^qDC@|u^*wt>n)WqVKG{h%zv)c4J5MOnI0cGaPDWZ8Ch^fj-ahR)NKt4q?b1Uie# zQtqNa+eCg#pnaJJ8ML9h2O81>XG+SF>(#w&>1-O?rW6<~*=57rG92Z#YsGf=qdMTA zrPJq85Xd!K9PQU_@(KDEH`fY_H0d~y?&^-f&_rq1I5c$Auqt}Vwkn1ERvKA>l-kKa z;9L*RW0(`9UZ50KZ@7-4KGgrs_O2|ug?uSV&V=X>_4UUlS0&&YoXDU2=;2)H!Bt!% z4rK!45jf#)H69Ju1^Sw&DUjiemTk+G7M-$DP7GpPKr7cpgCU~Yh#YBrb*j}ee{nMk+KEegv#;b!zSudYFGI;M| z>nWdt&yLBT$b9EZ8+v%}^otpa!L~0zAI`AV-&7f3i$@KHc=zl!*gwT**W}>YsUOI_ zYglId54{|@&$rD5!kR6+Ad3sMX$;WCZ@~Z;aj7=I3VV4t84mCRm;Yeo8(U%Mfe>`2 z1=_0wo;NVs3OyDHoh5WG26`MfW1uIHZ-pN7p(js54=04ah3Qu4nMml%guW63eH*he z(06dR6?(>po;wLWk`Q_!D(QQX&|`!ikAc1)oAiUIr0+#1olgk;5QWyHi;>XNgr13k zUc}>=q@VbE&)YPiHC^Edu_$udgyyE$!kU9Al1Be%bs&BM`1i<^ZSqv>?Ydx<)fNDD;eqZgt5t1oSTZcad>+_Z3R z#pyQP0S;uS0S_FvS%*iWyNt&BkI5*C6MblLqfm>`0wbx7@qs`}!q&*jO%y>Kg`>7= z%2F>utzqn_tx;F)C>V{xcUkb0ebK<(cXQk}g(`0=Cbx6^5KfPwIWTQe#2P#LPFi|$ zI0Q=1;dyd;5{aI5&v?FwIt0gigCBBZo7W8vmXteX1=M61`@W=v_i*ol&f$w~Z>_5!N$FxZm!orAC%YqOK`s+ra+U z-0sGIReFA?T6A8;Wm5a`XG3$S!ytYm_!^C($BRcB#q14whJIw}2gSZ)5TrQTu)P?g zF^uDmfW~P8v&p`d1ZMbB&@@`hT?zI9^wFiME6Zn;`q*NdE9oJa)ceXFrg$} zhnrr2DE6EHH|S<3zz(b|-WUR$(d=)U`-YhtI^lwj4M1Bfj?a5u(DRL%Of)+^mBSK2)*tJy#nY}ALuOQe4t-aeh_-yhJJMsdTl7^0A4fU LeQeT}-EaQ`7|NH< literal 0 HcmV?d00001 diff --git a/target/classes/top/qianxinyao/model/base/BaseNewsmodules.class b/target/classes/top/qianxinyao/model/base/BaseNewsmodules.class new file mode 100644 index 0000000000000000000000000000000000000000..a67ed25dea0d42d6b31c49beb49f92a0b76bb440 GIT binary patch literal 1388 zcmb7@OK;Oa5Xb+UN8On8ku(XES1Gh152$h5>n#FBXYuKJJg{zml>&P?2 zWM2it-8AlDmnxvZUVO>EI_d(M)f9laRr z(CEu`C_YAWs*=rBFHv|ulT?F)4a&S3$QDA!sVs#ckNYGuOOT?oFu?;noF+J>D4$oQ z1ebX98~fjA7lqD5pw$Iv-x6v*!@(l-;Zo>4K^Ja-F5>wO&?S@?p$`M-%5~`7m7rsI NLB+=K5=X(T{R8R-HH`oO literal 0 HcmV?d00001 diff --git a/target/classes/top/qianxinyao/model/base/BaseRecommendations.class b/target/classes/top/qianxinyao/model/base/BaseRecommendations.class new file mode 100644 index 0000000000000000000000000000000000000000..1a8e88f2c52a0bf063e40e1981d8c23c5031200e GIT binary patch literal 2548 zcmbW3U31e$6o%h*J`{_5kc6br7TUBS#DPT60wr+>jY-qGIAMmQ=_Rwa7qdZ@Qdy?u zC-mQx8#>dAPOte<46h`A$hI_?UPQZl^qzB`Jw8X1x9|S>7r<>C8psH&`|g?bo0iTW z+Ib~itL|2nZIxw1Sp`0xsES*!E2k=b?K%wuqXNq`S*OpmBW>%7%Zc7g+3#_Uf!1@%G1s+CDzW?=aq2L;1z3!2D|IRKAp! zEuETGa-CW}cQSzmfsC%25cp&g7jcQ#re2^FS0DMFratEXxO}QAem++kruu|9AM*`! zldBeS&8_D8Uj{f=Ch-NnBo1W)D+xGpw-%3quLP!huPKn_jecn;uUMVHRRN>P{Zq}7 zj0d}*Hd!W#6p{K+{oV-FYg9YjN9thLR!0hfDaPJY9{cTB*Vzm0DmQ&?TYJ)1VU=$R zoU4Yar+z3iqf_M5Do)phVF?ru+bL34WZ-W5t{o%OkY``1YFSoZu$SUxE4Z%B4iAC0 z1SXz!Wb?5fpsivkGIT>N^!!Y1m4OEWv)zKX?3{^CU3Tr7>uLXay$`48_^PJ75a%H~ zq*Wi;mCr<`Sb#Wa+n>2Q#fnLLdD~(G#U9?4UBEnYn_flj>tLWSCVXr*f=jYHj&#kD ze$%7u&+UV)|1*<2LrqOIzaNr@AFcf85+`Pae`EZZPI2Xziq9-hyIcj=v9-TpzUF2G zlYEYcMw4Rj911Xv8J^DfSY~-*g)z@(5blWn8Lrv2xeM3dVDZ;(NHcsf#mv)T*u_ZL z3QHF(;8TX_Cdl$#l;AUb-b%1fuK>qnf;YJQAC~^&DGogwgEj}C14|V1>m=yqMCb)V zFQ!1Rq(Wayf?iIBzBDBCY7%rV5&ANrucSaDEy);QzLYRzEw=q#|(b(URP7AK$jm+Hl4 zdT4s?k81kv4`G32+z0QEbI=rdl`5hO}=73N(4O=iZL0 z=!_=IT<2DWQ8ZsTVibD|0g<9Kl_Y`UjAmr6s|VdyO*Iddnx-;J%SK(%jueyId(RlN zKJyNvoE+jJB}Umnjq~=UPBDx?`Eb8ffyzWjwe}i}=JWEYa;8X{qBkYk(3_>gQJgZ2 zBD^6IqiadJPK&rA{29r9@2X{T`1|7D*G|>CRVv6~Dh-HPU#ycGTuqlNoi7X@+Bmn9 zbcgN&2X2hk0&x6c9*;ox7^McU$!H2U`e3RjGVeet6C{O7tT9To;dQJzZgG3pFU}HdlsjK&GD{fipM3O}gbJ*hQ4hDvp53xEm`;u<@4OY=Pq0v1Yd=ykSO>7J_@lm z2BjJ6NPK5D1t>~EZ(X`8b;TTTj&5EA-ReXmui zZJ{o*Dd!cTb7ZWkMugV(&X^D$y9vi=VKqS;9YQZPmd}^7jQzFFN+t|bm+Nw@y{Ywg zF|2OQg0PkTm*bF-6kJ_;&dtI&+Z;Y2#8+>!L`iJ;B<%*DRBj-6v52ew~9q&fv${Z>9#Hc{fNr literal 0 HcmV?d00001 diff --git a/test_data.sql b/test_data.sql new file mode 100644 index 0000000..e4a2c6d --- /dev/null +++ b/test_data.sql @@ -0,0 +1,117 @@ +/* + Navicat Premium Data Transfer + + Source Server Type : MySQL + Source Server Version : 50635 + Source Database : recommender_system + + Target Server Type : MySQL + Target Server Version : 50635 + File Encoding : utf-8 + + Date: 12/11/2017 20:48:47 PM +*/ + +SET NAMES utf8; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for `news` +-- ---------------------------- +DROP TABLE IF EXISTS `news`; +CREATE TABLE `news` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `content` text, + `news_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `title` text NOT NULL, + `module_id` int(11) NOT NULL, + `url` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=332 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of `news` +-- ---------------------------- +BEGIN; +INSERT INTO `news` VALUES ('26', null, '2017-12-07 20:04:34', '习近平作出重要指示:纠正\"四风\"不能止步', '1', 'http://news.163.com/17/1211/12/D5CGPQLR000189FH.html'), ('27', null, '2017-12-07 20:04:34', '习近平同阿尔及利亚总统致贺电庆祝卫星发射成功', '1', 'http://news.163.com/17/1211/08/D5C2FSTS000189FH.html'), ('28', null, '2017-12-07 20:04:34', '新华社评论员:用好大数据 布局新时代', '1', 'http://news.163.com/17/1210/23/D5B44NBU000189FH.html'), ('29', null, '2017-12-07 20:04:34', '\"党建+\"为老百姓加出了什么', '1', 'http://news.163.com/17/1210/17/D5AI6OS5000189FH.html'), ('30', null, '2017-12-07 20:04:34', '国际政要赞环境治理中国贡献', '1', 'http://news.163.com/17/1208/21/D55OUO9J000189FH.html'), ('31', null, '2017-12-07 20:04:34', '网络素养标评体系发布', '1', 'http://news.163.com/17/1209/18/D5824N29000189FH.html'), ('32', null, '2017-12-07 20:04:34', '最高检对重庆市委原书记孙政才立案侦查', '1', 'http://news.163.com/17/1211/11/D5CDHQ960001899O.html'), ('33', null, '2017-12-07 20:04:34', '两办发公务用车新规:新能源轿车价格不得超18万', '1', 'http://news.163.com/17/1211/18/D5D5E91M0001899O.html'), ('34', null, '2017-12-07 20:04:34', '澳总理宣称澳洲\"站起来了\" 中方:有损自身形象', '1', 'http://news.163.com/17/1211/16/D5CVPPIE0001899N.html'), ('35', null, '2017-12-07 20:04:34', '北京日报:北京市居民煤改清洁能源成效显著', '1', 'http://news.163.com/17/1211/08/D5C41S6Q000189FH.html'), ('36', null, '2017-12-07 20:04:34', '普京突访俄在叙空军基地 下令从叙利亚撤军', '1', 'http://news.163.com/17/1211/18/D5D5LMEL0001875O.html'), ('37', null, '2017-12-07 20:04:34', '这位市委书记给省委书记送5吨礼 获刑6年', '1', 'http://news.163.com/17/1211/18/D5D61GS90001875P.html'), ('38', null, '2017-12-07 20:04:34', '深圳地铁隧道为何1个半月内被击穿2次?地铁方回应', '1', 'http://news.163.com/17/1211/15/D5CSDDFT0001899N.html'), ('39', null, '2017-12-07 20:04:34', '外交部:中美需要相互适应 美国无法左右中国', '1', 'http://news.163.com/17/1211/16/D5CVCKBN000187V9.html'), ('40', null, '2017-12-07 20:04:34', '台民众向蔡英文丢鞋被罚钱 向马英九丢鞋却判无罪', '1', 'http://news.163.com/17/1211/16/D5CVL2BA00018AOR.html'), ('41', null, '2017-12-07 20:04:34', '13岁弑母少年:曾获优秀班干 会帮干活常遭父母打', '1', 'http://news.163.com/17/1211/07/D5C29O860001899N.html'), ('42', null, '2017-12-07 20:04:34', '\"教科书式耍赖\"事件肇事者被解除拘留后不知去向', '1', 'http://news.163.com/17/1211/12/D5CIAVF00001875P.html'), ('43', null, '2017-12-07 20:04:34', '习近平作出重要指示:纠正\"四风\"不能止步', '1', 'http://news.163.com/17/1211/12/D5CGPQLR000189FH.html'), ('44', null, '2017-12-07 20:04:34', '习近平同阿尔及利亚总统致贺电庆祝卫星发射成功', '1', 'http://news.163.com/17/1211/08/D5C2FSTS000189FH.html'), ('45', null, '2017-12-07 20:04:34', '新华社评论员:用好大数据 布局新时代', '1', 'http://news.163.com/17/1210/23/D5B44NBU000189FH.html'), ('46', null, '2017-12-07 20:04:34', '\"党建+\"为老百姓加出了什么', '1', 'http://news.163.com/17/1210/17/D5AI6OS5000189FH.html'), ('47', null, '2017-12-07 20:04:34', '国际政要赞环境治理中国贡献', '1', 'http://news.163.com/17/1208/21/D55OUO9J000189FH.html'), ('48', null, '2017-12-07 20:04:34', '网络素养标评体系发布', '1', 'http://news.163.com/17/1209/18/D5824N29000189FH.html'), ('49', null, '2017-12-07 20:04:34', '最高检对重庆市委原书记孙政才立案侦查', '1', 'http://news.163.com/17/1211/11/D5CDHQ960001899O.html'), ('50', null, '2017-12-07 20:04:34', '两办发公务用车新规:新能源轿车价格不得超18万', '1', 'http://news.163.com/17/1211/18/D5D5E91M0001899O.html'), ('51', null, '2017-12-07 20:04:34', '澳总理宣称澳洲\"站起来了\" 中方:有损自身形象', '1', 'http://news.163.com/17/1211/16/D5CVPPIE0001899N.html'), ('52', null, '2017-12-07 20:04:34', '北京日报:北京市居民煤改清洁能源成效显著', '1', 'http://news.163.com/17/1211/08/D5C41S6Q000189FH.html'), ('53', null, '2017-12-07 20:04:34', '普京突访俄在叙空军基地 下令从叙利亚撤军', '1', 'http://news.163.com/17/1211/18/D5D5LMEL0001875O.html'), ('54', null, '2017-12-07 20:04:34', '这位市委书记给省委书记送5吨礼 获刑6年', '1', 'http://news.163.com/17/1211/18/D5D61GS90001875P.html'), ('55', null, '2017-12-07 20:04:34', '深圳地铁隧道为何1个半月内被击穿2次?地铁方回应', '1', 'http://news.163.com/17/1211/15/D5CSDDFT0001899N.html'), ('56', null, '2017-12-07 20:04:34', '外交部:中美需要相互适应 美国无法左右中国', '1', 'http://news.163.com/17/1211/16/D5CVCKBN000187V9.html'), ('57', null, '2017-12-07 20:04:34', '台民众向蔡英文丢鞋被罚钱 向马英九丢鞋却判无罪', '1', 'http://news.163.com/17/1211/16/D5CVL2BA00018AOR.html'), ('58', null, '2017-12-07 20:04:34', '13岁弑母少年:曾获优秀班干 会帮干活常遭父母打', '1', 'http://news.163.com/17/1211/07/D5C29O860001899N.html'), ('59', null, '2017-12-07 20:04:34', '\"教科书式耍赖\"事件肇事者被解除拘留后不知去向', '1', 'http://news.163.com/17/1211/12/D5CIAVF00001875P.html'), ('60', null, '2017-12-07 20:04:34', '看完复联3预告片,为什么都在骂漫威?', '1', 'http://news.163.com/17/1205/00/D4ROJPDF0001885B.html'), ('61', null, '2017-12-07 20:04:34', '看完复联3预告片,为什么都在骂漫威?', '1', 'http://news.163.com/17/1205/00/D4ROJPDF0001885B.html'), ('62', null, '2017-12-07 20:04:34', 'AI人才需求集中于一线城市 七成从业者月薪过万', '2', 'http://tech.163.com/17/1211/07/D5BVCLI600097U7R.html'), ('63', null, '2017-12-07 20:04:34', '范冰冰力挺王源否认整容说法:从小到大都这么可爱', '3', 'http://ent.163.com/17/1211/01/D5BBPJPQ00038FO9.html'), ('64', null, '2017-12-07 20:04:34', '冻哭人比美大赛 范冰冰比杨幂Baby还生猛', '4', 'http://fashion.163.com/17/1211/08/D5C2E3JH002680FG.html'), ('65', null, '2017-12-07 20:04:34', '中俄今天再搞“反导演习” 应对突发挑衅攻击', '5', 'http://war.163.com/17/1211/12/D5CI9CBL000181KT.html'), ('66', null, '2017-12-07 20:04:34', '美对台政策将触碰一中底线?中国公使敲山震虎', '5', 'http://war.163.com/17/1211/10/D5CBN5O9000181KT.html'), ('67', null, '2017-12-07 20:04:34', '双座型枭龙02架成功首飞 巴方飞行员首次参与', '5', 'http://war.163.com/17/1211/10/D5CBHIDH000181KT.html'), ('68', null, '2017-12-07 20:04:34', '美媒:俄托卡列夫手枪结构简单性能可靠 曾销多国', '5', 'http://war.163.com/17/1211/10/D5CBEE8J000181KT.html'), ('69', null, '2017-12-07 20:04:34', '外媒研究报告称:中俄军事实力上升令美国丧失优势', '5', 'http://war.163.com/17/1211/10/D5CB538J000181KT.html'), ('70', null, '2017-12-07 20:04:34', '印度国产航母或于2020年入役 最后期限仍将拖延', '5', 'http://war.163.com/17/1211/10/D5CAMS42000181KT.html'), ('71', null, '2017-12-07 20:04:34', '卡塔尔签80亿美元合约 向英国购24架台风战机', '5', 'http://war.163.com/17/1211/10/D5CA83KD000181KT.html'), ('72', null, '2017-12-07 20:04:34', '俄国防部职责美军F22战机干扰俄军机空袭IS根据地', '5', 'http://war.163.com/17/1211/10/D5CA7KVA000181KT.html'), ('73', null, '2017-12-07 20:04:34', '美国第二艘DDG1000驱逐舰首次海试出现故障', '5', 'http://war.163.com/17/1211/10/D5CA4M0D000181KT.html'), ('74', null, '2017-12-07 20:04:34', '突破遏制线!港媒称中国空军南海巡航显强大战力', '5', 'http://war.163.com/17/1211/10/D5CA3C0L000181KT.html'), ('75', null, '2017-12-07 20:04:34', '日本乘客飞机上耍酒疯袭空姐 日网友:脸都丢尽了', '1', 'http://news.163.com/air/17/1211/09/D5C8T123000181O6.html'), ('76', null, '2017-12-07 20:04:34', '英媒:中国游客至关重要 直航或增至每周150班次', '1', 'http://news.163.com/air/17/1211/15/D5CTNFMM000181O6.html'), ('77', null, '2017-12-07 20:04:34', '可识别人声发现幸存者 日本研发新型救援无人机', '1', 'http://news.163.com/air/17/1211/13/D5CLDJII000181O6.html'), ('78', null, '2017-12-07 20:04:34', '国际航协:航空货运第四季度开局强劲', '1', 'http://news.163.com/air/17/1211/12/D5CG5AD2000181O6.html'), ('79', null, '2017-12-07 20:04:34', '美国调查人员说将公布佛州坠机事故调查报告', '1', 'http://news.163.com/air/17/1211/18/D5D4RCFQ000181O6.html'), ('80', null, '2017-12-07 20:04:34', '欧冠1/8决赛对阵:皇马将战巴黎 巴萨再遇切尔西', '6', 'http://sports.163.com/17/1211/19/D5D990SA00058781.html'), ('81', null, '2017-12-07 20:04:34', '欧冠赔率-曼城拜仁大热 巴黎降温巴萨皇马优势不再', '6', 'http://sports.163.com/17/1211/19/D5DAUQDO00058781.html'), ('82', null, '2017-12-07 20:04:34', '东亚杯-中国女足连失良机 0-1不敌日本吞两连败', '6', 'http://sports.163.com/17/1211/19/D5DAMPFP00058780.html'), ('83', null, '2017-12-07 20:04:34', '女足梅西以一敌四单挑日本防线 离进球只差5公分', '6', 'http://sports.163.com/17/1211/18/D5D81FJD00058780.html'), ('84', null, '2017-12-07 20:04:34', '日本女足1脚直塞破中国整条防线 美女国门也无奈', '6', 'http://sports.163.com/17/1211/18/D5D68RS800058780.html'), ('85', null, '2017-12-07 20:04:34', '曝小牛高层愿本赛季签丁彦雨航 或先送短合同', '6', 'http://sports.163.com/17/1211/14/D5CP72CV0005877U.html'), ('86', null, '2017-12-07 20:04:34', '提速-降速-再提速!梅西犯罪式破门 留下车祸现场', '6', 'http://sports.163.com/17/1211/08/D5C4HB3K00058781.html'), ('87', null, '2017-12-07 20:04:34', '贵州恒丰宣布国安后卫赵和靖加盟 合同为期三年', '6', 'http://sports.163.com/17/1211/15/D5CQFFSA00058780.html'), ('88', null, '2017-12-07 20:04:34', '尴尬!比斯利10分钟犯满仅1分 主队球迷鼓掌致谢', '6', 'http://sports.163.com/17/1211/11/D5CEOV6V0005877U.html'), ('89', null, '2017-12-07 20:04:34', '不擅应付媒体的哈登又被不会聊天的媒体问懵了…', '6', 'http://sports.163.com/17/1211/13/D5CJH0A20005877U.html'), ('90', null, '2017-12-07 20:04:34', '这…梅西全家福被PS后放上国产剧 网友1秒看穿!', '6', 'http://sports.163.com/17/1211/13/D5CLF9ER00058781.html'), ('91', null, '2017-12-07 20:04:34', '皇马全主力冲击世俱杯 拉莫斯:5-0之后更有动力了', '6', 'http://sports.163.com/17/1211/18/D5D55GEM00058781.html'), ('92', null, '2017-12-07 20:04:34', '费德勒要领奖却遭孩子反问:纳达尔不才是世界第1?', '6', 'http://sports.163.com/17/1211/14/D5CN8A9900058782.html'), ('93', null, '2017-12-07 20:04:34', 'GIF-\"泰森咬耳战\"血腥重演!英拳手耳朵险被对手打掉', '6', 'http://sports.163.com/17/1211/14/D5COGJ0U00058782.html'), ('94', null, '2017-12-07 20:04:34', '女足3打2机会被挥霍 这球带啥啊!早传出来就有了', '6', 'http://sports.163.com/17/1211/18/D5D7QH4T00058780.html'), ('95', null, '2017-12-07 20:04:34', '女足东亚杯-金润美甩头破门 朝鲜1-0韩国夺2连胜', '6', 'http://sports.163.com/17/1211/17/D5D1B9O900058780.html'), ('96', null, '2017-12-07 20:04:34', '别庆祝了!穆帅怒闯曼城更衣室 被门神泼一脸牛奶', '6', 'http://sports.163.com/17/1211/07/D5C1AB4I00058781.html'), ('97', null, '2017-12-07 20:04:34', '赵和靖不投死敌不回老家 与曼萨诺助力黑马保级', '6', 'http://sports.163.com/17/1211/16/D5CUPUM800058780.html'), ('98', null, '2017-12-07 20:04:34', '力帆宣布前葡萄牙主帅执掌球队 率队征战2018赛季', '6', 'http://sports.163.com/17/1211/14/D5CP1PCO00058780.html'), ('99', null, '2017-12-07 20:04:34', '久违了!朗多狂送18助攻 一条龙单手劈扣梦回当年', '6', 'http://sports.163.com/17/1211/10/D5CBI3TR0005877U.html'), ('100', null, '2017-12-07 20:04:34', '曝小牛高层愿等待丁彦雨航加盟 或可先签短合同', '6', 'http://sports.163.com/17/1211/14/D5CP72CV0005877U.html'), ('101', null, '2017-12-07 20:04:34', '不擅应付媒体的哈登又被不会聊天的媒体问懵了…', '6', 'http://sports.163.com/17/1211/13/D5CJH0A20005877U.html'), ('102', null, '2017-12-07 20:04:34', '考辛斯23+9又陷犯规麻烦 被迫坐板凳气得想爆炸', '6', 'http://sports.163.com/17/1211/10/D5CBSLQ00005877U.html'), ('103', null, '2017-12-07 20:04:34', '生涯高光!奥拉迪波轰47+7+6 今夜他似雷吉-米勒', '6', 'http://sports.163.com/17/1211/08/D5C5NU2M0005877U.html'), ('104', null, '2017-12-07 20:04:34', '曝小牛高层愿等待丁彦雨航加盟 或可先签短合同', '6', 'http://sports.163.com/17/1211/14/D5CP72CV0005877U.html'), ('105', null, '2017-12-07 20:04:34', 'CBA第5周球队实力榜:山东超辽宁领跑 广厦压粤疆', '6', 'http://sports.163.com/17/1211/10/D5CAGIR10005877V.html'), ('106', null, '2017-12-07 20:04:34', 'CBA第5周最佳:丁神再领跑国内 辫子哥力压众外援', '6', 'http://sports.163.com/17/1211/10/D5CA9VGH0005877V.html'), ('107', null, '2017-12-07 20:04:34', 'GIF-26分优势快被追没了 丁神被换怒了!疯砸水瓶', '6', 'http://sports.163.com/17/1210/21/D5ATA4O70005877V.html'), ('108', null, '2017-12-07 20:04:34', '李根回应挥拳怒吼裁判被驱逐出场 看看他怎样说', '6', 'http://sports.163.com/17/1211/16/D5D05JRU0005877V.html'), ('109', null, '2017-12-07 20:04:34', '韩德君末节登场就得分,命中率100%,可惜上晚了', '6', 'http://sports.163.com/17/1211/11/D5CFOQU30005877V.html'), ('110', null, '2017-12-07 20:04:34', '欧冠1/8决赛对阵:皇马将战巴黎 巴萨再遇切尔西', '6', 'http://sports.163.com/17/1211/19/D5D990SA00058781.html'), ('111', null, '2017-12-07 20:04:34', '欧冠赔率-曼城拜仁大热 巴黎降温巴萨皇马优势不再', '6', 'http://sports.163.com/17/1211/19/D5DAUQDO00058781.html'), ('112', null, '2017-12-07 20:04:34', '阿根廷世纪初最强前锋 伊斯坦布尔留终生遗憾 自曝曾参加性爱派对', '6', 'http://sports.163.com/17/1211/07/D5BV884C00058781.html'), ('113', null, '2017-12-07 20:04:34', '英超-拉师傅扳平铁闸反杀 曼城2-1曼联11分领跑', '6', 'http://sports.163.com/17/1211/02/D5BFAP4L00058781.html'), ('114', null, '2017-12-07 20:04:34', '巴萨高管:梅西每周都很伟大 小马哥去留最近出结果', '6', 'http://sports.163.com/17/1211/16/D5CVFT5L00058781.html'), ('115', null, '2017-12-07 20:04:34', '全世界赢穆里尼奥最多的男人 他已是狂人一生梦魇', '6', 'http://sports.163.com/17/1211/09/D5C700RS00058781.html'), ('116', null, '2017-12-07 20:04:34', '女足梅西以一敌四单挑日本防线 离进球只差5公分', '6', 'http://sports.163.com/17/1211/18/D5D81FJD00058780.html'), ('117', null, '2017-12-07 20:04:34', '女足3打2机会被挥霍 这球带啥啊!早传出来就有了', '6', 'http://sports.163.com/17/1211/18/D5D7QH4T00058780.html'), ('118', null, '2017-12-07 20:04:34', '日本女足1脚直塞破中国整条防线 美女国门也无奈', '6', 'http://sports.163.com/17/1211/18/D5D68RS800058780.html'), ('119', null, '2017-12-07 20:04:34', '95小将确定告别国安将赴恒大 卡纳瓦罗成重要因素', '6', 'http://sports.163.com/17/1211/11/D5CCOLC700058780.html'), ('120', null, '2017-12-07 20:04:34', '女足东亚杯-金润美甩头破门 朝鲜1-0韩国夺2连胜', '6', 'http://sports.163.com/17/1211/17/D5D1B9O900058780.html'), ('121', null, '2017-12-07 20:04:34', '韦世豪:捂耳朵是不想听谩骂声 对日本争取再破门', '6', 'http://sports.163.com/17/1211/13/D5CL1BQC00058780.html'), ('122', null, '2017-12-07 20:04:34', '吃高蛋白食物竟然变胖? 或犯了4个错误', '6', 'http://sports.163.com/17/1211/11/D5CCP5TV00058783.html'), ('123', null, '2017-12-07 20:04:34', '新技能! 跑步变柔和受伤风险降6成', '6', 'http://sports.163.com/17/1211/11/D5CCMO2T00058783.html'), ('124', null, '2017-12-07 20:04:34', '广州马拉松收官 奔跑中国之路永不止步', '6', 'http://sports.163.com/17/1211/10/D5C9VFDB00058783.html'), ('125', null, '2017-12-07 20:04:34', '儋州马拉松发布会召开 12月24日起跑', '6', 'http://sports.163.com/17/1208/13/D54TSGHJ00058783.html'), ('126', null, '2017-12-07 20:04:34', '节食减肥成功率仅5% 结合运动才是正道', '6', 'http://sports.163.com/17/1206/21/D50JCKD000058783.html'), ('127', null, '2017-12-07 20:04:34', '晒证据!袁立转发文章 指责节目组胡乱剪辑镜头', '3', 'http://ent.163.com/17/1211/16/D5D0QVAA00038FO9.html'), ('128', null, '2017-12-07 20:04:34', '袁立自曝微博视频被删 怒斥浙江卫视:胆大包天', '3', 'http://ent.163.com/17/1211/17/D5D33D8A00038FO9.html'), ('129', null, '2017-12-07 20:04:34', '浙江台辞退员工 袁立:让\"临时工\"顶包低级又拙劣', '3', 'http://ent.163.com/17/1211/14/D5CPUVRA00038FO9.html'), ('130', null, '2017-12-07 20:04:34', '何洁被曝新恋情 与知名乐手\"共宿\"还一起带娃', '3', 'http://ent.163.com/17/1211/08/D5C58JO900038FO9.html'), ('131', null, '2017-12-07 20:04:34', '和何洁传恋情的知名乐手被扒:已婚有一子', '3', 'http://ent.163.com/17/1211/12/D5CGEJE600038FO9.html'), ('132', null, '2017-12-07 20:04:34', '昆凌躺在花堆中露铅笔腿 粉丝却感觉不吉利', '3', 'http://ent.163.com/17/1211/16/D5CVULR900038FO9.html'), ('133', null, '2017-12-07 20:04:34', '揭秘塞班“岛主”吴佩慈男友产业 赌场里开电影节全是大胸妹', '3', 'http://ent.163.com/17/1211/18/D5D4OV2100039867.html'), ('134', null, '2017-12-07 20:04:34', '大V评论\"袁立怼节目组\":做慈善不是万能道德牌坊', '3', 'http://ent.163.com/17/1211/13/D5CM4I0S00038FO9.html'), ('135', null, '2017-12-07 20:04:34', '袁立再斥节目组:恶意剪辑 消费我和张国立绯闻', '3', 'http://ent.163.com/17/1211/09/D5C6IGII00038FO9.html'), ('136', null, '2017-12-07 20:04:34', 'Angelababy谈演员社会价值:要贡献精神食粮', '3', 'http://ent.163.com/17/1211/19/D5DAL6NG00038FO9.html'), ('137', null, '2017-12-07 20:04:34', '陈法拉前夫薛世恒上节目追马苏?夹娃娃讨女方欢心', '3', 'http://ent.163.com/17/1211/15/D5CQTP4M00038FO9.html'), ('138', null, '2017-12-07 20:04:34', '林允:陈柏霖比\"假如王子睡着了\"中的角色更man', '3', 'http://ent.163.com/17/1211/14/D5COE0AF000380D0.html'), ('139', null, '2017-12-07 20:04:34', '吴佩慈时隔一年发微博 罕见晒与准婆婆合影', '3', 'http://ent.163.com/17/1211/11/D5CEGEHR00038FO9.html'), ('140', null, '2017-12-07 20:04:34', '刘若英冻伤鼻头红一大片 粉丝打趣:照片不修吗?', '3', 'http://ent.163.com/17/1211/19/D5DAGI2R00038FO9.html'), ('141', null, '2017-12-07 20:04:34', '刘在石当选韩国最佳搞笑艺人 连续六年蝉联冠军', '3', 'http://ent.163.com/17/1211/16/D5D0BAMQ00038FO9.html'), ('142', null, '2017-12-07 20:04:34', '大器晚成?刘敏涛:谢谢认可 希望可以一直演下去', '3', 'http://ent.163.com/17/1211/15/D5CRBJBT00038FO9.html'), ('143', null, '2017-12-07 20:04:34', '周杰伦在某社交媒体晒照:我是一个多么年轻的人', '3', 'http://ent.163.com/17/1211/14/D5CPCFG300038FO9.html'), ('144', null, '2017-12-07 20:04:34', '《摔跤吧,爸爸》童星飞机上遇变态!呼救没人理', '3', 'http://ent.163.com/17/1211/19/D5DAJ4DE00038FO9.html'), ('145', null, '2017-12-07 20:04:34', '性骚扰DJ称已赔偿1美元给霉霉 还称硬币有深意', '3', 'http://ent.163.com/17/1211/16/D5CTU1VP00038FO9.html'), ('146', null, '2017-12-07 20:04:34', '白百何装扮随意逛地摊 竟是购烟丝卷烟纸', '3', 'http://ent.163.com/17/1211/11/D5CF3UPP00038FO9.html'), ('147', null, '2017-12-07 20:04:34', '众多美女齐聚 郭涛一屁股坐过来互加微信', '3', 'http://ent.163.com/17/1211/09/D5C7FTVO00038FO9.html'), ('148', null, '2017-12-07 20:04:34', '《红蔷薇》定档12.16 演绎菜鸟女特工成长史', '3', 'http://ent.163.com/17/1211/13/D5CLESEA000380F1.html'), ('149', null, '2017-12-07 20:04:34', '揭秘《不可思议的妈妈》如何成为实用育儿节目?', '3', 'http://ent.163.com/17/1211/16/D5CUH3H7000380EN.html'), ('150', null, '2017-12-07 20:04:34', '《猎场》研讨会专家点赞:主流价值观的正确示范', '3', 'http://ent.163.com/17/1211/15/D5CQMINO000380EN.html'), ('151', null, '2017-12-07 20:04:34', '职场偶像剧《特化师》热播 陈真逐梦成长', '3', 'http://ent.163.com/17/1211/15/D5CQEDKR000380EN.html'), ('152', null, '2017-12-07 20:04:34', '《爱情找对门》准婆婆逆袭大数据 妈宝男被手撕', '3', 'http://ent.163.com/17/1211/14/D5CPJ1IE00037VVV.html'), ('153', null, '2017-12-07 20:04:34', '《青春旅社》AB栋集体外出学习焕发新面貌', '3', 'http://ent.163.com/17/1211/14/D5CPCLLI00037VVV.html'), ('154', null, '2017-12-07 20:04:34', '蓄须近两百日!张晓晨《凰权·弈天下》压轴杀青', '3', 'http://ent.163.com/17/1211/14/D5CPA07H000380EN.html'), ('155', null, '2017-12-07 20:04:34', '《梦想的声音2》京剧大师王珮瑜唱流行歌比耶卖萌', '3', 'http://ent.163.com/17/1211/14/D5CP7C1800037VVV.html'), ('156', null, '2017-12-07 20:04:34', '何洁被曝新恋情 与知名歌手\"共宿\"还一起带娃', '3', 'http://ent.163.com/17/1211/08/D5C58JO900038FO9.html'), ('157', null, '2017-12-07 20:04:34', '韩男歌手经纪人自杀后又遇社长轻生 泪崩哀悼', '3', 'http://ent.163.com/17/1211/02/D5BFM2LC00038FO9.html'), ('158', null, '2017-12-07 20:04:34', '脏辫儿到底怎么洗?TT崩溃:别再问我了', '3', 'http://ent.163.com/17/1211/02/D5BE7H0300038FO9.html'), ('159', null, '2017-12-07 20:04:34', '群星演唱会在海南上演 陈小春田馥甄领衔开唱', '3', 'http://ent.163.com/17/1211/00/D5B9JAIA00038FO9.html'), ('160', null, '2017-12-07 20:04:34', '央行:11月新增人民币贷款1.1万亿 M2同比增长9.1%', '7', 'http://money.163.com/17/1211/17/D5D1AAUC002581PP.html'), ('161', null, '2017-12-07 20:04:34', '周小川:做好防范金融风险工作的主动性和针对性', '7', 'http://money.163.com/17/1211/17/D5D3QTES002580S6.html'), ('162', null, '2017-12-07 20:04:34', '监管下发网络小贷业务风险专项整治方案', '7', 'http://money.163.com/17/1211/19/D5DA9DG70025816E.html'), ('163', null, '2017-12-07 20:04:34', '清流|莎普爱思成长路:合作《养生堂》营收暴增', '7', 'http://money.163.com/17/1211/11/D5CDLF9U002590RK.html'), ('164', null, '2017-12-07 20:04:34', '李兆会被限制出境背后:荒废祖业玩资本 炒股赚40亿', '7', 'http://money.163.com/17/1211/01/D5BD3HIR002580S6.html'), ('165', null, '2017-12-07 20:04:34', '李稻葵:中国未来的发展怕的不是慢 而是这个字', '7', 'http://money.163.com/17/1211/17/D5D3B7C700258J1R.html'), ('166', null, '2017-12-07 20:04:34', '曹德旺:及早卖掉多余房子 以后卖不掉也租不出去', '7', 'http://money.163.com/17/1211/16/D5D0IQ39002580SJ.html'), ('167', null, '2017-12-07 20:04:34', '养老保险基金方案将出台:4.4万亿中的30%用于投资', '7', 'http://money.163.com/17/1211/15/D5CRGK99002581PP.html'), ('168', null, '2017-12-07 20:04:34', '重上3300点 今年A股人均赚了两万三 慢牛来了?', '7', 'http://money.163.com/17/1211/14/D5COIEJE00258169.html'), ('169', null, '2017-12-07 20:04:34', '基金称趁调整换思路布局 年末四行业频抛橄榄枝', '7', 'http://money.163.com/17/1211/07/D5C05KP3002580S6.html'), ('170', null, '2017-12-07 20:04:34', '5G发展迈上新台阶 机构密集探访21家公司', '7', 'http://money.163.com/17/1211/00/D5B7V5B9002580S6.html'), ('171', null, '2017-12-07 20:04:34', '新干线也没放过!日本制造业丑闻集中大爆发', '7', 'http://money.163.com/17/1211/15/D5CRIJBB002581PQ.html'), ('172', null, '2017-12-07 20:04:34', '曹德旺:叫马云来做玻璃都不行 我不喜欢赚快钱', '7', 'http://money.163.com/17/1211/16/D5D15GHR002580T4.html'), ('173', null, '2017-12-07 20:04:34', '资管新规延长过渡期?接近监管人士:一切未定', '7', 'http://money.163.com/17/1211/19/D5DAJMFE002581PP.html'), ('174', null, '2017-12-07 20:04:34', '暴涨超1900% 今年比特币经历了哪些大事件', '7', 'http://money.163.com/17/1211/18/D5D6VH8V0025816P.html'), ('175', null, '2017-12-07 20:04:34', '两办严管办公用房:建房资金不得接受赞助或捐款', '7', 'http://money.163.com/17/1211/18/D5D6NRIV002580SJ.html'), ('176', null, '2017-12-07 20:04:34', '中办、国办印发党政机关公务用车、用房管理办法', '7', 'http://money.163.com/17/1211/18/D5D621EG002580SK.html'), ('177', null, '2017-12-07 20:04:34', '11月末社会融资规模存量173.67万亿 同比增12.5%', '7', 'http://money.163.com/17/1211/17/D5D2BU1S002581PP.html'), ('178', null, '2017-12-07 20:04:34', '暴风集团董事崔天龙抛减持计划 公司连续两日涨停', '7', 'http://money.163.com/17/1211/17/D5D1S1LR0025814U.html'), ('179', null, '2017-12-07 20:04:34', '11月社会融资规模增量1.6万亿 比上年同期少2346亿', '7', 'http://money.163.com/17/1211/17/D5D1E79H002581PP.html'), ('180', null, '2017-12-07 20:04:34', '“双12”将至新零售概念股活跃 两逻辑布局5股', '7', 'http://money.163.com/17/1211/00/D5B7J35P002580S6.html'), ('181', null, '2017-12-07 20:04:34', '三维度筛出15只成长股 3只潜力股值得关注', '7', 'http://money.163.com/17/1211/00/D5B7J35T002580S6.html'), ('182', null, '2017-12-07 20:04:34', '重上3300点 今年A股人均赚了两万三 慢牛来了?', '7', 'http://money.163.com/17/1211/14/D5COIEJE00258169.html'), ('183', null, '2017-12-07 20:04:34', '收评:沪指涨0.98%重回3300点 创业板指涨1.38%', '7', 'http://money.163.com/17/1211/15/D5CQFIAE002580PL.html'), ('184', null, '2017-12-07 20:04:34', '李迅雷:明年股市有结构性机会 价值投资将延续', '7', 'http://money.163.com/17/1211/06/D5BTD0LE002580S6.html'), ('185', null, '2017-12-07 20:04:34', '首次零过会背后:新股发行撞上“迟疑则否”枪口', '7', 'http://money.163.com/17/1211/07/D5C05KJ8002580S6.html'), ('186', null, '2017-12-07 20:04:34', 'A股市场已到“冬播”时 寻找受益政策的成长股', '7', 'http://money.163.com/17/1211/06/D5BTS4A3002580S6.html'), ('187', null, '2017-12-07 20:04:34', '月内产业资本净增持逾16亿 机构扎堆调研8只个股', '7', 'http://money.163.com/17/1211/00/D5B7J35M002580S6.html'), ('188', null, '2017-12-07 20:04:34', '机构投资者占比有望持续提升 看好四大投资机会', '7', 'http://money.163.com/17/1211/06/D5BTSDR9002580S6.html'), ('189', null, '2017-12-07 20:04:34', '厦门银行9年八度增资 短期内闯关IPO非易事', '7', 'http://money.163.com/17/1211/07/D5C05R07002580S6.html'), ('190', null, '2017-12-07 20:04:34', '机构:名酒密集挺价景气确定 积极布局白酒龙头', '7', 'http://money.163.com/17/1211/06/D5BTS10V002580S6.html'), ('191', null, '2017-12-07 20:04:34', '曾因高利贷陷诉讼 巴士在线总经理失联致并购夭折', '7', 'http://money.163.com/17/1211/00/D5B9O2E0002580S6.html'), ('192', null, '2017-12-07 20:04:34', '浪莎借壳10年赚4亿却未分红 公司叫屈:是历史问题', '7', 'http://money.163.com/17/1211/00/D5B9O5NG002580S6.html'), ('193', null, '2017-12-07 20:04:34', '途牛首次实现单季度盈利 公司称没空评论重组传闻', '7', 'http://money.163.com/17/1211/08/D5C2VB1M00258169.html'), ('194', null, '2017-12-07 20:04:34', '上市八年产业绘雄图 佳兆业多元扩张的千亿之路', '7', 'http://money.163.com/17/1211/00/D5B6RUCM002580S6.html'), ('195', null, '2017-12-07 20:04:34', '孟凯重出江湖再造\"湘鄂情\" 不再关注上市公司事情', '7', 'http://money.163.com/17/1211/08/D5C32FGH00258169.html'), ('196', null, '2017-12-07 20:04:34', '互联网上奇葩险种频现 商家卖“鹿晗恋爱险”', '7', 'http://money.163.com/17/1211/07/D5C1IHEC002580S6.html'), ('197', null, '2017-12-07 20:04:34', '揭秘手机维修乱象:送修后个人信息秒变\"透明\"', '7', 'http://money.163.com/17/1211/07/D5C0EK74002580S6.html'), ('198', null, '2017-12-07 20:04:34', '自如等中介收房后快速装修出租 房间测出甲醛超标', '7', 'http://money.163.com/17/1211/01/D5BD3F1V002580S6.html'), ('199', null, '2017-12-07 20:04:34', '对标茅台只为杀出一条血路 水井坊围猎高端白酒', '7', 'http://money.163.com/17/1211/07/D5C05KJO002580S6.html'), ('200', null, '2017-12-07 20:04:34', '辉山乳业境内重整启动内情:债权人形成稳经营共识', '7', 'http://money.163.com/17/1211/00/D5B6RSD8002580S6.html'), ('201', null, '2017-12-07 20:04:34', '海信陷入与夏普诉讼战 狂买难解上游真实短板', '7', 'http://money.163.com/17/1211/07/D5C05O0V002580S6.html'), ('202', null, '2017-12-07 20:04:34', '7家网贷平台出手\"去刚兑\" \"买者自负\"如何赚钱', '7', 'http://money.163.com/17/1211/07/D5C05QV4002580S6.html'), ('203', null, '2017-12-07 20:04:34', 'ST生化纷争:信达债权或成烫手山芋', '7', 'http://money.163.com/17/1207/07/D51M72NK002590RK.html'), ('204', null, '2017-12-07 20:04:34', '茅台操盘手:券商和经销商\"疯狂炒作\"', '7', 'http://money.163.com/17/1130/07/D4FN74DJ002590RK.html'), ('205', null, '2017-12-07 20:04:34', '从经济学角度看 为什么会有性骚扰', '7', 'http://money.163.com/17/1123/15/D3UHHSDS00258J1R.html'), ('206', null, '2017-12-07 20:04:34', '启辰T70买哪款最值?1.4T MT睿享运动版最合算', '8', 'http://auto.163.com/17/1211/07/D5C0Q6SB0008856S.html'), ('207', null, '2017-12-07 20:04:34', '2司机撞车后掏枪互射 现场子弹飞窜犹如枪战片', '8', 'http://auto.163.com/17/1211/07/D5C193KM000884MM.html'), ('208', null, '2017-12-07 20:04:34', '智能/安全功能升级 2018款帝豪GL配置曝光', '8', 'http://auto.163.com/17/1211/11/D5CENOU00008856R.html'), ('209', null, '2017-12-07 20:04:34', '延续概念车造型 荣威Vision-E量产版太拉风了', '8', 'http://auto.163.com/17/1211/01/D5BAA9RC0008856R.html'), ('210', null, '2017-12-07 20:04:34', '醉驾撞人做公益能免刑?嫌疑人做社区服务未被起诉', '8', 'http://auto.163.com/17/1211/07/D5C29TL3000884MM.html'), ('211', null, '2017-12-07 20:04:34', '车顶坐着\"蜘蛛侠\"?这种\"新时尚\"存安全隐患', '8', 'http://auto.163.com/17/1211/07/D5C1EP4G000884MM.html'), ('212', null, '2017-12-07 20:04:34', '代驾市场不规范有安全隐患', '8', 'http://auto.163.com/17/1211/08/D5C3GLMF000884MM.html'), ('213', null, '2017-12-07 20:04:34', '仅次于P1 迈凯伦发布800马力全新车型', '8', 'http://auto.163.com/17/1211/11/D5CEVM7R0008856R.html'), ('214', null, '2017-12-07 20:04:34', '花小钱办大事 年底买个啥车衣锦还乡', '8', 'http://auto.163.com/17/1209/07/D56QCA810008856S.html'), ('215', null, '2017-12-07 20:04:34', '北汽董事长:到2025年将全面停产传统燃油车', '8', 'http://auto.163.com/17/1210/09/D59MJA7K000884MM.html'), ('216', null, '2017-12-07 20:04:34', '11月乘用车销量前十:一汽大众跌出前3吉利进前5', '8', 'http://auto.163.com/17/1210/10/D59N9JBP000884MM.html'), ('217', null, '2017-12-07 20:04:34', '小伙睡梦中飙车将2人撞进ICU 因前晚认识俩姑娘', '8', 'http://auto.163.com/17/1210/09/D59LC0K8000884MM.html'), ('218', null, '2017-12-07 20:04:34', '北京超12万人申请新能源车指标 明年指标已透支', '8', 'http://auto.163.com/17/1210/10/D59NIIMG000884MM.html'), ('219', null, '2017-12-07 20:04:34', '西安洒水结冰致38车连撞 车辆损失该怎么赔偿?', '8', 'http://auto.163.com/17/1210/09/D59M3J4Q000884MM.html'), ('220', null, '2017-12-07 20:04:34', '因排放门 大众美国高管被判7年监禁被罚40万美元', '8', 'http://auto.163.com/17/1209/09/D5734L82000884MM.html'), ('221', null, '2017-12-07 20:04:34', '女子车震被拍喝农药自杀 涉事辅警获刑8个月', '8', 'http://auto.163.com/17/1210/09/D59L2I8B000884MM.html'), ('222', null, '2017-12-07 20:04:34', '和丰田共享平台 全新宝马Z4开始国内路测', '8', 'http://auto.163.com/17/1211/10/D5CC27LR0008856R.html'), ('223', null, '2017-12-07 20:04:34', '明年1月发布 全新丰田Avalon将2019年国产', '8', 'http://auto.163.com/17/1211/11/D5CDCAR80008856R.html'), ('224', null, '2017-12-07 20:04:34', '到底长啥样?威马汽车首款量产车今晚首发', '8', 'http://auto.163.com/17/1211/00/D5B7FQ6G0008856R.html'), ('225', null, '2017-12-07 20:04:34', 'NEVS将于2018年在瑞典生产电动汽车', '8', 'http://auto.163.com/17/1210/10/D59N1N43000884MM.html'), ('226', null, '2017-12-07 20:04:34', '2018年投产 威马首款量产车12月11日亮相', '8', 'http://auto.163.com/17/1208/03/D53RB2BD0008856R.html'), ('227', null, '2017-12-07 20:04:34', '与XT5隔空对比 凯迪拉克XT4谍照曝光', '8', 'http://auto.163.com/17/1208/00/D53GC88A0008856R.html'), ('228', null, '2017-12-07 20:04:34', '油耗动力都不怂 通用小排量发动机再接触', '8', 'http://auto.163.com/17/1211/07/D5C0N3QV0008856S.html'), ('229', null, '2017-12-07 20:04:34', '冬季做好5件事 才能养成纤纤玉手', '9', 'http://jiankang.163.com/17/1210/22/D5B18DEJ00388045.html'), ('230', null, '2017-12-07 20:04:34', '为何你的颈椎病总是反复发作?', '9', 'http://jiankang.163.com/17/1210/22/D5B21LMO00388045.html'), ('231', null, '2017-12-07 20:04:34', '清新口气:4种食物助你摆脱口臭尴尬', '9', 'http://jiankang.163.com/17/1210/22/D5B1E2TO00388045.html'), ('232', null, '2017-12-07 20:04:34', '一起吃饭就可能会被传染乙肝吗?', '9', 'http://jiankang.163.com/17/1210/22/D5B1PALV00388045.html'), ('233', null, '2017-12-07 20:04:34', '3个月报告19起疫情 北京进入流感高发期', '9', 'http://jiankang.163.com/17/1207/16/D52MQRDJ0038804U.html'), ('234', null, '2017-12-07 20:04:34', '谷歌一华裔女工程师赤裸浮尸旧金山湾 死因不明', '2', 'http://tech.163.com/17/1211/18/D5D60QQ900097U7R.html'), ('235', null, '2017-12-07 20:04:34', 'BBC记者挑战中国天网 \"潜逃\"7分钟后被抓获', '2', 'http://tech.163.com/17/1211/16/D5D0AV2V00097U80.html'), ('236', null, '2017-12-07 20:04:34', '日媒:“二战”后70年日本的创新路遇到拐点', '2', 'http://tech.163.com/17/1211/16/D5CVFNJA00097U7T.html'), ('237', null, '2017-12-07 20:04:34', '三星去年研发投入143亿美元:全球排名第4', '2', 'http://tech.163.com/17/1211/16/D5D0H1S600097U7T.html'), ('238', null, '2017-12-07 20:04:34', '合肥网贷平台5个月吸储上亿元:专门吸引\"羊毛党\"', '2', 'http://tech.163.com/17/1211/18/D5D59U4M00097U7R.html'), ('239', null, '2017-12-07 20:04:34', '苹果公司披露自动驾驶进展 不再保密是为招揽人才', '2', 'http://tech.163.com/17/1211/16/D5CUM6P000097U80.html'), ('240', null, '2017-12-07 20:04:34', '联想杨元庆称中国半导体技不如人,责任在谁?', '2', 'http://tech.163.com/17/1211/14/D5CNE8LT00097U7T.html'), ('241', null, '2017-12-07 20:04:34', '邬贺铨:中国快递员平均工资只有美国同行的30%', '2', 'http://tech.163.com/17/1211/11/D5CDA6DO00097U7R.html'), ('242', null, '2017-12-07 20:04:34', '孙宏斌感谢平安银行:借我25亿,赚了150亿', '2', 'http://tech.163.com/17/1211/13/D5CKU7CB00097U7R.html'), ('243', null, '2017-12-07 20:04:34', 'SpaceX本周目标:让回收火箭和飞船同时重返太空', '2', 'http://tech.163.com/17/1211/10/D5CCBE1B00097U81.html'), ('244', null, '2017-12-07 20:04:34', '摩拜ofo被曝挪用押金,银行:企业都在玩文字游戏', '2', 'http://tech.163.com/17/1211/08/D5C593V000097U7R.html'), ('245', null, '2017-12-07 20:04:34', '柯洁重返世界第一 与第二相差仅1分', '2', 'http://tech.163.com/17/1211/14/D5CNP2EE00097U7R.html'), ('246', null, '2017-12-07 20:04:34', '一加5T面部识别比iPhone X更快 但技术难度不同', '2', 'http://tech.163.com/17/1211/13/D5CM7COL00097U7S.html'), ('247', null, '2017-12-07 20:04:34', '微信、微博等APP在印度被\"拉黑\" 究竟怎么回事?', '2', 'http://tech.163.com/17/1211/10/D5CBJJOM00097U7H.html'), ('248', null, '2017-12-07 20:04:34', '旧款iPhone为何越用越卡?可能是因为电池老化', '2', 'http://tech.163.com/17/1211/10/D5C9Q4VV00097U7S.html'), ('249', null, '2017-12-07 20:04:34', '比特币期货上线交易:暴涨3000美元 两度触发熔断', '2', 'http://tech.163.com/17/1211/08/D5C2M1DH00097U7R.html'), ('250', null, '2017-12-07 20:04:34', '马云计划10年投3亿:让最优秀毕业生做乡村老师', '2', 'http://tech.163.com/17/1211/12/D5CH2QGN00097U7R.html'), ('251', null, '2017-12-07 20:04:34', '女子自封\"小程序教母\" 腾讯公关总监都\"跪了\"', '2', 'http://tech.163.com/17/1211/12/D5CGEVQ100097U82.html'), ('252', null, '2017-12-07 20:04:34', '董明珠考察LYC轴承与中航光电 格力布局河南制造业', '2', 'http://tech.163.com/17/1211/11/D5CCOVBD00097U7T.html'), ('253', null, '2017-12-07 20:04:34', '苹果高管不屑:安卓手机的人脸识别技术很糟糕', '2', 'http://tech.163.com/17/1211/08/D5C2ECKV00098IEO.html'), ('254', null, '2017-12-07 20:04:34', '女孩修电脑被植入偷拍软件 全寝女生换衣服被直播', '2', 'http://tech.163.com/17/1211/08/D5C3KULC00097U7R.html'), ('255', null, '2017-12-07 20:04:34', '苹果更新网站管理层页面:变动不小,新职位换人', '10', 'http://mobile.163.com/17/1211/07/D5C13S4200118017.html'), ('256', null, '2017-12-07 20:04:34', '新款iPhone X又一升级曝光:电池容量提升', '10', 'http://mobile.163.com/17/1211/07/D5C0KPTP00118017.html'), ('257', null, '2017-12-07 20:04:34', 'LG G7将配备虹膜识别:三星S9有对手了', '10', 'http://mobile.163.com/17/1211/07/D5C0J4DH00118017.html'), ('258', null, '2017-12-07 20:04:34', '小米MIX 3后壳曝光:指纹仍后置/设计大变', '10', 'http://mobile.163.com/17/1211/07/D5C0GPRL00118017.html'), ('259', null, '2017-12-07 20:04:34', '苹果屏下指纹专利获批:触屏即解锁', '10', 'http://mobile.163.com/17/1211/10/D5CBKH4T0011819H.html'), ('260', null, '2017-12-07 20:04:34', '旧款iPhone性能不佳?更换电池解决问题', '10', 'http://mobile.163.com/17/1211/10/D5CBDQL70011819H.html'), ('261', null, '2017-12-07 20:04:34', '网站404谁都见过,你知道为什么是404么?', '11', 'http://digi.163.com/17/1211/09/D5C6KVIJ001680P9.html'), ('262', null, '2017-12-07 20:04:34', '5G基站建设面临资金难:运营商期望政策倾斜', '10', 'http://mobile.163.com/17/1211/07/D5C1H3Q700118017.html'), ('263', null, '2017-12-07 20:04:34', '三星Note8获系统更新:新增支付宝指纹支付', '10', 'http://mobile.163.com/17/1211/07/D5C1CM9F00118017.html'), ('264', null, '2017-12-07 20:04:34', '魅族15 Plus再曝新渲染图:这设计很惊艳', '10', 'http://mobile.163.com/17/1211/07/D5C0BN4S00118017.html'), ('265', null, '2017-12-07 20:04:34', '苹果供应商大买厂房:2018全系iPhone支持Face ID', '10', 'http://mobile.163.com/17/1211/10/D5CC3R2T0011819H.html'), ('266', null, '2017-12-07 20:04:34', '北京二手房中介门店门可罗雀 市场成交量低迷', '12', 'http://bj.house.163.com/17/1211/08/D5C4Q2AK000788HN.html'), ('267', null, '2017-12-07 20:04:34', '2018年楼市毫无悬念:调控仍将持续', '12', 'http://bj.house.163.com/17/1211/09/D5C5S99D000788HN.html'), ('268', null, '2017-12-07 20:04:34', '2018年楼市:趋势如何看,热点在哪里', '12', 'http://bj.house.163.com/17/1211/09/D5C5QI5F000788HN.html'), ('269', null, '2017-12-07 20:04:34', '超过50个城市出台住房租赁政策措施', '12', 'http://bj.house.163.com/17/1211/08/D5C4MU0T000788HN.html'), ('270', null, '2017-12-07 20:04:34', '11月全国首套房贷款利率5.36% 同比升逾20%', '12', 'http://bj.house.163.com/17/1211/09/D5C61RJ2000788HN.html'), ('271', null, '2017-12-07 20:04:34', '祭出四大\"杀头目标\" 朱荣斌带阳光城冲击1200亿', '12', 'http://bj.house.163.com/17/1211/08/D5C5IMNR000788HN.html'), ('272', null, '2017-12-07 20:04:34', '码农在中关村软件园就近生活难 新房10万/平', '12', 'http://bj.house.163.com/17/1211/06/D5BTSGSM0007823B.html'), ('273', null, '2017-12-07 20:04:34', '专家:北京向东向南发展是唯一选择', '12', 'http://bj.house.163.com/17/1211/09/D5C668GG000788HN.html'), ('274', null, '2017-12-07 20:04:34', '起底租房黑中介:强索跳单费,克扣押金……', '12', 'http://bj.house.163.com/17/1211/08/D5C5M79M000788HN.html'), ('275', null, '2017-12-07 20:04:34', '美女老师刚住进新家就抓狂 花48小时完成极速改造', '13', 'http://home.163.com/17/1211/07/D5BV16C5001081EI.html'), ('276', null, '2017-12-07 20:04:34', '在北方常见的天然气地暖 值得南方人羡慕吗?', '13', 'http://home.163.com/17/1211/07/D5BV15NA001086FG.html'), ('277', null, '2017-12-07 20:04:34', '厨房用单水槽还是双水槽?选不好家人天天发牢骚', '13', 'http://home.163.com/17/1211/07/D5BVJHTS001086FG.html'), ('278', null, '2017-12-07 20:04:34', '为什么别人家厨房总是干净整洁 你家的却乱糟糟', '13', 'http://home.163.com/17/1211/07/D5BVJFT0001086FG.html'), ('279', null, '2017-12-07 20:04:34', '家庭弹簧床垫选购必看攻略 帮你找回睡眠幸福感', '13', 'http://home.163.com/17/1211/07/D5BVJGK0001086FG.html'), ('280', null, '2017-12-07 20:04:34', '家里门铃总是坏?看完这份攻略就不用再担心了', '13', 'http://home.163.com/17/1211/07/D5BV18UG001086FG.html'), ('281', null, '2017-12-07 20:04:34', '扶手高度万万不能忽略 全家的安全和美观都靠它', '13', 'http://home.163.com/17/1211/07/D5BV15B4001086FG.html'), ('282', null, '2017-12-07 20:04:34', '包租婆装修3套房的经验:哪些最该花钱哪些最得省钱', '13', 'http://home.163.com/17/1208/16/D557REFU001086HJ.html'), ('283', null, '2017-12-07 20:04:34', '卫生间选灯暖or风暖?我家装错冬天洗澡冷得直发抖', '13', 'http://home.163.com/17/1208/11/D54MAMQO001086I2.html'), ('284', null, '2017-12-07 20:04:34', '搞大了 女神舒淇最想和它分手却掉入深渊无法脱离', '4', 'http://lady.163.com/17/1211/15/D5CTFTGD00267VQQ.html'), ('285', null, '2017-12-07 20:04:34', '都是猪精女孩 凭什么她桃花运就这么好', '4', 'http://lady.163.com/17/1211/10/D5CBRRAK00267VA9.html'), ('286', null, '2017-12-07 20:04:34', '看完日本可爱女高中生选美比赛,我笑了出来..', '4', 'http://lady.163.com/17/1211/10/D5CBLPI800267VA9.html'), ('287', null, '2017-12-07 20:04:34', '世界上最温柔的事 就是爸爸和女儿在一起', '4', 'http://lady.163.com/17/1211/11/D5CD52E100267VA9.html'), ('288', null, '2017-12-07 20:04:34', '如果章子怡和关晓彤一起上《演员的诞生》…', '4', 'http://lady.163.com/17/1211/11/D5CDLJB500267VA9.html'), ('289', null, '2017-12-07 20:04:34', '父母老了 以后夜里不能手机静音…', '4', 'http://lady.163.com/17/1211/11/D5CCV5ND00267VA9.html'), ('290', null, '2017-12-07 20:04:34', '想嫁个有钱人当富太太?想得美!', '4', 'http://lady.163.com/17/1210/08/D59ISD3200267VA9.html'), ('291', null, '2017-12-07 20:04:34', '女子3次领证未果怼民政局:领证比找老公都难', '4', 'http://lady.163.com/17/1210/09/D59JO7GP00267VA9.html'), ('292', null, '2017-12-07 20:04:34', '被动攻击型恋人到底有多可怕?', '4', 'http://lady.163.com/17/1210/08/D59I1N3200267VA9.html'), ('293', null, '2017-12-07 20:04:34', '见面四次就闪婚 五年生三娃', '4', 'http://lady.163.com/17/1210/08/D59HU93600267VA9.html'), ('294', null, '2017-12-07 20:04:34', '喜得一子!马龙晒一家三口牵手照:你好兄弟', '14', 'http://baby.163.com/17/1211/10/D5C96JBH00367V0V.html'), ('295', null, '2017-12-07 20:04:34', '[赠书]如果你被感动了 请将这个故事讲给别人听', '14', 'http://baby.163.com/17/1211/14/D5CO0KA800367V0V.html'), ('296', null, '2017-12-07 20:04:34', '孙莉称多多长太快经常腿疼 何炅:我从没痛过', '14', 'http://baby.163.com/17/1211/10/D5CAJPBC00367V0V.html'), ('297', null, '2017-12-07 20:04:34', '林永健和儿子被窝合影 网友:没人敢说不是您儿子', '14', 'http://baby.163.com/17/1211/14/D5CP36MA00367V0V.html'), ('298', null, '2017-12-07 20:04:34', '症状类似感冒易被误诊 医生提醒警惕小儿川崎病', '14', 'http://baby.163.com/17/1211/12/D5CG2A7700367V0V.html'), ('299', null, '2017-12-07 20:04:34', '这11句话最鼓舞孩子', '14', 'http://baby.163.com/17/1211/11/D5CFV68A00367V0V.html'), ('300', null, '2017-12-07 20:04:34', '孩子超过10点睡 小心长不高', '14', 'http://baby.163.com/17/1211/11/D5CFPJHE00367V0V.html'), ('301', null, '2017-12-07 20:04:34', '英媒:不堪重负 中国“虎妈”反抗家长作业', '14', 'http://baby.163.com/17/1211/11/D5CFIO5D00367V0V.html'), ('302', null, '2017-12-07 20:04:34', '家长们 请珍惜孩子身上的淘气本性', '14', 'http://baby.163.com/17/1211/10/D5CBCA6S00367V0V.html'), ('303', null, '2017-12-07 20:04:34', '阿杜儿子陪爸爸工作 机场晒背影开心回家', '14', 'http://baby.163.com/17/1211/14/D5CNGBTR00367V0V.html'), ('304', null, '2017-12-07 20:04:34', '产后抑郁症 服药会不会影响哺乳?', '14', 'http://baby.163.com/17/1211/12/D5CGDS5300367V0V.html'), ('305', null, '2017-12-07 20:04:34', '“信息之美”来看今年的数据可视化作品', '15', 'http://art.163.com/17/1210/13/D5A2R5Q700997VCT.html'), ('306', null, '2017-12-07 20:04:34', '溥儒《白云溪声图》赏析', '15', 'http://art.163.com/17/1210/13/D5A3HN4D00997VCT.html'), ('307', null, '2017-12-07 20:04:34', '肥腴细润的白和娇气匀净的黄', '15', 'http://art.163.com/17/1209/17/D57SJEL900997VCT.html'), ('308', null, '2017-12-07 20:04:34', '爱德华·蒙克:孤独是时间留给他的自画像', '15', 'http://art.163.com/17/1209/14/D57L3FH400997VCT.html'), ('309', null, '2017-12-07 20:04:34', '看京沪杭三地的李可染白蕉潘天寿纪念大展', '15', 'http://art.163.com/17/1209/09/D573TFVJ00997VCT.html'), ('310', null, '2017-12-07 20:04:34', '夜间娱乐少 日本为中国游客打造\"夜生活\"', '16', 'http://travel.163.com/17/1211/00/D5B8DGO900067VF3.html'), ('311', null, '2017-12-07 20:04:34', '奇葩的日本地名,\"女体入口\"是什么鬼?', '16', 'http://travel.163.com/17/1211/10/D5CCDQA300067VF3.html'), ('312', null, '2017-12-07 20:04:34', '人工智能进入国考试卷 申论试题最需想象力', '17', 'http://edu.163.com/17/1211/09/D5C8FG1T00297VGM.html'), ('313', null, '2017-12-07 20:04:34', '大学教材\"主编位\"公开买卖 最贵2万最便宜5500元', '17', 'http://edu.163.com/17/1211/09/D5C8BD3P00297VGM.html'), ('314', null, '2017-12-07 20:04:34', '近六成大学生希望成为职场精英', '17', 'http://edu.163.com/17/1211/10/D5C9771L00297VGM.html'), ('315', null, '2017-12-07 20:04:34', '[赠书]写给新的一年 王小波图书送给明年更好的你', '17', 'http://edu.163.com/17/1211/09/D5C5T40600297VGM.html'), ('316', null, '2017-12-07 20:04:34', '大学生修电脑被植入偷窥软件 同寝女生换衣服被拍', '17', 'http://edu.163.com/17/1211/09/D5C8JDT900297VGM.html'), ('317', null, '2017-12-07 20:04:34', '差点砸到小朋友 驻日美军战机零件掉落幼儿园', '17', 'http://edu.163.com/17/1211/06/D5BRJAV900297VGM.html'), ('318', null, '2017-12-07 20:04:34', '长沙理工学生吐槽男性进女寝突查 你觉得合理吗', '17', 'http://edu.163.com/17/1211/10/D5CA3MP900297VGM.html'), ('319', null, '2017-12-07 20:04:34', '女教师卧底揭秘不良校园贷:3000元3个月变3万元', '17', 'http://edu.163.com/17/1211/11/D5CCM4Q500297VGM.html'), ('320', null, '2017-12-07 20:04:34', '双语阅读:都是礼物 gift和present有什么区别?', '17', 'http://edu.163.com/17/1211/10/D5CCCQ6V00297VGM.html'), ('321', null, '2017-12-07 20:04:34', '教师辱骂学生 视频误发家长群 校方:怀二胎压力大', '17', 'http://edu.163.com/17/1211/10/D5CAHVEQ00297VGM.html'), ('322', null, '2017-12-07 20:04:34', '谷歌一华裔女工程师赤裸浮尸旧金山湾 死因不明', '1', 'http://news.163.com/17/1211/17/D5D39OU800018AOR.html'), ('323', null, '2017-12-07 20:04:34', '武汉预拌混凝土企业停工:呼吁政府干预水泥价格', '1', 'http://news.163.com/17/1211/15/D5CRNRON000187VE.html'), ('324', null, '2017-12-07 20:04:34', '吴咏宁好友:他签约多个直播平台 未透露有彩礼压力', '1', 'http://news.163.com/17/1211/16/D5CVT6RK0001875P.html'), ('325', null, '2017-12-07 20:04:34', '老师在班群留言引家长发文怒斥 网友反为老师点赞', '1', 'http://news.163.com/17/1211/17/D5D1P0TM0001899N.html'), ('326', null, '2017-12-07 20:04:34', '女生把外卖放宿舍楼下被人拿走 贴告示要求还饭钱', '1', 'http://news.163.com/17/1211/17/D5D46N4O0001899N.html'), ('327', null, '2017-12-07 20:04:34', '老人进养老院22天后满身伤痕身亡 官方:因病猝死', '1', 'http://news.163.com/17/1211/17/D5D22DNG000187VE.html'), ('328', null, '2017-12-07 20:04:34', '男子带12岁女孩开房被判强奸罪 当时女孩正来例假', '1', 'http://news.163.com/17/1211/17/D5D3MBFB000187VE.html'), ('329', null, '2017-12-07 20:04:34', '辽宁渔船与货船相撞后9人失联 搜寻9日仍下落不明', '1', 'http://news.163.com/17/1211/17/D5D2PND70001875P.html'), ('330', null, '2017-12-07 20:04:34', '河北警察抓捕罪犯时被刺牺牲 嫌犯已被批捕', '1', 'http://news.163.com/17/1211/17/D5D30DM60001899N.html'), ('331', null, '2017-12-07 20:04:34', '6名男孩被困电梯说不出位置 警方排查65栋楼救人', '1', 'http://news.163.com/17/1211/17/D5D17HAS0001899N.html'); +COMMIT; + +-- ---------------------------- +-- Table structure for `newslogs` +-- ---------------------------- +DROP TABLE IF EXISTS `newslogs`; +CREATE TABLE `newslogs` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `user_id` bigint(20) NOT NULL, + `news_id` bigint(20) NOT NULL, + `view_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `prefer_degree` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + KEY `user_id` (`user_id`), + KEY `news_id` (`news_id`), + CONSTRAINT `newslogs_news_id` FOREIGN KEY (`news_id`) REFERENCES `news` (`id`), + CONSTRAINT `newslogs_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of `newslogs` +-- ---------------------------- +BEGIN; +INSERT INTO `newslogs` VALUES ('1', '1', '100', '2017-12-01 20:27:04', '0'), ('2', '1', '101', '2017-12-01 20:27:33', '0'), ('3', '1', '102', '2017-12-01 20:27:47', '0'), ('4', '2', '101', '2017-12-02 20:28:00', '0'), ('5', '2', '102', '2017-12-02 20:28:19', '0'), ('6', '2', '103', '2017-12-02 20:28:32', '0'), ('7', '3', '102', '2017-12-02 20:28:32', '0'), ('8', '3', '103', '2017-12-02 20:28:32', '0'), ('9', '3', '104', '2017-12-02 20:28:32', '0'); +COMMIT; + +-- ---------------------------- +-- Table structure for `newsmodules` +-- ---------------------------- +DROP TABLE IF EXISTS `newsmodules`; +CREATE TABLE `newsmodules` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` text NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of `newsmodules` +-- ---------------------------- +BEGIN; +INSERT INTO `newsmodules` VALUES ('1', '新闻中心'), ('2', '网易科技'), ('3', '网易娱乐'), ('4', '女人频道'), ('5', '军事'), ('6', '体育频道'), ('7', '财经频道'), ('8', '汽车频道'), ('9', '健康频道'), ('10', '网易手机'), ('11', '数码频道'), ('12', '网易北京房产'), ('13', '网易家居'), ('14', '亲子频道'), ('15', '艺术频道'), ('16', '旅游频道'), ('17', '教育频道'); +COMMIT; + +-- ---------------------------- +-- Table structure for `recommendations` +-- ---------------------------- +DROP TABLE IF EXISTS `recommendations`; +CREATE TABLE `recommendations` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `user_id` bigint(20) NOT NULL, + `news_id` bigint(20) NOT NULL, + `derive_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `feedback` bit(1), + `derive_algorithm` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `user_id` (`user_id`), + KEY `news_id` (`news_id`), + CONSTRAINT `recommendations_news_id` FOREIGN KEY (`news_id`) REFERENCES `news` (`id`), + CONSTRAINT `recommendations_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Table structure for `users` +-- ---------------------------- +DROP TABLE IF EXISTS `users`; +CREATE TABLE `users` ( + `id` bigint(20) NOT NULL, + `pref_list` text NOT NULL, + `latest_log_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `name` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of `users` +-- ---------------------------- +BEGIN; +INSERT INTO `users` VALUES ('1', '', '2017-12-01 20:20:21', '小红'), ('2', '', '2017-12-02 20:20:30', '小橙'), ('3', '', '2017-12-03 20:20:34', '小黄'), ('4', '', '2017-12-04 20:20:40', '小绿'), ('5', '', '2017-12-05 20:20:55', '小青'), ('6', '', '2017-12-06 20:21:15', '小蓝'), ('7', '', '2017-12-07 20:21:33', '小紫'); +COMMIT; + +SET FOREIGN_KEY_CHECKS = 1; -- GitLab