爬取豆瓣电影影评,生成wordcloud词云,并利用监督学习根据评论自动打星
本文的完整源码在git位置:https://github.com/OceanBBBBbb/douban-ml
- 爬取豆瓣影评
爬豆瓣的影评比较简单,豆瓣没有做限制,甚至你都不用登陆就可以看全部,我这里用的bs4和urllib获取的页面信息:
# 获取页面
def get_html(url):
head = {}
head[
'User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'
target_req = request.Request(url=url, headers=head)
target_response = request.urlopen(target_req)
target_html = target_response.read().decode('utf-8', 'ignore')
# 创建BeautifulSoup对象
listmain_soup = BeautifulSoup(target_html, 'lxml')
return listmain_soup
获取页面后,解析页面上的评论内容,这里我拿了给出的评分、短评和展示的部分详细评价。
评分在这个页面里不是一个明显的数值,豆瓣用5种不同的class来表示用户的评星。我这里用了个
遍历找评分的办法。
# 解析豆瓣评论并存到文件中
def resolu_soup(soup_page):
reviews = soup_page.find_all('div', class_='main review-item')
for each_review in reviews:
# 评分是1-5星,用class不同来表示的。allstar40 main-title-rating,h2里面是主评,<div class="short-content">是详评
score = 0 #未知的评分
for i in range(1, 6):
class_name='allstar'+str(i*10)+' main-title-rating'
score_maybe=each_review.find_all('span', class_=class_name)
if(len(score_maybe)>0):
score = i
print("这个人的评分是"+str(score))
short_review = each_review.find('h2').text.replace(' ','') #短评
with open("../doc/data_fkwxr.txt", "a",encoding='utf-8') as f: #写到样本库用于--学习可能有没有分的
f.write(short_review+" "+str(score)+'\n')
long_review = each_review.find('div', class_='short-content').text.replace(' ','').replace('(展开)','') with open("../doc/fkwxr.txt", "a",encoding='utf-8') as f: #写在用于分析电影评价的文本里
f.write(short_review+" "+long_review+'\n')
打开文本的方式with open("../doc/data_fkwxr.txt", "a",encoding='utf-8')
中的第二个参数,需要提前了解一下:
而这里的'a'是以追加的方式进行写入。
- 使用word-cloud直观看影评
因为我们拉取的文本是用户自由输入的,在使用word_cloud分析前,可以先用jieba分词预处理一下:
def build_key_word(path): # 通过词频产生特征
d = {}
with open(path, encoding="utf-8") as fp:
for line in fp:
for word in jieba.cut(line.strip()):
# p = re.compile(r'w', re.L)
# result = p.sub("", word)
# if not result or result == ' ': # 空字符
# continue
if len(word) > 1: # 避免大量无意义的词语进入统计范围
d[word] = d.get(word, 0) + 1
kw_list = sorted(d, key=lambda x: d[x], reverse=True)
size = int(len(kw_list) * 0.3) # 取最前的30%
mood = set(kw_list[:size])
mood_without_stop=list(mood)
temp_list={}
for ii in mood_without_stop:
temp_list[ii]=d[ii]
return temp_list
然后使用wordcloud生成图就可以了,这里在wordcloud官网有入门的详细教程,只是要得到一个图的话,还是比较简单的。
这里可以看一下电影《新喜剧之王》的效果图:
使用朴素贝叶斯算法进行分类训练,预测评论标题将给的评星
这里我为了图方便,前面存储这个的时候,存的就是影评的标题加已知的星级,而没有给评星的,就会是0,在训练前,我过滤了一下没有评星的,根据评论自己按常理,
给出了一个评星,不然数据实在是太少了。
# 简单的监督学习例子
# 使用朴素贝叶斯算法进行分类训练。
from nltk.stem import WordNetLemmatizer
from nltk.classify import NaiveBayesClassifier
import pickle
import jieba def proc_text(text):
# 分词
raw_words = jieba.cut(text, cut_all=True)
# 词形归一化
wordnet_lematizer = WordNetLemmatizer()
words = [wordnet_lematizer.lemmatize(raw_word) for raw_word in raw_words]
# True 表示该词在文本中,为了使用nltk中的分类器
return {word: True for word in words} def train_data_from_txt(model_name,txt):
# 读取文本
# a = numpy.loadtxt('data_xxjzw.txt',encoding='UTF-8') #这个是读数的。。
with open(txt, encoding="utf-8") as fp:
train_data=[]
for line in fp:
txt_split=line.split(' ')
train_data.append([proc_text(txt_split[0]),int(txt_split[1])])
# 训练模型
nb_model = NaiveBayesClassifier.train(train_data)
# 把模型训练集存起来
f = open(model_name, 'wb')
pickle.dump(nb_model, f)
f.close() if __name__ == '__main__':
# train_data_from_txt('data_xxjzw_classifier.pickle','../doc/data_xxjzw.txt') #得到心训练模型
# # 测试模型
text6 = '看预告片觉得这真是一部好极了的电影,期待正式上映'
f = open('data_xxjzw_classifier.pickle', 'rb')
classifier = pickle.load(f) #读取结果集就可以了
f.close()
print("预测本评论给出的评分:"+str(classifier.classify(proc_text(text6))))
爬取豆瓣电影影评,生成wordcloud词云,并利用监督学习根据评论自动打星的更多相关文章
- scrapy-redis爬取豆瓣电影短评,使用词云wordcloud展示
1.数据是使用scrapy-redis爬取的,存放在redis里面,爬取的是最近大热电影<海王> 2.使用了jieba中文分词解析库 3.使用了停用词stopwords,过滤掉一些无意义的 ...
- python 爬取豆瓣电影短评并wordcloud生成词云图
最近学到数据可视化到了词云图,正好学到爬虫,各种爬网站 [实验名称] 爬取豆瓣电影<千与千寻>的评论并生成词云 1. 利用爬虫获得电影评论的文本数据 2. 处理文本数据生成词云图 第一步, ...
- python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法
本文旨在提供爬取豆瓣电影<我不是药神>评论和词云展示的代码样例 1.分析URL 2.爬取前10页评论 3.进行词云展示 1.分析URL 我不是药神 短评 第一页url https://mo ...
- scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250
scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...
- 爬取豆瓣电影排行top250
功能描述V1.0: 爬取豆瓣电影排行top250 功能分析: 使用的库 1.time 2.json 3.requests 4.BuautifulSoup 5.RequestException 上机实验 ...
- 【转】爬取豆瓣电影top250提取电影分类进行数据分析
一.爬取网页,获取需要内容 我们今天要爬取的是豆瓣电影top250页面如下所示: 我们需要的是里面的电影分类,通过查看源代码观察可以分析出我们需要的东西.直接进入主题吧! 知道我们需要的内容在哪里了, ...
- Scrapy中用xpath/css爬取豆瓣电影Top250:解决403HTTP status code is not handled or not allowed
好吧,我又开始折腾豆瓣电影top250了,只是想试试各种方法,看看哪一种的方法效率是最好的,一直进行到这一步才知道 scrapy的强大,尤其是和selector结合之后,速度飞起.... 下面我就采用 ...
- scrapy爬虫框架教程(二)-- 爬取豆瓣电影
前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大家讲解一个完整爬虫的流程. 工具和环境 语言:python 2 ...
- urllib+BeautifulSoup无登录模式爬取豆瓣电影Top250
对于简单的爬虫任务,尤其对于初学者,urllib+BeautifulSoup足以满足大部分的任务. 1.urllib是Python3自带的库,不需要安装,但是BeautifulSoup却是需要安装的. ...
随机推荐
- git 入门教程之删除文件
删除文件 回忆一下文件的常见操作,新增文件,修改文件,删除文件等,新增和修改文件都单独讨论过,现在我们来研究一下如何删除文件. 你可能会说删除文件还不简单啊,直接 rm -rf <file> ...
- configure: error: Cannot find php-config. Please use --with-php-config=PATH
本文章给大家介绍configure: error: Cannot find php-config. Please use --with-php-config=PATH错误解决办法. configure ...
- Linux中Hadoop的环境搭建
一:下载安装 Hadoop 1.1:下载指定的Hadoop 1.2:通过XFTP把文件上传到master电脑bigData目录下 1.3:解压hadoop压缩文件 tar -xvf hadoop-2. ...
- Python练手例子(5)
25.求1+2!+3!+...+20!的和. 程序分析:此程序只是把累加变成了累乘. #python3.7 n = 0 s = 0 t = 1 for n in range(1, 21): t *= ...
- 甘特图dhtmlx Gantt入门
(以下截图来自别人的博客,来源地址已经忘记了,若后期找到会补充上来!) API地址:https://docs.dhtmlx.com/gantt/desktop__guides.html,这是英文的网页 ...
- symfony采坑
2018年7月31日21:43:17 安装 首先安装composer 注意 windows下注意 [curl] curl.cainfo =E:\phpStudy\PHPTutorial\php\p ...
- 如何从日期对象python获取以毫秒(秒后3位小数)为单位的时间值?
要在python中,要获取具有毫秒(秒后3位小数)的日期字符串,请使用以下命令: %f 显示毫秒 import datetime # 获得当前时间 now=datetime.datetime.now( ...
- vmware您无权输入许可证密钥,请请使用系统管理员账户重试
vmware15,输入许可证时报“您无权输入许可证密钥,请请使用系统管理员账户重试”,切换到Administrator以后,并没有什么作用. 网上的各种进入cmd的方法也无效. 后来发现,只要是已经存 ...
- Create-React-App创建antd-mobile开发环境
Facebook 官方推出Create-React-App脚手架,基本可以零配置搭建基于webpack的React开发环境,内置了热更新等功能. 详细文档可前往链接:Create-React-App文 ...
- Python_tkinter(3)_grid布局
Grid(网格)布局管理器,是Tkinter里面最灵活的几何管理布局器.注意:不要试图在一个主窗口中混合使用pack和grid. 1.简单的布局 from tkinter import * root ...