From 34b50f59bb9f5dcb5cda3719a0c0a9025c7000ba Mon Sep 17 00:00:00 2001 From: Tom Qian Date: Thu, 22 Mar 2018 09:24:25 +0800 Subject: [PATCH] modification according to user's feedback about a null pointer exception sth new --- README.md | 4 +- logs/debug.log | 0 logs/debug.log.2017-12-12 | 0 logs/debug.log.2017-12-13 | 0 logs/error.log | 0 pom.xml | 245 +++++++++--------- res/dbconfig.properties | 2 +- src/top/qianxinyao/Main/JobSetter.java | 0 src/top/qianxinyao/Main/Main.java | 1 - src/top/qianxinyao/Main/NewsScraper.java | 0 src/top/qianxinyao/Main/TestDataRunner.java | 2 + src/top/qianxinyao/algorithms/JsonKit.java | 1 - .../qianxinyao/algorithms/RecommendKit.java | 19 +- .../ContentBasedRecommender.java | 1 + .../UserPrefRefresher.java | 60 +++-- .../hotrecommend/HotRecommender.java | 3 +- .../recommender-system/pom.properties | 6 +- .../top.tomqian/recommender-system/pom.xml | 245 +++++++++--------- target/classes/dbconfig.properties | 3 + target/classes/log4j.properties | 24 ++ target/classes/paraConfig.properties | 36 +++ target/classes/top/qianxinyao/Main/Main.class | Bin 697 -> 697 bytes .../top/qianxinyao/Main/TestDataRunner.class | Bin 1883 -> 1883 bytes .../top/qianxinyao/algorithms/JsonKit$3.class | Bin 768 -> 768 bytes .../top/qianxinyao/algorithms/JsonKit.class | Bin 4345 -> 4047 bytes .../qianxinyao/algorithms/RecommendKit.class | Bin 9165 -> 9488 bytes .../ContentBasedRecommender.class | Bin 7983 -> 7983 bytes .../UserPrefRefresher.class | Bin 9235 -> 9313 bytes .../hotrecommend/HotRecommender.class | Bin 5146 -> 5146 bytes test_data.sql | 0 30 files changed, 369 insertions(+), 283 deletions(-) mode change 100644 => 100755 logs/debug.log mode change 100644 => 100755 logs/debug.log.2017-12-12 mode change 100644 => 100755 logs/debug.log.2017-12-13 mode change 100644 => 100755 logs/error.log mode change 100644 => 100755 src/top/qianxinyao/Main/JobSetter.java mode change 100644 => 100755 src/top/qianxinyao/Main/Main.java mode change 100644 => 100755 src/top/qianxinyao/Main/NewsScraper.java mode change 100644 => 100755 src/top/qianxinyao/Main/TestDataRunner.java create mode 100755 target/classes/dbconfig.properties create mode 100755 target/classes/log4j.properties create mode 100755 target/classes/paraConfig.properties mode change 100644 => 100755 test_data.sql diff --git a/README.md b/README.md index 09f0663..2469aeb 100755 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ |字段名|类型|非空|主键|外键|自增|默认值| |--|--|--|--|--|--|--| |id|bigint|yes|yes||yes|| -|pref_list|text|yes||||{}| +|pref_list|text|yes||||{"moduleid1":{},"moduleid2":{},...}| |latest_log_time|timestamp|yes||||| - 新闻表news @@ -193,7 +193,7 @@ new TestDataRunner().runTestData(); - 若对测试数据进行一次协同过滤,将生成0条推荐。 - 若对测试数据进行一次基于内容的推荐,将为用户1(id=1)推荐85,87,89,104这四条新闻(有重复标题的新闻,新闻标题中的“合同”关键词匹配上了用户的喜好关键词),为用户2推荐89新闻(重复标题的新闻),推荐用户3推荐87,85,100这三条新闻(新闻标题中的“合同”关键词匹配上了用户的喜好关键词)。 -- 若对测试数据进行一次基于热点新闻的推荐,将为每个用户生成20条推荐结果。 +- 若对测试数据进行一次基于热点新闻的推荐,将分别为用户1推荐103,104,为用户2推荐100,104,为用户3推荐100,101,因为最近被浏览得最多的新闻就是这三个拥有浏览记录的用户看过的那些新闻(100,101,102,103,104)。 ## 额外说明 diff --git a/logs/debug.log b/logs/debug.log old mode 100644 new mode 100755 diff --git a/logs/debug.log.2017-12-12 b/logs/debug.log.2017-12-12 old mode 100644 new mode 100755 diff --git a/logs/debug.log.2017-12-13 b/logs/debug.log.2017-12-13 old mode 100644 new mode 100755 diff --git a/logs/error.log b/logs/error.log old mode 100644 new mode 100755 diff --git a/pom.xml b/pom.xml index e68a939..6e2e9b1 100755 --- a/pom.xml +++ b/pom.xml @@ -1,123 +1,124 @@ - - 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 - - - - + + 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 c3b0975..654a53e 100755 --- a/res/dbconfig.properties +++ b/res/dbconfig.properties @@ -1,3 +1,3 @@ -url = jdbc:mysql://[ip]/[database]?useUnicode=true&characterEncoding=utf8 +url = jdbc:mysql://[ip]/[database]]?useUnicode=true&characterEncoding=utf8 user = password = \ No newline at end of file diff --git a/src/top/qianxinyao/Main/JobSetter.java b/src/top/qianxinyao/Main/JobSetter.java old mode 100644 new mode 100755 diff --git a/src/top/qianxinyao/Main/Main.java b/src/top/qianxinyao/Main/Main.java old mode 100644 new mode 100755 index 109a9f7..2d0cd69 --- a/src/top/qianxinyao/Main/Main.java +++ b/src/top/qianxinyao/Main/Main.java @@ -1,5 +1,4 @@ package top.qianxinyao.Main; - import org.apache.log4j.Logger; /** diff --git a/src/top/qianxinyao/Main/NewsScraper.java b/src/top/qianxinyao/Main/NewsScraper.java old mode 100644 new mode 100755 diff --git a/src/top/qianxinyao/Main/TestDataRunner.java b/src/top/qianxinyao/Main/TestDataRunner.java old mode 100644 new mode 100755 index b999fea..244929c --- a/src/top/qianxinyao/Main/TestDataRunner.java +++ b/src/top/qianxinyao/Main/TestDataRunner.java @@ -20,6 +20,7 @@ public class TestDataRunner System.out.println("开始测试数据的运行!"); //选择要在推荐系统中运行的推荐算法 + //协同过滤Collaborative Filtering,基于内容相似度的推荐Content-based,基于热点新闻推荐HotNewsRecommendation boolean enableCF=false,enableCB=true,enableHR=false; JobSetter jobSetter=new JobSetter(enableCF,enableCB,enableHR); @@ -38,6 +39,7 @@ public class TestDataRunner System.out.println("测试数据运行结束!"); } + //对测试数据的相关日期数据进行更新,以保证能够在测试运行中获得理想的推荐结果。 public void databaseReady() { Db.update("update news set news_time=?",new Date()); for(int id=1;id<8;id++) { diff --git a/src/top/qianxinyao/algorithms/JsonKit.java b/src/top/qianxinyao/algorithms/JsonKit.java index 3c1af31..adc5936 100755 --- a/src/top/qianxinyao/algorithms/JsonKit.java +++ b/src/top/qianxinyao/algorithms/JsonKit.java @@ -124,7 +124,6 @@ public class JsonKit CustomizedHashMap> map=null; try { - System.out.println("srcJson:"+srcJson); map=objectMapper.readValue(srcJson, new TypeReference>>(){}); } catch (JsonParseException e) diff --git a/src/top/qianxinyao/algorithms/RecommendKit.java b/src/top/qianxinyao/algorithms/RecommendKit.java index 82fc08e..777cf6a 100755 --- a/src/top/qianxinyao/algorithms/RecommendKit.java +++ b/src/top/qianxinyao/algorithms/RecommendKit.java @@ -18,6 +18,7 @@ import org.apache.log4j.Logger; import top.qianxinyao.contentbasedrecommend.CustomizedHashMap; import top.qianxinyao.model.News; +import top.qianxinyao.model.Newslogs; import top.qianxinyao.model.Recommendations; import top.qianxinyao.model.Users; @@ -96,12 +97,12 @@ public class RecommendKit { try { - List newsList = News.dao.find("select news_id from newslogs where user_id=?",userId); - for (News news:newsList) + List newslogsList = Newslogs.dao.find("select news_id from newslogs where user_id=?",userId); + for (Newslogs newslog:newslogsList) { - if (col.contains(news.getId())) + if (col.contains(newslog.getNewsId())) { - col.remove(news.getId()); + col.remove(newslog.getNewsId()); } } } @@ -119,12 +120,13 @@ public class RecommendKit { try { - List newsList = News.dao.find("select news_id from recommendations where user_id=? and derive_time>?",userId,getInRecDate()); - for (News news:newsList) + //但凡近期已经给用户推荐过的新闻,都过滤掉 + List recommendationList = Recommendations.dao.find("select news_id from recommendations where user_id=? and derive_time>?",userId,getInRecDate()); + for (Recommendations recommendation:recommendationList) { - if (col.contains(news.getId())) + if (col.contains(recommendation.getNewsId())) { - col.remove(news.getId()); + col.remove(recommendation.getNewsId()); } } } @@ -264,6 +266,7 @@ public class RecommendKit rec.setUserId(userId); rec.setDeriveAlgorithm(recAlgo); rec.setNewsId(newsIte.next()); + rec.save(); } } catch (Exception e) diff --git a/src/top/qianxinyao/contentbasedrecommend/ContentBasedRecommender.java b/src/top/qianxinyao/contentbasedrecommend/ContentBasedRecommender.java index f795e38..0c16466 100755 --- a/src/top/qianxinyao/contentbasedrecommend/ContentBasedRecommender.java +++ b/src/top/qianxinyao/contentbasedrecommend/ContentBasedRecommender.java @@ -95,6 +95,7 @@ public class ContentBasedRecommender implements RecommendAlgorithm RecommendKit.filterReccedNews(toBeRecommended,userId); //过滤掉用户已经看过的新闻 RecommendKit.filterBrowsedNews(toBeRecommended, userId); + //如果可推荐新闻数目超过了系统默认为CB算法设置的单日推荐上限数(N),则去掉一部分多余的可推荐新闻,剩下的N个新闻才进行推荐 if(toBeRecommended.size()>N){ RecommendKit.removeOverNews(toBeRecommended,N); } diff --git a/src/top/qianxinyao/contentbasedrecommend/UserPrefRefresher.java b/src/top/qianxinyao/contentbasedrecommend/UserPrefRefresher.java index 120e982..b1edd62 100755 --- a/src/top/qianxinyao/contentbasedrecommend/UserPrefRefresher.java +++ b/src/top/qianxinyao/contentbasedrecommend/UserPrefRefresher.java @@ -24,7 +24,8 @@ import top.qianxinyao.model.Users; * @author qianxinyao * @email tomqianmaple@gmail.com * @github https://github.com/bluemapleman - * @date 2016年11月3日 每次用户浏览新的新闻时,用以更新用户的喜好关键词列表 + * @date 2016年11月3日 + * 每次用户浏览新的新闻时,用以更新用户的喜好关键词列表 */ public class UserPrefRefresher { @@ -38,12 +39,21 @@ public class UserPrefRefresher refresh(RecommendKit.getUserList()); } + /** + * 按照推荐频率调用的方法,一般为一天执行一次。 + * 定期根据前一天所有用户的浏览记录,在对用户进行喜好关键词列表TFIDF值衰减的后,将用户前一天看的新闻的关键词及相应TFIDF值更新到列表中去。 + * @param userIdsCol + */ @SuppressWarnings("unchecked") public void refresh(Collection userIdsCol){ //首先对用户的喜好关键词列表进行衰减更新 autoDecRefresh(userIdsCol); + //用户浏览新闻纪录:userBrowsexMap:(newsid List)> HashMap> userBrowsedMap=getBrowsedHistoryMap(); + //如果前一天没有浏览记录(比如新闻门户出状况暂时关停的情况下,或者初期用户较少的时候均可能出现这种情况),则不需要执行后续更新步骤 + if(userBrowsedMap.size()==0) + return; //用户喜好关键词列表:userPrefListMap: HashMap>> userPrefListMap=RecommendKit.getUserPrefListMap(userBrowsedMap.keySet()); @@ -62,8 +72,7 @@ public class UserPrefRefresher //获得对应模块的(关键词:喜好)map CustomizedHashMap rateMap=userPrefListMap.get(userId).get(moduleId); //获得新闻的(关键词:TFIDF值)map - @SuppressWarnings("unlikely-arg-type") - List keywordList=(List) newsTFIDFMap.get(news); + List keywordList=(List) newsTFIDFMap.get(news.toString()); Iterator keywordIte=keywordList.iterator(); while(keywordIte.hasNext()){ Keyword keyword=keywordIte.next(); @@ -83,7 +92,7 @@ public class UserPrefRefresher Long userId=iterator.next(); try { - Db.update("update users set upreflist='"+userPrefListMap.get(userId)+"' where userid=?",userId); + Db.update("update users set pref_list='"+userPrefListMap.get(userId)+"' where id=?",userId); } catch (Exception e) { @@ -153,14 +162,13 @@ public class UserPrefRefresher } /** - * 提取出当天所有用户浏览新闻纪录 + * 提取出当天有浏览行为的用户及其各自所浏览过的新闻id列表 * @return */ private HashMap> getBrowsedHistoryMap(){ - HashMap> userBrowsedMap=null; + HashMap> userBrowsedMap=new HashMap>(); try { - 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())){ @@ -202,28 +210,36 @@ public class UserPrefRefresher * @return */ private HashMap getNewsTFIDFMap(){ - HashMap newsTFIDFMap=null; + HashMap newsTFIDFMap=new HashMap();; try { Iterator ite=getBrowsedNewsSet().iterator(); String newsIdListQuery="("; while(ite.hasNext()){ - newsIdListQuery+=ite.next()+","; + long next=ite.next(); + newsIdListQuery+=next+","; } - //用户如果当天没看新闻 - if(newsIdListQuery.length()>1){ - newsIdListQuery=newsIdListQuery.substring(0, newsIdListQuery.length()-1)+")"; - //提取出所有新闻的关键词列表及对应TF-IDf值,并放入一个map中 - List newsList=News.dao.find("select id,title,content,module_id from news where id in "+newsIdListQuery); - - newsTFIDFMap=new HashMap(); - 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()); - } + +// //当天存在用户浏览记录 +// if(newsIdListQuery.length()>1){ +// newsIdListQuery=newsIdListQuery.substring(0, newsIdListQuery.length()-1)+")"; +// //提取出所有新闻的关键词列表及对应TF-IDf值,并放入一个map中 +// List newsList=News.dao.find("select id,title,content,module_id from news where id in "+newsIdListQuery); +// System.out.println("newsIdListQuery:"+newsIdListQuery); +// 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()); +// } +// for() +// } + + newsIdListQuery=newsIdListQuery.substring(0, newsIdListQuery.length()-1)+")"; + //提取出所有新闻的关键词列表及对应TF-IDf值,并放入一个map中 + List newsList=News.dao.find("select id,title,content,module_id from news where id in "+newsIdListQuery); + 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 (Exception e) { diff --git a/src/top/qianxinyao/hotrecommend/HotRecommender.java b/src/top/qianxinyao/hotrecommend/HotRecommender.java index dfeae32..c3cdd3d 100755 --- a/src/top/qianxinyao/hotrecommend/HotRecommender.java +++ b/src/top/qianxinyao/hotrecommend/HotRecommender.java @@ -46,10 +46,11 @@ public class HotRecommender implements RecommendAlgorithm { try { + //获得已经预备为当前用户推荐的新闻,若数目不足达不到单次的最低推荐数目要求,则用热点新闻补充 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; + boolean flag=(recommendation!=null); int delta=flag?TOTAL_REC_NUM - recommendation.getInt("recnums"):TOTAL_REC_NUM; Set toBeRecommended = new HashSet(); 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 index 8cd7b5c..41adcea 100644 --- a/target/classes/META-INF/maven/top.tomqian/recommender-system/pom.properties +++ b/target/classes/META-INF/maven/top.tomqian/recommender-system/pom.properties @@ -1,7 +1,7 @@ #Generated by Maven Integration for Eclipse -#Fri Mar 02 17:24:53 CST 2018 +#Wed Mar 21 17:07:36 CST 2018 version=0.0.1-SNAPSHOT groupId=top.tomqian -m2e.projectName=RecommandSystem -m2e.projectLocation=/Users/hanbo/Desktop/NewsRecommendSystem-master +m2e.projectName=TomNewsRecommender +m2e.projectLocation=/Users/hanbo/Desktop/\u8FB9\u57CE/Github/modify_place/NewsRecommendSystem-master 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 index e68a939..6e2e9b1 100644 --- a/target/classes/META-INF/maven/top.tomqian/recommender-system/pom.xml +++ b/target/classes/META-INF/maven/top.tomqian/recommender-system/pom.xml @@ -1,123 +1,124 @@ - - 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 - - - - + + 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/dbconfig.properties b/target/classes/dbconfig.properties new file mode 100755 index 0000000..33aa0f4 --- /dev/null +++ b/target/classes/dbconfig.properties @@ -0,0 +1,3 @@ +url = jdbc:mysql://121.42.36.199/tom_recommender?useUnicode=true&characterEncoding=utf8 +user = root +password = qxysay1+1=2 \ No newline at end of file diff --git a/target/classes/log4j.properties b/target/classes/log4j.properties new file mode 100755 index 0000000..534e8ed --- /dev/null +++ b/target/classes/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/target/classes/paraConfig.properties b/target/classes/paraConfig.properties new file mode 100755 index 0000000..1e775f7 --- /dev/null +++ b/target/classes/paraConfig.properties @@ -0,0 +1,36 @@ +#---Recommend System Parameter--- + +#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 +#Set a previous day after which the browsing history will be calculated with, namely, is still in time +previousDays=-30 +#TF-IDF's extracting numbers of keywords from every news +TFIDFKeywordsNum=10 + + +#-Hot Recommendation- + diff --git a/target/classes/top/qianxinyao/Main/Main.class b/target/classes/top/qianxinyao/Main/Main.class index c9da6ff4dd2a4ca39b9868e6e3f8bf65b9618188..d4a799b6dc710ad57a8014d0fb303841cd44376e 100644 GIT binary patch delta 29 lcmdnVx|4N-5)&ieWMw8JM()XBOirxg3|tHvljkzY003uI1|I+b delta 29 lcmdnVx|4N-5)&i;WMw8JMxM!GOirv43|tJFljkzY003u)1|t9f diff --git a/target/classes/top/qianxinyao/Main/TestDataRunner.class b/target/classes/top/qianxinyao/Main/TestDataRunner.class index 01949fa585cda66c5706035ebf969dbc6eba9016..636f202b55dfb8f8aa1ae4a796e144e037b2599b 100644 GIT binary patch delta 75 zcmcc3cbjj6BAcoN10RDF5Xv&hF~~EhGbk_^Gbl1RGAJ?lGpI6z0Y%~%G$y;TofXw# a5Mj_|kYvzfFagrG310RDVgA{`dgB%d5GsrU-Gbk`PGAJ_mGpI0xF{m-bF{n>=V>>IV b#UR3<4OFYcU;?CV8T1$e84M?Dup0vasGSO) diff --git a/target/classes/top/qianxinyao/algorithms/JsonKit$3.class b/target/classes/top/qianxinyao/algorithms/JsonKit$3.class index 92e78098e08d0897a8dc64c4ae015ea2c20ab21f..ad08cb1c036b421b62f8d46b74e35d067c6fdcf6 100644 GIT binary patch delta 13 UcmZo*Yhc^3mx-}{@;)Xf03ZYekpKVy delta 13 UcmZo*Yhc^3mx-}q@;)Xf03Znjk^lez diff --git a/target/classes/top/qianxinyao/algorithms/JsonKit.class b/target/classes/top/qianxinyao/algorithms/JsonKit.class index b25fdba83a4a8f6d9427321f1ec947509c969f14..08f39e40d4f1adc9612639354e8169f8fff3bb67 100644 GIT binary patch delta 311 zcmXAkyGjE=07cJc*Uau%sMrM(AE3x;LI{!~g%(BxABCXBLMk7HzpzP6q7g(8k^KU{ zK`@YjSljp){)3HrvzcM$-hp#x?))r$E!fZB;XANN|HTHbp_%0ES`ZT$t{tk$oL_zI z+i+?*i>E1aL^&EzIdqQJ!x6E3>y48S+R69KVkbwQ2uqF?8mShkDQFcfF|ECcPfO>H zn6Bs^1#U&(vC2I~9>hIT;VGrJ$fotq*p~WiutOb3`H*wnkx|-XmkV6wJzw@xwv;^2 w&YzBvu8@62h5hL@eeu9hHnedJ(Vn59Rr5skL}j>98C1>XSUMh86Cs}HKRi4w>Hq)$ delta 585 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 C{kbFn delta 3027 zcmb7GYjBiT8Ghc~O?I>Sl91ipHoFPAhwNsP5D0;!0ivZPWOIQOl2n7UCQAsUNt*-& z9Vat7qx^Ezql0Ax#a6LeC;?rP0xeLag7kt_+6t{ui()HkZ? zzH@n>%X{9lUtjUe-LuYIfBXpm^QGGki=af!P060{haFZ2exhD+%yq2AqXtH?S7jvB zRU{&W#|-Sprv;AQ;i0kcz|g2**1CbgvB=1(NN;bXuQl?yQ3nnRmZ?jQG_}fE6aRAq zMJQGuIM>MIsx2`qc?$UnIEp9jctVh^RvOt317RE!_*A>$D|6t4AZ;`<80j6$8|ceh zH!^%*-loyW$f%RcM)YHw6H_>)E+!tAU#nfl?4sWYoLl)9Y-tJh^*M14>m7JeAf>wh zvVq^>!okbNq}X0Ja7FD*E|EW}lgU+ee-@-}2yYHoZWmzZl-)85HyC=3 z6I~*PSj4I}rPey*3=B%VAUH=|O3776;*yIT;^4$`J<(}MBAyk*4@QRi$JXmlNrog# zii&rYN~)@GHA$x0;u?>)i%(Fb&N+)xoZ=-=@ycvN@+4oyyNlurrPwY-s>+>FVv!O- z#+;_IkV$bcJk(#=G&C0JkBrpoRdWm}6TcdCSElo=+>oH;3lc^nW7@~2K6TuktK80F zb-}&GUCWVh@7TcR$erP>4p}5vq!yP;W^wxZQ8ZGxnaMem4=C1R_rRM*mv#O1@mJlvO2ExGD)#$pMoyv%B; zQ5~7>2@SAeF`QVU9?d*a*2LZlxS5oGw4f1fScR2X%l>+-#zw5cAi8ir?p52fCTe?J zkJygF+HDPVMDf#>@+oW*)YUH9B!2e)VySBTJTmbG1o1`GVI0fYZ^M_!{LARTSI~)V$kitraeQ`RJHEqK z_a4L!2-hw|3}bK_W0g0CagBH0@+b}weG}(fFo{IA@3CiN+jtmL-G^|v`2dc%jz{rS zC}0ZMx(6A-Y59(}_{*a>8O1NuId5RuH)!OyDB8DCOc)hxYYC!`FzWGL3b@Mz>gVWaU0CZ4!mt z$p7zSH%EWK)p;ao?h(L4?8G+tkekGop5?IiFrYnLf_OVZc3f50ax=%T&RExhd$=$r z(MM)3o?#4aVVCQAh~%|Kfk|P?_WMm4qGEH4JtkO)pS~v8apPhjDhalSkrJ?)y}qaz zp<9-^W!ChH0Buzp@{-0c5Z*btj4>Y1T*?`@Ry*lm;wNJ+B9bJHrxHmy3(cU?AW z_n`Q&c*naBNlt6fAC=soZ&C`PQW|9aFpKVwq7q==H0z~3aJ2HUeRIMTu>y0UxQ{+* ze#!`mgOx`+Q5={h3CI#B@8&pEh=IA1glb8_0!cOb#0sFUI6J^PNhnf5x3o94Qpu8I zA<%58lDU+onn85-T5oYs&#&fu?O+0I*8JvJO_6yre}-+1W-Gde#c^7{TNX?ry?*)t zyJaDBGka3%s%B0xQ_rlUEwS>c?;p?1{d2Unoa9eV$sH$O8FzL3=v|xc^%l%F0~}CYiG@LmGvVipER$m zrQB5?Wh<|Wm>6D|YUo^#EzqUcTp)L+_IbksNq6SQx%-_$wfa(WFD=qMjd0{Aq&tT z3(+WbSRwT$QEi2je(Fnv7Xro6^!Up*Mo*n9^dz0e*_&fz@_u1i)e31Qa1e?A5nKjO!q&8S L3xpx4ymb8sv!Q|u diff --git a/target/classes/top/qianxinyao/contentbasedrecommend/ContentBasedRecommender.class b/target/classes/top/qianxinyao/contentbasedrecommend/ContentBasedRecommender.class index bab11f3f17f3062ad47453b2dc634a142b9d026b..6ccea0293b689af31392a532697f2faaccae45bd 100644 GIT binary patch delta 190 zcmWNIF-rn*9EP9Y5V%B3Ajf5)pm2lOas**+k+ikCo*3vI;(SSkE*c&OM+7d4p5!HQ z!VP@`H@`%XL*GI0KRxfu^S*HdbIvtc;b}e`Q@KFjKKWvz50rYt!w@g;MED@dh)314Oeiv=tk~kq_6OpU{Kmx( jZWe03#K(%TVw5!rHl)~+#^i}#p7~Q(lP0@qFKFEXP!TTU diff --git a/target/classes/top/qianxinyao/contentbasedrecommend/UserPrefRefresher.class b/target/classes/top/qianxinyao/contentbasedrecommend/UserPrefRefresher.class index d581817d5100fb3d6b25456cd52eb3628e66f148..f952073b135b134ca37c548ac294be0009e2378a 100644 GIT binary patch literal 9313 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 N{B#l-qVOe>`X8q!qS62W literal 9235 zcmcgx33y!9b^ebu(i@GQWGoruF*XQeY*~^m435DgFJQ~IgcdKdEeselmY(H-(TteI z#w-OALbI@hgoHrTrcI%4lNPYkju)1YbRo@3RvHMDEi@r?PZu_;|GDqI(UUYbeEq)G z^7m%mz2}~L*8iM)=Uc~*Jqcim3|J@=EX}1yTCYvSQ`aR@`{U`>fpjY8q;k9BS!Xcg z45WvLoz!6K)~u7+m~nP*c6Mi+>>ej$AtX5E>iFJxYcif1YTdBwYG)uPsOeg}eP{oM z&Fy_Vd$;xoq?2Q7(y44Np2}^DC-Y7@H;)Ly?Q7TUT(e>ATGF&vu6lj9`6sAco=7Ef zD+T3^3$_VDYtn;G1m&1&qXxBtDcy;b)0-dOtx#6Lo5yjrnL4Orx-?GwFSFdI!Zy zXZH8RM+B#ile#0G-NRwZ+=Lbj&4Q_8DtVJO7Ge>-c#X5a&!OH^$8q2gSI@w?HWuSN zy3VtahL)PcY~oT_mFmRY!v0XQZmC9n|# z{Toi?oJ^dm3Z{<}veO%HtHuhfvcOoZ8)M+l+PDZ8Gd@$!byRbj&moWuZ5Gzh=w@lr zDQdg5Hr8Q1Bb)-$1)ev9D?L?%Ll&4x^<#1rLnwj{RkNEhHnvq?E|W+NtlNeNnTa_WBa~vOck?$^}!+1Wr z@=_byaT(d=((dF$8+u$UT;YeA;nYcV8dCVV@`FOxnmprqIB`8A+l}7{c3`cAxbGX2 zks5u~xJoTayUa>whFasP?A5KbR4Ze7Uph0`+U0&mFo4}QhE#k@V=g{SgxZ0GjjM4D z6JH@To=9a$uPGErOBW^E7F=dwcpQATr}M|>#EnIr~Rtcu{{_@sqT2+m?zYQ1`QA{9@zjwJI#iBxNxP`Q`Xw8>y= z`z{-I;7$g*D~F&lsHnHk<&)J~&>6wqxW~e${9H3ZxAwXLXGEdc#-~jU8ew+j`f~As zYqn(K1BB#=YT7xNC2A8+T*fA@0x-^aQz{Q;4b;^KD1AsHkSW{UCfuj zVjq==Yn84jG+;nKQx6z6%11+;mJh5hVhNWM(Dt!#dTHLtWblLxrk^Q~bg)t41J>9{ zc}OPJUTV1_c>)*nkpvNsfci1eycbr??vo{`(Sk{-t-(Y{(cKnT-Wk{@>~>I5!}QhWhf8 zhp(!+B(P*m&67sGE~_!1#I!VRu!W<9iLstx42Hm?4-Ca=a3EYtq%NgH3oQ-U*D zW;#=w@=j*IOVQ7Ew~w7g(%Fu8Tj^VFt{IyofO6S^q zJejS+)A(Bp-xSQ85XbB_oTNE?u<(5g-zM}8#?!1X6Fn9n_63utfw8A8pe+aDK{vO zpW1j#X{o$uF3)v(w4+hpwDFJX z-}3k%+r%CCXB+>b4R2+}8BXtI&(eW^v+?g*N-GAEPCOIFe~^7k82`l&HVDV?mW{XZ z4wodI)KG2@c{OTrK8E*f9LFdRMA`hVtm$&KfA8!J_B+1NA{6kZ`C%y+oIa@~DaOT$ zuvE}%Uc2G88c&O5OIWHXq2>TXqHbJ^?-f)l;bsR5rj}i|j!p6E)D|ALl8$CcNGG`k zYpd^AYBa1ztSYykHeRksq)eeJCj(=xY(B|SUBx6In=Tz(6u<=+N+twBFcTCJf>B!% z20ddb?d<{PB}&czSBV%ev=1slkoP4~p@WsV6m3AiUf+cVtx9NUyc#e*rrllVapETje%C?9&>-8h+Yh{2}heLZaC;_)B5m!BjEn`32f8gM*7nE z%z(2lq4$&1HL(=-H~W{Ti?k)fSzrxd#Vo^2RG^Y?mU#>Fy^3|zf3HTE-+B4T=M+-3 z@>BR((R3K695hSn_*4eKY}E5_ii?+WJEaRZ9l>b@%pO}G;S4a3Ld*~F z2nTqaNs0#2lu>jF5;~Q8oKnARG-nhOX_0(Gv|9&|9~;fGq{|n>Clm zA`89cJED;Sc0Pq2vFd0@DarDxm>so`Vi$LA?0?H;DOPvxFYnc%w}M%s%O5<98vq-bc2~2|6DZ$a9<}<8;A7l45(}$3cj;oo^znm4hXt}x`glPR zf;#+mx&dfm>?~rmEauqxY~3%w*;qz5#&90mcuTV!eSBVvRk#hS@hPmq{b3XK*hAEh3lWv-liCrjG0GsKI&o5q^hK zRZ`Y(;&<_T48uN3_(hI|Dg7t#`}hNDc^kXdFX0bSO--)BgLsIcem{2MkI1El^s8}z z&syr$hCjiVF@@51(H0M&lJYM$dsvjd0$;(OlJlR@g1gDrmH6SJ#E%puezYj@!J@>6 zxZaiXtCZ7~>CcNY{Y6ox0&2Yd4^gwj-0KxYM(LbN3u57jg(m<13SgAU6`4F?VYNjM zS=^B%TTpu<5<|Gc!sQlrSh&h8cn=)l4?V};!jw@a>-+MrDlOZ)IF0;9dC?v&wLLdk zts33^wt=C!CxV+f6X9l%dO0QGhQC-$fSWb6y28!j=A(FAcvO9&r={-e1^ngx2pv3x zzcI=69VQp^&jpL`^*)9Ug2)eJp@l9YR34B$#e{r1R#EpO0#HQ(KRJTGb5qU(EaK6x zig-lCiG~$w2rq;h-6(1u!He9h?qzPKQ@wSsy4#XrbpgMqd!3R!fbIJ7OBV!fMFT>U z0l{Oj8iGrWfiFd#X}kmyjbG2nkvsi;LHD&W6Eg9W@xx_W_6tu*yg zW{AuTH&A1TT>PpiNTq==AGnU+djMfA3wIr)JAryRNC2BA51UUH$nGL!0mDqg6hk3R z5V;o3yysqmJd<}XHZbY8<2nY)e(d4(bq+V;7TiQgxS0uj3jyp_JdO_&IBvu9_$Xc@ zG`@+C;Vs-M<@lsTafh76&t}{u=i+YZ#eTUI_sEU-v^h)q1vO?%$*HVLTGf+3kR;eYOh3(Qs82uc< z#*tM9?y9K4a~`1Gg73*G2GEY;5}8V%vZ=>nspHxjYIBCv(=N5tAuQ84W>dDBH+szpBaqpWX5 z%qmTcbdHiu(+9EPmDEi-Jv*1U)8nv&cf<~EbA}Y`VA5rqkpI6 zQF3+>sYzP`VoC*`U=}{fhWu;nte;}*{dKk~-@wKE?BduK-eW3SxJKRP8MT5xx=t7T54sa6TJIRVFLdUS+dbj`dLShIBU_mQ@A0xTjuL(?$&%-3#3k#(*}~>h)_v zFGq|?URbC_fL)fME;nyl65Mt5((YzO?;%;|W=j{dg;b{cN>420r;}P+8*=u;-G2F% z^|6X()?Vo)JN?|CkIknuM%Aj(n?07?=#1L*tZO5m56(MQ=Y%cG{qcnR||UM(g} zukp}#X_;r})gLf@eu$}THy82q0{oPX@w04Vf5sZ~Jd@_WiWhV~))?><7>7v&O0 z)oXmy2GqrHO*NMXn|zPQA&!`pa+T-#jj)bms*A7$)LElUbr+(UZ!Y+HS@#Y)MhWO4 WKN)pWQIb&N4tW_S5;w83>wf?qUWKy& diff --git a/target/classes/top/qianxinyao/hotrecommend/HotRecommender.class b/target/classes/top/qianxinyao/hotrecommend/HotRecommender.class index a427fe6a96774400470659e23119741559f7d9da..d0296054518df36ab0379a0db326a07755c6e456 100644 GIT binary patch delta 194 zcmbQGF-v0uhd`(igD-aOw1KofLl{s~1cMKd4rPb}S{cKT52Py?;uxxdj;LWsWN2VWp4=j| nkuiO;nXn0C&g5+2D8WJoR)!)5UZC?t8A=#r8A>N#6LtXr+K?%X delta 194 zcmbQGF-v0uhd`(ygD-;-Lp*~aLpp;ALotIHLmz`V!*m7aNw1KofLnu%~ID-$64rPc0S{cod52Py?Vi~F#;uvZe5*Qj7k|wtZ nZDdTFY$j~Nm_0dLI7+a9ft8_