基于网易云音乐评论的用户推荐系统(全)
Posted Python中文社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于网易云音乐评论的用户推荐系统(全)相关的知识,希望对你有一定的参考价值。
伪文艺Boy,Python、R、Java爱好者,喜欢新鲜感,一个简单、纯粹的IT小伙。
博客:https://blog.csdn.net/striver6
番外篇一:
番外篇二:
一、相似用户推荐(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值,相似度,得到相似用户,完成用户推荐。
zhi
支
chi
持
zuo
作
zhe
者
长按扫码鼓励作者
▼ 点击成为社区注册会员 「在看」一下,一起PY!
以上是关于基于网易云音乐评论的用户推荐系统(全)的主要内容,如果未能解决你的问题,请参考以下文章
网易云音乐:基于RocketMQ的亿级分布式消息队列系统建设实践
网易云音乐怎么看别人的评论,特定某个人的,想知道喜欢的人在想啥。
做1.84亿用户的“知己”,网易云音乐携手飞桨让推荐系统更“贴心”