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

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

♚

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

博客:https://blog.csdn.net/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.Name: title_cutted, dtype: object  

接下来我们对这些本文做向量化,所谓文本向量化,指的就是形成一个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.words, wordsegment)   
2.dim(as.matrix(sample.words))  
3.sample.words[1:6]  

2.5 移除停止词

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

1.sample.words <- lapply(sample.words, removeStopWords, mystopwords)   
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(corpus, control = list(wordLengths = c(2, Inf))))  

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



  微信扫描下方的二维码阅读更多精彩内容


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

每日分享到群里,或者推荐给朋友会得大量积分,机会可以兑换微信零钱红包,具体请点击这里,得到了微信红包可以用来支持大飞哥

大飞哥能不能加鸡腿就看各位了!

赞赏请扫

开发者微信

大飞哥微信

开发者微信反馈BUG或者VIP可以添加,其他情况反馈可能不及时,见谅

版权声明

初衷是提供高清手机电脑壁纸等图片素材免费分享下载,禁止商用。图片素材来源网络,版权归原作者所有,若有侵权问题敬请告知我们!

【友情提醒】:

因平台原因不易展示大尺度写真,有的写真展示越少代表此套写真越性感,特别是xiuren等写真每一套写真完整套图50-100张不等。更多内容的欣赏请移步 点击这里

【更多图集移步】: 每日更新-点击这里
漂亮小姐姐-点击这里
性感美女-点击这里
清纯女孩-点击这里
xiuren专栏-点击这里
整站资源下载-点击这里

相关新闻