昨天写了个程序成功“找出”了《当家主母》的主角,今天再搞点其他的玩玩。前两天《风起洛阳》开播了,这部剧改编自马伯庸的小说《洛阳》,刚开播豆瓣上的评论就两极分化了(这是我验证过的结果),这里我也尝试分析下这些评论的情感倾向,看下用户对这部剧的喜好与否。
1.数据准备
先写个爬虫把豆瓣上的《风起洛阳》的评论抓下来。豆瓣这个网站很有意思,看一个电影或者电视剧的评论,如果不登录的话,在豆瓣网页上只能看大概200条评论,登录也只能看500条左右的评论,就很迷!
登录下豆瓣,然后把cookie复制到代码里,就能抓到500多条评论,存到txt文本里备用。
import requests
from lxml import etree
url = "https://movie.douban.com/subject/33442334/comments?start={}&limit=20&sort=new_score&status=P&percent_type="
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3724.8 Safari/537.36',
'Connection': 'keep-alive',
'cookie': 'Your cookie‘’,
}
with open("./fqly_comment.txt", "w", encoding='utf-8') as f:
start = 0
while start <= 480:
print(url.format(start))
response = requests.get(url.format(start), headers=headers)
html = etree.HTML(response.content.decode())
for div in html.xpath('//div[@id="comments"]/div[contains(@class,"comment-item")]'):
comment = div.xpath('./div[@class="comment"]/p/span/text()')[0]
f.write(comment)
f.write('\n')
start += 20
得评论如下:
2.评论的情感分析
上面拿到的评论,简单清洗下,然后做每条评论的语义情感分析,评论情感倾向定义为:
positive 正向,积极的情感倾向
negative 负向,消极的情感倾向
import paddlehub as hub from openpyxl import load_workbook if __name__ == "__main__": # 加载senta模型 senta = hub.Module(name="senta_bilstm") comments = list() with open("./fqly_comment.txt", "r", encoding='utf-8') as f: for line in f.readlines(): line = line.strip("\n") if line != "": comments.append(line) # 把要测试的短文本以str格式放到这个列表里 test_text = comments # 指定模型输入 input_dict = {"text": test_text} # 把数据喂给senta模型的文本分类函数 results = senta.sentiment_classify(data=input_dict) # 遍历分析每个短文本 positive_nums = 0 negative_nums = 0 for index, text in enumerate(test_text): results[index]["text"] = text file_name = "./comment_emotion.xlsx" wb = load_workbook(filename=file_name) ws = wb.active fields = ["评论", "评论情感倾向", "积极情感倾向指数", "消极情感倾向指数"] ws.append(fields) for index, result in enumerate(results): print(results[index]) #print('text: {},\t predict: {}'.format(results[index]['text'][:50], results[index]['sentiment_key'])) sentiment_key = results[index]['sentiment_key'] if sentiment_key == "positive": positive_nums = positive_nums+1 emotion = "积极" elif sentiment_key == "negative": negative_nums = negative_nums+1 emotion = "消极" ws.append([results[index]['text'], emotion, results[index] ['positive_probs'], results[index]['negative_probs']]) wb.save(filename=file_name) print('积极评论数: {}, 消极评论数: {}'.format(positive_nums, negative_nums))
我这里还把分析结果存到excel里,方便看:
在抓到的评论里,代码生成结果:正向积极的评论有 301 条,负向消极的评论有 253 条。
Ending
我开始是就说了《风起洛阳》这部剧的评论有点两极分化,也是基于我的分析结果得出的,毕竟301 vs 253嘛。《风起洛阳》是2021-12-01开播,我是昨天晚上刚看了一集。如果加上我的评论的话,那这个比数就变成 301 vs 254 了。当然这部剧刚开播时间尚短,现在的评论只是基于前几集的内容,待以后的剧集更新完,到时候的评论可能更能反应用户对整部剧的看法。
还有一个最重要的就是,“仁者见仁智者见智”,不引战!!!
源代码以及相关资源文件都在这:https://gitee.com/shiyilin/PythonSpiders/tree/master/fqly