基于网易云音乐评论的用户推荐系统(全)

本文介绍如何使用Python和R语言处理网易云音乐评论数据,包括文本预处理、分词、构建文档-词条矩阵及计算TF-IDF值,最终实现用户推荐系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

640?wx_fmt=jpeg


伪文艺Boy,Python、R、Java爱好者,喜欢新鲜感,一个简单、纯粹的IT小伙。

博客:https://blog.youkuaiyun.com/striver6

本文作者已加入Python中文社区专栏作者计划

番外篇一:用Python挖掘网易云音乐的热门歌单

番外篇二:基于网易云音乐评论的用户推荐系统(文本处理)

一、相似用户推荐(Python之sklearn版本)

1.1 sklearn

Scikit-learn (formerly scikits.learn) is a free software machine learning library for the Python programming language.It features various classification, regression and clustering algorithms including support vector machines, random forests, gradient boosting, k-meansand DBSCAN, and is designed to interoperate with the Python numerical and scientific libraries NumPy and SciPy.

1.2 文本预处理

导入之前处理过好的数据:

1.import os  
2.os.chdir('G:\\项目\\网易云音乐评论\\文本挖掘')    
3.import pandas as pd  
4.data = pd.read_csv(r"DealtedData.csv",encoding='gbk', sep=',',index_col=0,header=0)  

分词:

1.import jieba  
2.def chinese_word_cut(mytext):  
3.    return " ".join(jieba.cut(mytext))  
4.d=pd.DataFrame(data['context'].astype(str))  
5.d["title_cutted"] = d['context'].apply(chinese_word_cut)  
6.d.title_cutted.head()  

可得分析结果为:

1.328901978                        都 是 有 故事 的 人  
2.1724358802                  每天 都 要 听 至爱 Danny  
3.451250610     对 呀 , 你 就 从来 没 喜欢 过 我 。 一点 都 煤油  
4.554348857                          沁入 心脾 的 温柔  
5.1296389446                       最近 好 喜欢 这 首歌  
6.Nametitle_cutteddtypeobject  

接下来我们对这些本文做向量化,所谓文本向量化,指的就是形成一个28197(文档个数)*n(文本中所有词的数量)的0-1矩阵,特定词在这个文档出现记为1,否则为0。若选取所有词的话,这必然是一个很大的矩阵,因此在之前的操作中,本文从所有的词中选取了1000关键词。

1.from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer  
2.vectorizer = CountVectorizer()  
3.count = vectorizer.fit_transform(d.title_cutted)  
4.print(vectorizer.get_feature_names())    

查看所有文本的关键字

1.[...'不是''不是故意''不曾''不會''不會來''不服''不服输''不期而遇''不来''不染''不欠''不欢''不欢而散''不止''不正''不死''不死心''不求''不浮''不溜提''不满''不潮''不点''不烦''不然''不燥''不爱''不理''不甘''不甘示弱''不生''不用''不用谢''不由得''不由自主''不留''不疼''不痛''不相误''不看''不眠''不知''不知不觉''不知好歹''不知情''不知所措''不知所谓''不禁''不离''不算''不算什么''不管''不管怎样''不纯''不经意''不绕''不羁''不老''不耐烦''不肯''不胜枚举''不能''不能不''不能不要''不能治愈''不能自已''不能自拔''不腻''不至于''不舍''不苦''不蓝''不行''不衰''不要''不要脸''不见''不論''不计''不让''不记''不讲道理''不许''不论''不论什么''不识抬举''不识曲''不该''不说''不谢''不负''不败''不起''不足''不躁''不输给''不辞而别''不过''不远''不远千里''不适''不通''不配''不错''不长''不问''不间断''不需''不靠''不须''不顾''不高''与其''与其说是''与否''与子偕老''与我无关''与生俱来''丑小鸭''专一''专业''专业课''专场''专注''专用''专辑''专门''世上''世事''世人''世俗''世情''世無雙''世界''世界杯''世界观''世纪''世荣''世间''业生''东京''东北''东南亚''东方''东方人''东方文化''东流''东渡''东皇钟''东西''东邪西毒''东风破''丝滑''丢失''丢掉''丢脸''两三次''两个''两人''两人同''两件''两伙''两位''两位数''两分钟''两千块''两千多''两口''两句''两只''两周''两场''两块钱''两天''两岁半''两年''两情相悦''两月''两条''两栋''两次''两段''两点''两百天''两百斤''两盒''两码事''两种''两秒''两级''两行''两遍''两集''两面''两首''两首歌''严厉''严肃''严谨''严重''丧失''个个''个人''个人感觉''个人观点''个别''个头''个子''个币''个性''个赞''丫头''丫点''中会''中医''中午''中华''中华文化''中华民谣''中国''中国香港''中央''中央空调''中学''中学毕业''中层''中山''中岛美雪''中带''中广核''中庙''中式''中心''中意''中文''中文系''中曲''中有''中泪点''中环''中秋''中秋节''中老年人''中考''中过''中途''中间''中高音''丰城''临窗''临近''丹丹''丹妮''丹尼''为了''为什么''为何''为先''为君''为啥''为国争光''为数不多''为止''为此''为活''为琦琦''为罗琦琦''为萝莉''为难''主任''主动''主叫''主唱''主持人''主时''主流'...]  

查看所有文本的关键字和其位置

1.print(vectorizer.vocabulary_)  
2.{...'故事'6694'每天'7759'至爱'10103'danny'252'从来'1885'喜欢'3777'一点'803'煤油'8436'沁入'7880'心脾'5636'温柔'8233'最近'7194'首歌'11920'今日'1863'点歌'8383'偏偏'2226'没有'7941'抵抗力'6369'一次'787'我们'6052'擦肩而过'6630'害怕'4776'电影'8799'情景'5858'一样'779'错过'11479'所以'6182'一直'826'看着'9095'可是'3350'回头'3848'一眼'828'珍贵'8683'奈何'4376'珍惜'8680'王雷雷'8642'这是'11085'为什么'1453'浪漫'8115'小时候'4912'有个'7208'收音机'6650'好开心'4462'睡觉'9183'舍不得'10111'放下'6662'好听'4444'这些'11063'歌曲'7650'经典作品'9647'亲亲'1735'翩翩'9789'夫人'4345'爱情'8485'时光'6969'纪贯'9594'一家'716'吃饭'3397'店里'5259'知道'9202'什么'1842'一下'607'爱心'8482'幸福'5221'nan'444'超级'10823'一首歌'907'大赞'4234'可能'3361'单手'3036'法拉利'7987'多多'4104'大笑'4222'活下去'8045'再见'2488'大渣'4213,...}  

查看词频矩阵的结果:

1.[[0 0 0 ..., 0 0 0]  
2. [0 0 0 ..., 0 0 0]  
3. [0 0 0 ..., 0 0 0]  
4. ...,   
5. [0 0 0 ..., 0 0 0]  
6. [0 0 0 ..., 0 0 0]  
7. [0 0 0 ..., 0 0 0]]  

0充斥了整个矩阵,查看其维度:

1.count.shape  
2.(20523, 12111)  

20523行,12111列,指的是有20523个文档,即用户评论,语料库里一共有12111个词。查看其数据类型:

1.type(count)  
2.scipy.sparse.csr.csr_matrix  

妥妥的稀疏矩阵。

1.3 计算tf-idf值:

利用TfidfTransformer函数统计CountVectorizer中每个词语的tf-idf权值:

1.tfidf_vec = TfidfVectorizer()   
2.tfidf_matrix = tfidf_vec.fit_transform(d.title_cutted)  
3.print(tfidf_matrix.toarray())  

得到tf-idf数组:

1.[[ 0.  0.  0. ...,  0.  0.  0.]  
2. [ 0.  0.  0. ...,  0.  0.  0.]  
3. [ 0.  0.  0. ...,  0.  0.  0.]  
4. ...,   
5. [ 0.  0.  0. ...,  0.  0.  0.]  
6. [ 0.  0.  0. ...,  0.  0.  0.]  
7. [ 0.  0.  0. ...,  0.  0.  0.]]  

剩余步骤类似于上,找对应函数,得到用户相似度。

二、相似用户推荐(R语言版本)

2.1 读取资料库

设置工作目录,导入函数包:

1.setwd("G:\\课程\\研一\\回归分析")  
2.library(xml2,lib="G:\\R语言\\R语言学习\\安装包")  
3.library(Rcpp,lib="G:\\R语言\\R语言学习\\安装包")  
4.library(slam,lib="G:\\R语言\\R语言学习\\安装包")  
5.library(NLP,lib="G:\\R语言\\R语言学习\\安装包")  
6.library(tm,lib="G:\\R语言\\R语言学习\\安装包")  
7.#只有RJava配置成功了,Rwordseg安装才可能成功,前者是后者的依赖包  
8.#install.packages("rJava",lib="G:\\R语言\\R语言学习\\安装包")  
9.library(rJava,lib="G:\\R语言\\R语言学习\\安装包")  
10.#手动下载安装包Rwordseg,然后本地安装  
11.library(Rwordseg,lib="G:\\R语言\\R语言学习\\安装包")  

导入数据,其中,clipboard指的是HuXiu.txt用notepad打开后复制,防止中文乱码

1.csv <- read.table("clipboard",header=T, stringsAsFactors=F,quote = "",encoding="utf-8")  
2.mystopwords<-unlist(read.table("StopWords.txt",stringsAsFactors=F,quote = ""))  
3.head(csv)  
4.dim(csv)  
5.colnames(csv)<-c("text")  

2.2 定义数据预处理函数

移除数字函数

1.removeNumbers = function(x) { ret = gsub("[0-90123456789]","",x) }  

segmentCN分词函数
中文分词,也可以考虑使用 rmmseg4j、rsmartcn

1.wordsegment<- function(x{   
2.  library(Rwordseg)   
3.  segmentCN(x)  
4.}   

去除停止词函数

1.removeStopWords = function(x,words) {       
2.  ret = character(0)   
3.  index <- 1   
4.  it_max <- length(x)   
5.  while (index <= it_max) {   
6.    if (length(words[words==x[index]]) <1) ret <- c(ret,x[index])   
7.    index <- index +1   
8.  }   
9.  ret   
10.}   

2.3移除数字

1.sample.words <- lapply(data[,1]removeNumbers)   
2.dim(as.matrix(sample.words))  
3.head(sample.words)  

2.4 中文分词

1.sample.words <- lapply(sample.wordswordsegment)   
2.dim(as.matrix(sample.words))  
3.sample.words[1:6]  

2.5 移除停止词

先处理中文分词,再处理 stopwords,防止全局替换丢失信息,
(下面这句运行时间较长 )

1.sample.words <- lapply(sample.wordsremoveStopWordsmystopwords)   
2.head(sample.words)  
3.text<-sample.words[,1]  
4.colnames(sample.words)<-c("text")  
5.write.csv(as.matrix(sample.words),"delateddata.csv")  

2.6 构建语料库

1.corpus = Corpus(VectorSource(sample.words))   
2.meta(corpus,"cluster") <- csv$type   
3.unique_type <- unique(csv$type)   
4.corpus  

2.7建立文档-词条矩阵

1.(sample.dtm <- DocumentTermMatrix(corpuscontrol = list(wordLengths = c(2, Inf))))  

接下来,就是计算tf-idf值,相似度,得到相似用户,完成用户推荐。

zhi

  支

chi

  持

zuo

  作

zhe

  者

640?wx_fmt=png

长按扫码鼓励作者


热 门 推 荐
为你的Python程序加密
用Python开发计时器程序
用Python爬取WordPress官网所有插件

用OpenCV和OCR识别图片中的表格数据
推荐Python中文社区旗下的几个服务类公众号

640?wx_fmt=jpeg

▼ 点击成为社区注册会员          「在看」一下,一起PY!

基于Node.js,提供网易云所有API接口数据,包括:登录,获取用户信息 , 歌单,收藏,mv, dj 数量 获取用户歌单 获取用户电台 获取用户关注列表 获取用户粉丝列表 获取用户动态 获取用户播放记录 获取精品歌单 获取歌单详情 搜索 搜索建议 获取歌词 歌曲评论 收藏单曲到歌单 专辑评论 歌单评论 mv 评论 电台节目评论 banner 获取歌曲详情 获取专辑内容 获取歌手单曲 获取歌手 mv 获取歌手专辑 获取歌手描述 获取相似歌手 获取相似歌单 相似 mv 获取相似音乐 获取最近 5 个听了这首歌的用户 获取每日推荐歌单 获取每日推荐歌曲 私人 FM 签到 喜欢音乐 垃圾桶 歌单 ( 网友精选碟 ) 新碟上架 热门歌手 最新 mv 推荐 mv 推荐歌单 推荐新音乐 推荐电台 推荐节目 独家放送 mv 排行 获取 mv 数据 播放 mv/视频 排行榜 歌手榜 云盘 电台 - 推荐 电台 - 分类 电台 - 分类推荐 电台 - 订阅 电台 - 详情 电台 - 节目 给评论点赞 获取动态 热搜列表(简略) 发送私信 发送私信歌单 新建歌单 收藏/取消收藏歌单 歌单分类 收藏的歌手列表 订阅的电台列表 相关歌单推荐 付费精选接口 音乐是否可用检查接口 登录状态 获取视频播放地址 发送/删除评论 热门评论 视频评论 退出登录 所有榜单 所有榜单内容摘要 收藏视频 收藏 MV 视频详情 相关视频 关注用户 新歌速递 喜欢音乐列表(无序) 收藏的 MV 列表 获取最新专辑 听歌打卡 获取视频标签下的视频 已收藏专辑列表 获取动态评论 歌单收藏者列表 云盘歌曲删除 热门话题 电台 - 推荐类型 电台 - 非热门类型 电台 - 今日优选 心动模式/智能播放 转发动态 删除动态 分享歌曲、歌单、mv、电台、电台节目到动态 通知-私信 通知-评论 通知-@我 通知-通知 设置 云盘数据详情 私信内容 我的数字专辑 batch批量请求接口 获取视频标签列表 部mv 网易出品mv 收藏/取消收藏专辑 专辑动态信息 热搜列表(详细) 更换绑定手机 检测手机号码是否已注册 初始化昵称 更新歌单描述 更新歌单名 更新歌单标签 默认搜索关键词 删除歌单 电台banner 用户电台 热门电台 电台 - 节目详情 电台 - 节目榜 电台 - 新晋电台榜/热门电台榜 类别热门电台 云村热评 电台24小时节目榜 电台24小时主播榜 电台最热主播榜 电台主播新人榜 电台付费精品榜 歌手热门50首歌曲
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值