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

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

伪文艺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.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值,相似度,得到相似用户,完成用户推荐。



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

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


感谢对大飞哥的支持

相关新闻

联系电话

13888888888

微信
微信
返回顶部