背景





《少年的你》的票房最终定格在15.5亿,从票房上看,这部电影在大陆制作的青春剧中比较成功,演员:易烊千玺+周冬雨,当然会引起一些流量效应,但是许多演员对这部电影的剧情、演员的演技评价颇好,包括自己的姐姐也非常喜欢;但与此同时它也陷入了抄袭东野圭吾的《白夜行》和《嫌疑人X的献身》的热议,引起许多原著粉丝的不满。

下面就利用逻辑回归(LogisticRegression)对《少年的你》的一些短评进行情感分析,看一看已经观影的人对这部电影的评价如何。

获取数据


数据是从豆瓣电影——《少年的你》短评上获取的 。

虽说图中显示的有220200条短评,我却只爬取到600条,但当作一个小的数据集样本用来分析也是足够的。

爬虫过程并不难,requesets+Beautifulsoup即可,不再过多概述。

数据处理


需要的库和工具

import pandas as pd
import jieba
import re

工具jupyter notebook

数据整理

数据读取如下图

数据内容:名字,短评,评价

由于爬取的短评内容分为500个样本和100个样本,所以需要先将两个数据集整合成一个数据集——利用pandasmerge方法即可 。

rating这一列中,数据还是列表格式,可观性也比较差,很容易能够推断出评分10-50为五个等级,也就是我们在网页上看到的几星评价,为了分析便利,可以写一个函数将rating分为1-5五个等级。

def rating(e):if '50' in e:return 5elif '40' in e:return 4elif '30' in e:return 3elif '20' in e:return 2else:return 1
data['new_rating'] = data['rating'].map(rating)
data.head()

运行后数据如下图

那么问题又来了,对于评价只有好评和坏差评之分,可是rating有五个等级怎么办呢? 可以先将三星评价删去,因为这些评价大概率为中性评价,然后将四星和五星定为好评,用1表示;再将一星和二星定位差评,用-1表示。

new_data = data[data['new_rating']!=3]
new_data['sentiment'] = new_data['new_rating'].apply(lambda x : +1 if x>3 else -1)
new_data

样本只剩下557个,说明有43个三星中性评价被删去 。

好评和差评的比率大约为3.5:1,可以看出喜欢这部电影的人还是比较多的 但是样本也出现了样本不均衡的问题,这会对后期建模有一定的影响。

怎么判定一句短评是好还是差?

我喜欢你 我讨厌你

喜欢

讨厌

不就可以根据一句话中的一些单词进行判断嘛,所以下一步用jieba库对每一条短评进行分词。

在分词前我们可以先分析一下文本,里面会有许多对情感分析没有影响的内容,比如数字和字母,所以分词时可以将其剔除。

#分词
def cut_word(text):text = jieba.cut(str(text),cut_all=False)return ' '.join(text)
new_data['new_short'] = new_data['short'].apply(cut_word)
#剔除数字
def remove_num(new_short):return re.sub(r'\d+','',new_short)
#剔除字母
def remove_word(new_short):return re.sub(r'[a-z]+','',new_short)
new_data['new_short'] = new_data['new_short'].apply(remove_num)
new_data['new_short'] = new_data['new_short'].apply(remove_word)

分词效果如下

可以发现图中有许多带有个人情感的单词。

逻辑回归建模


需要的库

from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import LogisticRegression
import numpy as np
from pandas import DataFrame

分析与建模

第一步需要对分析好的数据进行数据划分,分为训练集和测试集;

train_data,test_data = train_test_split(new_data,train_size = 0.8,random_state = 0)
#文本提取
transfer = CountVectorizer()
train_word = transfer.fit_transform(train_data['new_short'])
test_word = transfer.transform(test_data['new_short'])
#稀疏矩阵
print('new_data:\n',train_word.toarray())
#特征值
print('feature_name:\n',transfer.get_feature_names())

第二步对分词后的文本进行特征值提取,可以生成一个对应的稀疏矩阵,并且得到稀疏矩阵对应的特征值 第三步利用逻辑回归建模,即让训练集中的特征值和目标值进行拟合,从而生成一个模型。

x_train,x_test,y_train,y_test = train_test_split(new_data['new_short'],new_data['sentiment'],train_size = 0.8,random_state = 0)
x_train = train_word
x_test = test_word
model = LogisticRegression()
model.fit(x_train,y_train)
y_predict = model.predict(x_test)
print('布尔比对:\n',y_predict==y_test)
score = model.score(x_test,y_test)
print('模型准确率:\n',score)

得出预测结果和模型准确率如下 模型准确率为85.7%,建模效果一般。

我们可以从测试集文本中挑选出一些例子进行验证,观察一下情感分析是否正确。

example = test_data[50:55]
example[['short','new_rating','sentiment']]

如果想要观察完整短评,可以写一个迭代器,将短评完整输出,不过在图中我们就可以看出这些短评的语意是如何的,比如第三个涉及抄袭,所以对应sentiment为-1。

通过逻辑回归的predict_proba可以获得一个评价为好评的概率,也就是概率越接近于1,这条短评越可能是好评,同理短评为差评的概率接近于0。

possibility = model.predict_proba(test_word)[:,1]
test_data.loc[:,'possibility'] = possibility

通过索引能够得到对《少年的你》评价最好的五条和最差的五条 。

同样迭代可查看完整短评,可以看到好评Top5写的都比较多,也比较走心,大部分是在说这部电影反射出的社会问题——校园霸凌;而差评Top5都意在指出这部电影是在抄袭,引起了许多人的不满 。

上图为在短评中出现次数较多的单词:

(演技 青春 少年 希望 喜欢)——这些词应该是出至于一些好评,属于正面词汇,可以影响评价夹带着的情感。

(欺凌 保护 校园 霸凌 暴力)——这些词语是陈述电影背景的词语,虽然有些带有负面情感,但还需根据短评句子的语意才能判断好差之分。

(抄袭)——这个单词出现67次,而sentiment为-1的短评一共才有122个,所以带有抄袭字样的评价大概率皆为差评。

总结


一部票房可以达到15.5亿的电影,一定有它的独到之处,不论是演员阵容、演技亦或者是背景题材,但是一部确定抄袭的电影注定不会成为一部好电影,作为一个路人,对《少年的你》是否抄袭不能做出判断,但我认为这部剧也算的上是大陆青春剧的一个突破。

迟来的《少年的你》短评情感分析相关推荐

  1. 《少年的你》短评情感分析——机器学习之逻辑回归

    原文网址: https://segmentfault.com/a/1190000021947908 import pandas as pd import jieba import re #逻辑回归建模 ...

  2. Python爬取《你好李焕英》豆瓣短评并基于SnowNLP做情感分析

    爬取过程在这里: Python爬取你好李焕英豆瓣短评并利用stylecloud制作更酷炫的词云图 本文基于前文爬取生成的douban.txt,基于SnowNLP做情感分析. 依赖库: 豆瓣镜像比较快: ...

  3. 利用Python爬取《囧妈》豆瓣短评数据,并进行snownlp情感分析

    利用Python爬取<囧妈>豆瓣短评数据,并进行snownlp情感分析 一.电影评论爬取 今年的贺岁片<囧妈>上映前后,在豆瓣评论上就有不少网友发表了自己的观点,到底是好评的声 ...

  4. scrapy 豆瓣短评 数据分析 + 中文情感分析 + 可视化 (一)

    scrapy 豆瓣短评 数据分析 + 中文情感分析 + 可视化 (一) 一.scrapy 爬取 豆瓣短评 本次爬取的是哪吒之魔童降世 短评 .本次爬取的是静态网页还是蛮简单的. 1.开始地址 http ...

  5. [Python人工智能] 三十四.Bert模型 (3)keras-bert库构建Bert模型实现微博情感分析

    从本专栏开始,作者正式研究Python深度学习.神经网络及人工智能相关知识.前一篇文章开启了新的内容--Bert,首先介绍Keras-bert库安装及基础用法及文本分类工作.这篇文章将通过keras- ...

  6. Python之手把手教你用JS逆向爬取网易云40万+评论并用stylecloud炫酷词云进行情感分析

    本文借鉴了@平胸小仙女的知乎回复 https://www.zhihu.com/question/36081767 写在前面: 文章有点长,操作有点复杂,需要代码的直接去文末即可.想要学习的需要有点耐心 ...

  7. 【自然语言处理(NLP)】基于FNN网络的电影评论情感分析

    [自然语言处理(NLP)]基于FNN网络的电影评论情感分析 作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践资源建 ...

  8. python snownlp情感分析_SnowNLP情感分析+生成词云

    本帖最后由 missy 于 2017-12-9 00:12 编辑 因为最近看了一下<致我们单纯的小美好>,虽然情节是有点"二"吧,但是看了觉得真的很怀念初高中的日子,一 ...

  9. 情感分析动力学知识框架(晏殊几何学情锚讲义)

    <[花间流风]神国?净土!尘世,姿与心的人和守则,靖逸杏>第五节 情锚矩阵的块化特征处理 在人生意气场中,情锚通常是情感分析文本向量化的产物,一般被记为n*n矩阵,我们知道矩阵的每一行都可 ...

最新文章

  1. Java枚举意义在哪_java – 多个if-else或枚举 – 哪一个更好,为什么?
  2. 聊聊技术、利基市场、激情与梦想
  3. Linux下使用OTL操作mysql数据库
  4. 强大js web甘特图制作之甘特图的日历
  5. 自学MVC——添加一个控制器
  6. C++中类的组合和继承关系
  7. 忘记农民就是忘本-农业大健康·万祥军:不要说自己是教授
  8. 电子琴节奏包制作_济南这个藏在菜市场的小饺子馆,纯手工制作,老板娘一个人不停忙...
  9. 1. Visio Web 形状 - 无法与 Web 服务器建立连接。请稍后重新进行搜索。处理方式...
  10. 用php求n个分数的和,php关于数组n个随机数分成x组,使每组值相近的算法
  11. 标准10进制公制度量系统中 倍率关系 大全
  12. linux c之使用pthread_create创建线程pthread_join等待线程和pthread_exit终止线程总结
  13. mysql操作json优点和缺点_SQL-mysql操作json
  14. 20175305张天钰《java程序设计》第七周学习总结
  15. asc码转换 linux_Linux网络服务04——FTP文件传输服务
  16. 08面向对象编程风格
  17. LNMP状态管理命令
  18. ajax调用方式汇总
  19. 第七章 课后习题P206
  20. 计算机操作系统--UNIX操作系统

热门文章

  1. 360wifi3暂时没有linux驱动
  2. 【WEBRTC】ADM: rtc_include_internal_audio_device 触发 RTC_DCHECK(adm) 断言
  3. Java 线程的终止方式
  4. 微信小程序设置表单界面
  5. 【论文阅读 NeurIPS 2022】A Large Scale Search Dataset for Unbiased Learning to Rank
  6. python操作word、pdf问题汇总
  7. IDEA编译处理报错:You aren’t using a compiler supported by lombok, so lombok will not work and has been dis
  8. 视频教程-易语言入门精品课程-其他
  9. Linux下Flann库编译
  10. 儿童编程微课堂-Scratch准备篇:一、Scratch简介