这篇文章是将要分析网易云课堂里的数据,分析时下学习的热点。
工具准备:
Chrome游览器,
python3.6 (包含requests,jieba库)
首先打开全部课程 - 网易云课堂,登陆之后打开chrome开发者工具,经过分析发现,云课堂里的数据是直接通过ajax获取,于是直接复制cookie模拟发送包,跳过登陆模拟。
截图显示了这个json数据的结构
import requests
import json
header = {
'Accept':'application/json',
'Accept-Encoding':'gzip, deflate',
'Accept-Language':'zh-CN,zh;q=0.8,en;q=0.6',
'Cache-Control':'no-cache',
'Connection':'keep-alive',
'Content-Length':'120',
'Content-Type':'application/json',
'Cookie':'', #input your cookie
'edu-script-token':'', #input your token
'Host':'',
'Origin':'',
'Pragma':'no-cache',
'Referer':'/courses',
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
}
payload= {
"pageIndex":'1',
"pageSize":'50',
"relativeOffset":'100',
"frontCategoryId":'-1',
"searchTimeType":'-1',
"orderType":'0',
"priceType":'-1'
}
由于这个request是个 Request Payload 而不是 Form Data,因而header里需要申明为json,以及一会儿发送时要将payload转换成json数据。
data_list = []
count=0
for i in range(60):
ret = requests.post("/p/search/studycourse.json", data=json.dumps(payload), headers=header)
payload["pageIndex"] = int(payload["pageIndex"])+1
temp_dic = ret.json()
if temp_dic["message"]!="ok":
print("error "+temp_dic["message"])
#data_list.append(temp_dic["result"]['list'])
for item in temp_dic["result"]['list']:
count +=1
data_list.append(item)
print(i+1,"/60")
print(count)
file_name='opencourse.json'
with open(file_name,'w') as file_object:
json.dump(data_list,file_object)
根据云课堂自己的数据,正好是3000条数据,然后将这3000条数据先保存。
接下来先对标题和介绍进行简单的分词,使用jieba库里的cut() method。 基本原理是用统计 构造Trie树做词典,然后构造DAG,使用动态规划找出最大概率组合。对于词典里没有的词,使用HMM进行划分。代码如下:
import jieba
word_count={}
for item in data_list:
temp_analyse = jieba.cut(item["productName"])
for temp in temp_analyse:
if word_count.get(temp) == None:
word_count[temp] = 1
else:
word_count[temp] = int(word_count[temp]) + 1
temp_analyse = jieba.cut(item["description"])
for temp in temp_analyse:
if word_count.get(temp) == None:
word_count[temp] = 1
else:
word_count[temp] = int(word_count[temp]) + 1
对词典排序后,出现次数最多的50个词 结果如下
sorted(word_count.items(),key=lambda item:item[1],reverse=True)
x[0:50]
Out[25]:
[(',', 21836),
('\n', 19297),
('的', 18876),
(' ', 15846),
('、', 9085),
('。', 8531),
('-', 6916),
('课程', 5677),
(':', 5130),
('.', 4165),
('你', 3218),
('/', 2830),
('学习', 2825),
('是', 2796),
('和', 2730),
('!', 2371),
(')', 2370),
('(', 2268),
('\r\n', 2268),
('在', 2149),
('—', 1967),
('了', 1711),
('本', 1690),
('与', 1633),
('】', 1547),
('【', 1537),
('《', 1521),
('》', 1521),
('?', 1449),
('基础', 1427),
('中', 1382),
('1', 1376),
('为', 1270),
('有', 1260),
('2', 1243),
('“', 1233),
('”', 1218),
(';', 1166),
('如何', 1128),
('可以', 1121),
('让', 1082),
('我们', 1061),
('3', 1042),
(':', 1034),
('教程', 1009),
('更', 1005),
('等', 999),
('设计', 981),
('讲解', 975),
('视频', 969)]
可见单纯的分词并不能满足我们的需求,于是我们采用下TD-IDF和textrank算法直接获取关键词。代码如下:
import jieba.analyse
word_count={}
for item in data_list:
temp_analyse = jieba.analyse.extract_tags(item["productName"])
for temp in temp_analyse:
if word_count.get(temp) == None:
word_count[temp] = 1
else:
word_count[temp] = int(word_count[temp]) + 1
temp_analyse = jieba.analyse.extract_tags(item["description"])
for temp in temp_analyse:
if word_count.get(temp) == None:
word_count[temp] = 1
else:
word_count[temp] = int(word_count[temp]) + 1
出现次数最多的40个词 结果如下:
[('课程', 1725),
('学习', 717),
('教程', 535),
('基础', 471),
('讲解', 422),
('入门', 389),
('视频', 372),
('http', 369),
('com', 351),
('技巧', 304),
('微信', 290),
('实战', 283),
('制作', 260),
('老师', 258),
('QQ', 248),
('设计', 247),
('如何', 240),
('开发', 218),
('学员', 214),
('掌握', 213),
('study', 211),
('案例', 201),
('163', 201),
('PPT', 199),
('课堂', 197),
('10', 190),
('更新', 184),
('英语', 179),
('知识点', 179),
('职场', 178),
('视频教程', 177),
('轻松', 176),
('Excel', 163),
('PS', 162),
('软件', 158),
('系列', 156),
('快速', 155),
('管理', 151),
('考试', 142),
('数据', 142),
('教学', 139),
('htm', 138),
('大家', 138),
('免费', 137),
('知识', 136),
('课程内容', 134),
('使用', 132),
('课时', 129),
('方法', 128),
('www', 127)]
由于textrank的代码和之前的代码重复度太高,直接研究jieba库就行了,结果和TD-IDF也差不多。
就从结果来看,单纯的TD-IDF和textrank算法不能满足我们的需求。因为‘课程’ ‘学习’的IDF值高,相对于助词来说,被认为是关键词,加之出现频率高,所以出现在第一第二名,但是我们更希望得到的是‘Excel’ ‘PS’这样的具体的关键词,得到当下学习的热点。
下一节会用余弦定理和层次聚类来处理这些数据。