引入依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<!--引入推荐引擎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>

创建对应的实体类

1
2
3
4
5
6
7
8
9
10
11
12
public class UserItemOperation implements Serializable  {

private static final long serialVersionUID = 1L;


private Long userId;

private Long itemId;

private Integer value;

}

创建对应的Xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<mapper namespace="com.dao.UserItemDao">

<select id="getAllUserPreference" resultType="com.entity.UserItemOperation">
SELECT
a.id userid,
c.id itemId,
count( a.id ) `value`
FROM
yonghu a
JOIN gangweishenqing b ON a.yonghuming = b.yonghuming join zhaopinxinxi c on
b.zhaopingangwei = c.zhaopingangwei
GROUP BY
a.id,
b.qiyezhanghao
</select>
</mapper>

基于用户的推荐算法代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@Service
public class RecommendUtil {


@Autowired
private UserItemDao userItemDao;

public List<Long> recommend(Long userId) throws TasteException {
List<UserItemOperation> userList = userItemDao.getAllUserPreference();
//创建数据模型
System.out.println(userList);
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<UserItemOperation> userItemOperations) {
FastByIDMap<PreferenceArray> fastByIdMap = new FastByIDMap<>();
Map<Long, List<UserItemOperation>> map = userItemOperations.stream().collect(Collectors.groupingBy(UserItemOperation::getUserId));
Collection<List<UserItemOperation>> list = map.values();
for(List<UserItemOperation> userPreferences : list){
GenericPreference[] array = new GenericPreference[userPreferences.size()];
for(int i = 0; i < userPreferences.size(); i++){
UserItemOperation userPreference = userPreferences.get(i);
System.out.println(userPreference);
GenericPreference item = new GenericPreference(userPreference.getUserId(), userPreference.getItemId(), userPreference.getValue());
array[i] = item;
}
fastByIdMap.put(array[0].getUserID(), new GenericUserPreferenceArray(Arrays.asList(array)));
}
return new GenericDataModel(fastByIdMap);
}
}

基于物品的推荐算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@Service
public class RecommendUtil {

@Autowired
private UserItemDao userItemDao;

public List<Long> recommend(Long userId) throws TasteException {
List<UserItemOperation> userList = userItemDao.getAllUserPreference();
// 创建数据模型
DataModel dataModel = this.createDataModel(userList);
// 获取物品相似程度
ItemSimilarity similarity = new UncenteredCosineSimilarity(dataModel);
// 构建推荐器
Recommender recommender = new GenericItemBasedRecommender(dataModel, similarity);
// 推荐5个
List<RecommendedItem> recommendedItems = recommender.recommend(userId, 5);
List<Long> itemIds = recommendedItems.stream().map(RecommendedItem::getItemID).collect(Collectors.toList());
return itemIds;
}

private DataModel createDataModel(List<UserItemOperation> userItemOperations) {
FastByIDMap<PreferenceArray> fastByIdMap = new FastByIDMap<>();
Map<Long, List<UserItemOperation>> map = userItemOperations.stream().collect(Collectors.groupingBy(UserItemOperation::getUserId));
Collection<List<UserItemOperation>> list = map.values();
for (List<UserItemOperation> userPreferences : list) {
GenericPreference[] array = new GenericPreference[userPreferences.size()];
for (int i = 0; i < userPreferences.size(); i++) {
UserItemOperation userPreference = userPreferences.get(i);
GenericPreference item = new GenericPreference(userPreference.getUserId(), userPreference.getItemId(), userPreference.getValue());
array[i] = item;
}
fastByIdMap.put(array[0].getUserID(), new GenericUserPreferenceArray(Arrays.asList(array)));
}
return new GenericDataModel(fastByIdMap);
}
}