diff --git a/README.md b/README.md index 09f0663553cc034abbfddff3ca7e4ec2ac917d8f..2469aeb75615610072dd52c74d15c9bacfd69398 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 e68a93941e5d77dcdfcc964ff1762c5a02a5a78f..6e2e9b155062e0ab4250c064af4d5d26c25bc894 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 c3b09757d6effb4bce29699efcdef5ff72ad6881..654a53e71fa77fbf60c56d1013e5ccef6e98d478 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 109a9f7203bd154f2a24061650804617e055d415..2d0cd696526cbc76120d283657e61fd30d7be34d --- 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 b999feafea1b35e01bc364f82ac9388d5c33ac74..244929cc530b18e4d78c601ebf57e86c3cbe6bc3 --- 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 3c1af3131295a52f378475afc58f65d4f89bfab0..adc593600a4bc0d95e77b534a0b55564b45d1770 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 82fc08e3db111d42b76110cdef896023b0a5f4bc..777cf6a875c9b94a6cd9b9d37783fa041c61a0bb 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 f795e3898c6a4a5652972bf0f4477c4038f5cc73..0c16466f6f9dc91f8f6b7bf13360e4183211e66f 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 120e98206a5fd61f0b9e7254dd576cba31e80ed7..b1edd62c2b31dca6d5136d3cc8b2fc416e037700 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 dfeae32a20c7a2b774ae6b16113414517deff584..c3cdd3d8e1ea384a5615e2198f4eb6e32bedd8e0 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 8cd7b5c4d0697abbe0ba50ff415035a5fa12998e..41adcea89fd55b42d83aa1dec977dbc0a69543ce 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 e68a93941e5d77dcdfcc964ff1762c5a02a5a78f..6e2e9b155062e0ab4250c064af4d5d26c25bc894 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 0000000000000000000000000000000000000000..33aa0f450282083a6f51bdc9652ee5ff67b262b6 --- /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 0000000000000000000000000000000000000000..534e8ed81e75b1015f00a411145a6d13be007981 --- /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 0000000000000000000000000000000000000000..1e775f711b7ed73e8df381da7f5fa922dee77da9 --- /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 Binary files a/target/classes/top/qianxinyao/Main/Main.class and b/target/classes/top/qianxinyao/Main/Main.class differ diff --git a/target/classes/top/qianxinyao/Main/TestDataRunner.class b/target/classes/top/qianxinyao/Main/TestDataRunner.class index 01949fa585cda66c5706035ebf969dbc6eba9016..636f202b55dfb8f8aa1ae4a796e144e037b2599b 100644 Binary files a/target/classes/top/qianxinyao/Main/TestDataRunner.class and b/target/classes/top/qianxinyao/Main/TestDataRunner.class differ diff --git a/target/classes/top/qianxinyao/algorithms/JsonKit$3.class b/target/classes/top/qianxinyao/algorithms/JsonKit$3.class index 92e78098e08d0897a8dc64c4ae015ea2c20ab21f..ad08cb1c036b421b62f8d46b74e35d067c6fdcf6 100644 Binary files a/target/classes/top/qianxinyao/algorithms/JsonKit$3.class and b/target/classes/top/qianxinyao/algorithms/JsonKit$3.class differ diff --git a/target/classes/top/qianxinyao/algorithms/JsonKit.class b/target/classes/top/qianxinyao/algorithms/JsonKit.class index b25fdba83a4a8f6d9427321f1ec947509c969f14..08f39e40d4f1adc9612639354e8169f8fff3bb67 100644 Binary files a/target/classes/top/qianxinyao/algorithms/JsonKit.class and b/target/classes/top/qianxinyao/algorithms/JsonKit.class differ diff --git a/target/classes/top/qianxinyao/algorithms/RecommendKit.class b/target/classes/top/qianxinyao/algorithms/RecommendKit.class index 6b0c87acef3c0a1422f2ff91b3d8e3c09fdaf462..75fc9353bfc983225b006f07bdb90a0f905392a5 100644 Binary files a/target/classes/top/qianxinyao/algorithms/RecommendKit.class and b/target/classes/top/qianxinyao/algorithms/RecommendKit.class differ diff --git a/target/classes/top/qianxinyao/contentbasedrecommend/ContentBasedRecommender.class b/target/classes/top/qianxinyao/contentbasedrecommend/ContentBasedRecommender.class index bab11f3f17f3062ad47453b2dc634a142b9d026b..6ccea0293b689af31392a532697f2faaccae45bd 100644 Binary files a/target/classes/top/qianxinyao/contentbasedrecommend/ContentBasedRecommender.class and b/target/classes/top/qianxinyao/contentbasedrecommend/ContentBasedRecommender.class differ diff --git a/target/classes/top/qianxinyao/contentbasedrecommend/UserPrefRefresher.class b/target/classes/top/qianxinyao/contentbasedrecommend/UserPrefRefresher.class index d581817d5100fb3d6b25456cd52eb3628e66f148..f952073b135b134ca37c548ac294be0009e2378a 100644 Binary files a/target/classes/top/qianxinyao/contentbasedrecommend/UserPrefRefresher.class and b/target/classes/top/qianxinyao/contentbasedrecommend/UserPrefRefresher.class differ diff --git a/target/classes/top/qianxinyao/hotrecommend/HotRecommender.class b/target/classes/top/qianxinyao/hotrecommend/HotRecommender.class index a427fe6a96774400470659e23119741559f7d9da..d0296054518df36ab0379a0db326a07755c6e456 100644 Binary files a/target/classes/top/qianxinyao/hotrecommend/HotRecommender.class and b/target/classes/top/qianxinyao/hotrecommend/HotRecommender.class differ diff --git a/test_data.sql b/test_data.sql old mode 100644 new mode 100755