环境要求
- 使用java语言进行开发,基于Jdk8版本。
- Mysql使用8版本,估相关配置和类实现针对8版本。
- 前端使用Vue进行开发。
图片展示
歌手信息管理
歌曲信息管理
歌单信息管理
榜单信息管理
用户信息管理
歌曲播放
排行榜
歌单
基于Mahout进行协同过滤推荐
前期准备
- jar包准备(maven管理),我们需要将Mahout用到的核心Jar包从maven仓库中下载下来。
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-core</artifactId>
<version>0.9</version>
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-integration</artifactId>
<version>0.9</version>
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-math</artifactId>
<version>0.9</version>
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-examples</artifactId>
<version>0.9</version>
</dependency>
- 数据准备
数据可以从各类文本文档中读取,也可以使用从Mysql中读取。本文使用Mysql实现。
核心数据表创建语句
-- ----------------------------
-- Table structure for rank
-- ----------------------------
DROP TABLE IF EXISTS `rank`;
CREATE TABLE `rank` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`consumerId` bigint(20) unsigned NOT NULL,
`songListId` bigint(20) unsigned NOT NULL,
`score` float unsigned NOT NULL DEFAULT '0.0',
`time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '时间',
PRIMARY KEY (`id`),
UNIQUE KEY `unique` (`consumerId`,`songListId`),
INDEX consumerId (`consumerId`),
INDEX songListId (`songListId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
注意:
- consumerId == userId,也就是用户Id
- songListId == ItemId,也就是项目Id
- score == rateing,也就是用于评分的字段
- time == 创建评论的时间
- 最好对consumerId和songListId尽力索引,因为Mahout查询比较慢,代码改进方法可以参考其他方法。本文只给实现。
核心类讲解
- 构造数据模型JDBCDataModel
- 算法计算用户相似度UserSimilarity
- 计算用户的邻居UserNeighborhood
- 得到推荐结果Recommender
代码展示
public List<RecommendedItem> userBasedRecommender(int userId, int size) throws TasteException, IOException {
//构造数据模型
JDBCDataModel model = getDataModel();
//DataModel model = new FileDataModel(new File("/Users/zhangbolin/data"));
//算法计算用户相似度
UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
//计算用户的“邻居”,这里将与该用户最近距离为3的用户设置为该用户的“邻居”
UserNeighborhood neighborhood = new NearestNUserNeighborhood(5, similarity, model);
//Recommender recommender = new CachingRecommender(new GenericUserBasedRecommender(model, neighborhood, similarity));
Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);
//得到推荐的结果,size是推荐结果的数目
List<RecommendedItem> recommendations = recommender.recommend(userId, size);
for (RecommendedItem recommendation : recommendations) {
System.out.println(recommendation);
}
return recommendations;
}
推荐结果
有需要的同学们可以+企鹅286322812