【计算机毕业设计】Java基于协同过滤算法的音乐推荐系统

毕设帮助、开题指导、源码交流,联系方式见文末。。
音乐检索系统的开发目的是使音乐检索模式转变成信息管理,为音乐检索人员提供方便条件。对音乐检索的实际情况进行调研之后,进行详细的需求分析,对现有的管理模式进行改进,开发出一套新型的管理系统,从中领悟系统开发的思想,掌握系统开发的流程和方法。音乐检索系统的实施的现实意义:减少管理音乐检索的工作人员;检索人员可以随时浏览查看,而且更加直观;改变了以前手工记录的方式,电脑录入更加方便快捷;实现了音乐检索的计算机化。
在这里插入图片描述
在这里插入图片描述

音乐推荐算法:

/**
	 * 获取w2dNetwork矩阵中横轴对应下标的文档节点
	 * 这里用歌曲Id表示文档节点
	 * @param index
	 * @param engSongList
	 * @return
	 * 文档节点(歌曲Id)
	 */
	public static int getW2DNode(int index, List<Song> songList) {
		return songList.get(index).getSongId();
	}

	public static Map<String, int[]> constructW2DN(Set<String> wordSet, List<Song> engSongList,
			ServletContext servletContext) {
		Map<String,int []> w2dNetwork=new HashMap<String, int[]>();
		Iterator<String> iterator=wordSet.iterator();
		while(iterator.hasNext()) {
			//当前单词节点
			String curWord=iterator.next();
			//邻接文档节点权重数组,0表示节点没有连接
			int weightArray[]=new int[engSongList.size()];
			int arrayIndex=0;
			int curWordLen=curWord.length();
			for(Song song:engSongList) {
				//计算当前单词在每个文档中出现的次数
				int cnt=0;
				/**
				 * 获取当前文档的内容
				 * 这里采用一个文档一个文档的重复读取
				 * 虽然增加了IO的负担,避免文档数量过大,一次性读入,内存开销太大
				 */
				StringBuilder documentSb=readContentSb(servletContext.getRealPath(song.getLyricAddress()));
				int indexOfCurWord=0;
				while(true) {
				    indexOfCurWord=documentSb.indexOf(curWord,indexOfCurWord);
				    //找不到了
				    if(indexOfCurWord==-1) {
				    	break;
				    }
				    cnt++;
					indexOfCurWord+=curWordLen;
				}
				weightArray[arrayIndex++]=cnt;
			}
			w2dNetwork.put(curWord, weightArray);
		}
		
		return w2dNetwork;
	}

/**
	 * 获取	累计权重 to 边 的映射表. 
	 * 这里简单地根据权重来采样,即权重高的边被采集到的可能性更大
	 * 如 Edge_1:1,Edge_2:2,Edge_3:3,Edge_4:4,那么
	 * 所有权重的长度和为10,即
	 * 0-1为Edge_1
	 * 1-3为Edge_2
	 * 3-6为Edge_3
	 * 6-10为Edge_4
	 * 现在随机产生一个0-10之间的数字(色子),如果落在区间1-3内,则采用的边为Edge_2.
	 * 此方法并不是最佳方法,这里只是简单的采用这种方式
	 * @param w2wNetwork
	 * 歌词到歌词网络
	 * @param wordSet
	 * 歌词节点集合
	 * @param bipartiteSetA 
	 * 双边网络A集合
	 * @return
	 */
	public static Map<Integer, Edge<String, String>> getWeight2EdgeTableW2W(final Map<String, int[]> w2wNetwork,
			final Set<String> wordSet, Set<String> bipartiteSetA) {
		//整理权重表key-累计的权重和
		final Map<Integer,Edge<String,String>> weight2EdgeTableW2W=new TreeMap<Integer, Edge<String, String>>();
		bipartiteSetA.forEach(new Consumer<String>() {

			//对于从双边网络A发出的每一条边
			public void accept(String node_i) {
				//获取邻接关系数组
				int relatedArray[]=w2wNetwork.get(node_i);
				for(int j=0;j<relatedArray.length;j++) {
					//对于和当前节点有连边的节点
					if(relatedArray[j]>0) {
						String node_j=W2WNetwork.getW2WNode(j,wordSet);
						//创建边
						Edge<String,String> edge=new Edge<String,String>(node_i,node_j,relatedArray[j]);
						weightSumW2W+=relatedArray[j];
						weight2EdgeTableW2W.put(weightSumW2W, edge);
					}
				}
			}
			
		});
		
		return weight2EdgeTableW2W;
	}

程序效果图:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
目录
第一章 引言 1
1.1项目开发的背景 1
1.2项目开发的意义 1
第二章 系统分析 3
2.1可行性分析 3
2.1.1 技术可行性 3
2.1.2 经济可行性 3
2.1.3 社会可行性 3
2.2系统功能分析 4
2.3 数据字典 5
第三章 系统设计 7
3.1 总体设计原则 7
3.2系统数据库设计 7
3.2.1数据库的安全性和完整性要求 7
3.2.2 E-R图 8
3.2.3数据表 10
第四章 系统实现 14
4.1前台模块 14
4.1.1首页 14
4.1.2用户注册界面 14
4.1.3 音乐下载界面 15
4.1.4 发布评论界面 15
4.1.5 音乐推荐 15
4.2 后台模块 22
4.2.1 登录界面 22
4.2.2 音乐管理界面 23
4.2.3 会员管理界面 23
4.2.4 评论管理界面 24
4.2.5 音乐播放界面 24
第五章 系统测试 25
第六章 结束语 27
参考文献 28
致谢 29

最后

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一点毕设

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值