Mahout框架笔记
mahout碎片式笔记,记录一下代码
结合 Mahout
pom.xml
引入依赖
<!--引入推荐引擎mahout,注意要先全部引入,再使用exclusion标签-->
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-mr</artifactId>
<version>0.12.2</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jcl</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<artifactId>jersey-client</artifactId>
<groupId>com.sun.jersey</groupId>
</exclusion>
<exclusion>
<artifactId>jersey-core</artifactId>
<groupId>com.sun.jersey</groupId>
</exclusion>
<exclusion>
<artifactId>jersey-apache-client4</artifactId>
<groupId>com.sun.jersey.contribs</groupId>
</exclusion>
</exclusions>
</dependency>
mapper
查询方法
编写@Mapper
public interface UseroperationnewMapper extends BaseMapper<Useroperationnew>{
@Select("SELECT user_id,new_id,SUM( CASE operation_type WHEN 0 THEN 3 WHEN 1 THEN 3 WHEN 2 THEN 5 ELSE 0 END ) AS value FROM useroperationnew GROUP BY user_id,new_id ORDER BY user_id")
public List<Useroperationnew> getAllUserPreference();
}
调用协同过滤算法
public List<Long> recommend( Integer userId) throws TasteException {
List<UserArticleOperation> userList = userArticleOperationMapper.getAllUserPreference();
//创建数据模型
DataModel dataModel = this.createDataModel(userList);
//获取用户相似程度
UserSimilarity similarity = new UncenteredCosineSimilarity(dataModel);
//获取用户邻居
UserNeighborhood userNeighborhood = new NearestNUserNeighborhood(2, similarity, dataModel);
//构建推荐器
Recommender recommender = new GenericUserBasedRecommender(dataModel, userNeighborhood, similarity);
//推荐2个
List<RecommendedItem> recommendedItems = recommender.recommend(userId, 5);
List<Long> itemIds = recommendedItems.stream().map(RecommendedItem::getItemID).collect(Collectors.toList());
return itemIds;
}
private DataModel createDataModel(List<UserArticleOperation> userArticleOperations) {
FastByIDMap<PreferenceArray> fastByIdMap = new FastByIDMap<>();
Map<Integer, List<UserArticleOperation>> map = userArticleOperations.stream().collect(Collectors.groupingBy(UserArticleOperation::getUserId));
Collection<List<UserArticleOperation>> list = map.values();
for(List<UserArticleOperation> userPreferences : list){
GenericPreference[] array = new GenericPreference[userPreferences.size()];
for(int i = 0; i < userPreferences.size(); i++){
UserArticleOperation userPreference = userPreferences.get(i);
GenericPreference item = new GenericPreference(userPreference.getUserId(), userPreference.getArticleId(), userPreference.getValue());
array[i] = item;
}
fastByIdMap.put(array[0].getUserID(), new GenericUserPreferenceArray(Arrays.asList(array)));
}
return new GenericDataModel(fastByIdMap);
}
- 结合 Mahout
- pom.xml引入依赖
- 编写mapper查询方法
- 调用协同过滤算法