package cn.com.chenyixiao.rrs.controller;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
import org.apache.mahout.cf.taste.impl.model.GenericDataModel;
import org.apache.mahout.cf.taste.impl.model.GenericUserPreferenceArray;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
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.recommender.svd.ALSWRFactorizer;
import org.apache.mahout.cf.taste.impl.recommender.svd.SVDRecommender;
import org.apache.mahout.cf.taste.impl.similarity.AveragingPreferenceInferrer;
import org.apache.mahout.cf.taste.impl.similarity.EuclideanDistanceSimilarity;
import org.apache.mahout.cf.taste.impl.similarity.LogLikelihoodSimilarity;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.impl.similarity.TanimotoCoefficientSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.model.PreferenceArray;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.google.gson.Gson;
import cn.com.chenyixiao.rrs.entity.Food;
import cn.com.chenyixiao.rrs.entity.Preference2d;
import cn.com.chenyixiao.rrs.entity.RestaurantFood;
import cn.com.chenyixiao.rrs.entity.User;
import cn.com.chenyixiao.rrs.service.Preference2dService;
import cn.com.chenyixiao.rrs.service.RestaurantFoodService;
import cn.com.chenyixiao.rrs.service.UserService;
import cn.com.chenyixiao.rrs.vo.RecommendResult;
import cn.com.chenyixiao.rrs.vo.RecommendResultVO;
@Controller
@RequestMapping(produces="application/json;charset=UTF-8")
public class RecommendController {
private static final String filePath = "./rrs/data/dianping_user-restaurant.csv";
@Autowired
private Preference2dService preference2dService;
@Autowired
private UserService userService;
@Autowired
private RestaurantFoodService restaurantFoodService;
@ResponseBody
@RequestMapping(value = "/recommend/user/{userId}", method = RequestMethod.GET)
public String recommend(@PathVariable Long userId
) throws TasteException, IOException {
DataModel dataModel = getFileDataModel();
UserSimilarity userSimilarity =
// new PearsonCorrelationSimilarity(dataModel); //皮尔逊相关系数
// new EuclideanDistanceSimilarity(dataModel); //欧氏距离
// new TanimotoCoefficientSimilarity(dataModel); //谷本系数
new LogLikelihoodSimilarity(dataModel); //对数似然比
// userSimilarity.setPreferenceInferrer(new AveragingPreferenceInferrer(dataModel));
UserNeighborhood userNeighborhood =
new NearestNUserNeighborhood(10, userSimilarity, dataModel);
Recommender recommender =
//new GenericUserBasedRecommender(dataModel, userNeighborhood, userSimilarity);
new SVDRecommender(dataModel, new ALSWRFactorizer(dataModel, 10, 0.05, 10));
List<RecommendedItem> recommendedItems =
recommender.recommend(userId, 10);
Gson gson = new Gson();
List<RecommendResultVO> recommendResultVOs =
new ArrayList<RecommendResultVO>(recommendedItems.size());
for (int i = 0; i < recommendedItems.size(); i++) {
RecommendResultVO recommendResultVO = new RecommendResultVO();
recommendResultVO.setRestaurantId(recommendedItems.get(i).getItemID());
recommendResultVO.setScore(recommendedItems.get(i).getValue());
recommendResultVOs.add(i, recommendResultVO);
}
return gson.toJson(recommendResultVOs);
}
@ResponseBody
@RequestMapping(value = "/recommend/user/{userId}/food/{foodId}", method = RequestMethod.GET)
public String recommendByFood(@PathVariable Long userId, @PathVariable Long foodId
) throws TasteException, IOException {
DataModel dataModel = getFileDataModel();
UserSimilarity userSimilarity =
new LogLikelihoodSimilarity(dataModel); //对数似然比
UserNeighborhood userNeighborhood =
new NearestNUserNeighborhood(10, userSimilarity, dataModel);
Recommender recommender =
new SVDRecommender(dataModel, new ALSWRFactorizer(dataModel, 10, 0.05, 10));
List<RecommendedItem> recommendedItems =
recommender.recommend(userId, 1000);
Gson gson = new Gson();
List<RecommendResultVO> recommendResultVOs =
new ArrayList<RecommendResultVO>();
for (int i = 0; i < recommendedItems.size(); i++) {
List<RestaurantFood> rfList = restaurantFoodService.
getRestaurantFoodsByRestaurantId(recommendedItems.get(i).getItemID());
for (RestaurantFood restaurantFood : rfList) {
if (restaurantFood.getFoodId() == foodId) {
RecommendResultVO recommendResultVO = new RecommendResultVO();
recommendResultVO.setRestaurantId(recommendedItems.get(i).getItemID());
recommendResultVO.setScore(recommendedItems.get(i).getValue());
recommendResultVOs.add(recommendResultVO);
}
}
}
return gson.toJson(recommendResultVOs);
}
@ResponseBody
@RequestMapping(value = "/recommend", method = RequestMethod.GET)
public String recommendAll() throws TasteException, IOException {
DataModel dataModel = getFileDataModel();
UserSimilarity userSimilarity =
new PearsonCorrelationSimilarity(dataModel);
UserNeighborhood userNeighborhood =
new NearestNUserNeighborhood(2, userSimilarity, dataModel);
Recommender recommender =
// new GenericUserBasedRecommender(dataModel, userNeighborhood, userSimilarity);
new SVDRecommender(dataModel, new ALSWRFactorizer(dataModel, 10, 0.05, 10));
List<User> users = userService.getAllUsers();
List<RecommendResult> recommendResults = new ArrayList<RecommendResult>();
for (int i = 0; i < users.size(); i++) {
List<RecommendedItem> recommendedItems =
recommender.recommend(users.get(i).getId(), 10);
if (!recommendedItems.isEmpty()) {
RecommendResult recommendResult = new RecommendResult();
recommendResult.setUserId(users.get(i).getId());
List<RecommendResultVO> recommendResultVOs = new ArrayList<RecommendResultVO>();
for (int j = 0; j < recommendedItems.size(); j++) {
RecommendResultVO recommendResultVO = new RecommendResultVO();
recommendResultVO.setRestaurantId(recommendedItems.get(j).getItemID());
recommendResultVO.setScore(recommendedItems.get(j).getValue());
recommendResultVOs.add(j, recommendResultVO);
}
recommendResult.setRecommendResultVOs(recommendResultVOs);
recommendResults.add(recommendResult);
}
}
Gson gson = new Gson();
return gson.toJson(recommendResults);
}
private DataModel getGenericDataModel() {
FastByIDMap<PreferenceArray> preferences =
new FastByIDMap<PreferenceArray>();
List<User> users = userService.getAllUsers();
for (int j = 0; j < users.size(); j++) {
List<Preference2d> preference2ds =
preference2dService.getPreferencesByUserId(users.get(j).getId());
PreferenceArray prefsForUser =
new GenericUserPreferenceArray(preference2ds.size());
prefsForUser.setUserID(j, users.get(j).getId());
for (int i = 0; i < preference2ds.size(); i++) {
prefsForUser.setItemID(i, preference2ds.get(i).getRestaurant
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
rrs-master.zip (58个子文件)
rrs-master
pom.xml 5KB
src
main
resources
application.properties 343B
hibernate.cfg.xml 716B
hibernate.reveng.xml 317B
java
cn
com
chenyixiao
rrs
controller
Preference3dController.java 2KB
DataController.java 5KB
UserController.java 2KB
SearchController.java 5KB
RecommendController.java 9KB
dao
Preference2dDAO.java 533B
BaseDAO.java 279B
Preference3dDAO.java 628B
RestaurantDAO.java 440B
FoodDAO.java 396B
UserDAO.java 400B
impl
Preference3dDAOImpl.java 3KB
RestaurantDAOImpl.java 2KB
FoodDAOImpl.java 2KB
Preference2dDAOImpl.java 2KB
RestaurantFoodDAOImpl.java 2KB
UserDAOImpl.java 2KB
RestaurantFoodDAO.java 579B
service
RestaurantService.java 448B
Preference2dService.java 541B
Preference3dService.java 611B
UserService.java 408B
FoodService.java 468B
RestaurantFoodService.java 588B
impl
RestaurantFoodServiceImpl.java 2KB
UserServiceImpl.java 1KB
Preference2dServiceImpl.java 1KB
RestaurantServiceImpl.java 1KB
FoodServiceImpl.java 2KB
Preference3dServiceImpl.java 2KB
entity
RestaurantFood.java 1KB
Restaurant.java 1KB
Preference3d.java 2KB
Food.java 977B
Preference2d.java 2KB
User.java 924B
test
lucene
Indexer.java 2KB
Searcher.java 2KB
recommendation
RecommenderIntro.java 2KB
RecommenderIRStatsEvaluatorTest.java 2KB
RecommenderEvaluatorTest.java 2KB
init
Initializer.java 1KB
WebAppConfig.java 3KB
util
Indexer.java 2KB
DataLoader.java 2KB
vo
FoodVO.java 581B
RecommendResult.java 728B
SearchResult.java 995B
Rrs.java 2KB
PreferenceVO.java 1009B
Counter.java 1KB
RecommendResultVO.java 549B
webapp
WEB-INF
web.xml 341B
META-INF
MANIFEST.MF 36B
共 58 条
- 1
资源评论
博士僧小星
- 粉丝: 1924
- 资源: 5892
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功