手把手教你完成一个数据科学小项目(9):情感分析与词云

前言

请先阅读“中国年轻人正带领国家走向危机”,这锅背是不背? 一文,以对“手把手教你完成一个数据科学小项目”系列有个全局性的了解。

本系列代码统一开源在GitHub:DesertsX/gulius-projects ,感兴趣的朋友可以先行 star 哈。

截至目前我们已经完成了数据爬取数据提取与IP查询数据异常与清洗评论数变化情况分析省份提取与可视化城市提取与可视化经纬度获取与BDP可视化Emoji提取与分布图谱。本文将用snownlp对评论进行情感打分,并提取高频词绘制词云。

SnowNLP 情感打分

读取数据,并提前安装好这个NLP的库:pip install snownlp 。其他用法参见:snownlp - github ,本文只对每条评论数据进行情感打分。

import pandas as pd
from snownlp import SnowNLP
df = pd.read_csv('Sina_Finance_Comments_All_20180811_Cleaned.csv',encoding='utf-8')

def sentiment(content):
    s = SnowNLP(content)
    return s.sentiments

df['sentiment'] = df.content.apply(sentiment)

df_sent = df[['content', 'sentiment']]
df_sent.sort_values(by=['sentiment'],ascending=False)

注意,snownlp 是基于电商评价的语料语料,所以对其他语料进行情感打分可能效果不是很好,可自行尝试其他库pyltp/thunlp/pyhanlp/bosonnlp进行比较,“择其善者而从之”...

如果评论数据量大的话,这一步会耗些时间,可以喝杯枸杞酒压压惊。

先来看看正面的评价,评分处于0-1之间,越接近1越正面:


再来看看负面的评论

df_sent.sort_values(by=['sentiment'])

本次就不进行更细致的挖掘了,大家可自行进行探索,相信经过这一个系列的洗礼,诸位pandas操作起来已经滚瓜切菜,不在话下了吧。

基于 TF-IDF 算法的关键词抽取

接下来看看评论里出现的关键词都有哪些,直接用jieba提取就行,allowPOS参数可设置输出对应词性的词语。

import jieba.analyse
all_content = df.content.values.tolist()
extract_tags = "  ".join(jieba.analyse.extract_tags(' '.join(all_content), topK=200, withWeight=False, allowPOS=('ns', 'n')))
print(extract_tags)

自行感受一下......大家反应强烈,并不愿背锅。

年轻人  买房  摊手  借贷  房子  贷款  国家  韭菜  危机  文章  孩子  债务  房价  中国  标题  手机  买手机  评论  背锅  不语  拜拜  信用卡  大牌  衣服  父母  咖啡  买房子  银行  经济  篇文章  感觉  问题  智能手机  大家 
全款  意思  时候  媒体  内需  社会  俄罗斯  黑锅  一代人  东西  大锅  原文  卧槽  家庭  美国  杠杆  套房  有点  财经  租房  年轻一代  校园  新闻  逻辑  脑子  负债  花钱  砖家  消费观念  白条  地方  苹果  恶心  干嘛  人家   
能力  道理  智商  屌丝  毛病  信贷  水平  城市  老年人  习惯  奢侈品  数据  钱包  生娃  小编  广州  作者  祖国  节奏  英国  老一辈  中年人  关键  无力  言论  内容  车贷  压力  学区  生小孩  阴险  人生  物价  时代  历史 
买点  垃圾  穷人  老师  存款  利息  问问  屁事  消费观  消费主义  世界  北京  责任  后背  大学生  代表  结果  神经病  国际金融  气死  租金  合格  降级  长大  编辑  买车  故事  眼球  企业  贡献  车子  黑线  风险  单身   
高利贷  裤腰带  同龄人  兄弟  爷爷奶奶  奶茶  月薪  专家  坏事  狗屁  过日子  要点  事情  县城  白眼  独生子女  基本  爸爸  课本上  博主  沙雕  辣鸡  背锅侠  次贷  玩玩  负债率  重点  人民  报章  过度   
拖后腿  帽子  医疗  政府  价格  小鸟  老人  外国  玩乐  价值观  蚂蚁  代人  回家   通篇  创业  经济学  交税  公积金  结论  领路人  时间  丈母娘  小时候  啥意思  样子  马车  咖啡馆  身体  房奴  全部  天将  思想

词云

这一步繁琐了,大家有简洁的代码可替换掉。

import jieba
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

all_content = df.content.values.tolist()
print(len(all_content), '\n', all_content[-1])

segment = []
for line in all_content:
    try:
        segs = jieba.lcut(line)
        for seg in segs:
            if len(seg)>1 and seg != '\r\n':
                segment.append(seg)
    except:
        print(line)
        continue
# 去停用词
words_df = pd.DataFrame({"segment": segment})

words_stat = words_df.groupby(by=['segment'])['segment'].agg({"计数": np.size})
words_stat = words_stat.reset_index().sort_values(by=["计数"], ascending=False)
words_stat.head(20)

高频词如下所示,和上面提取的关键词很多重合:


老朋友pyecharts轻松绘制颜值不俗的词云:

from pyecharts import WordCloud
wordcloud = WordCloud(width=800, height=520)
wordcloud.add("评论词云", words_stat['segment'], words_stat['计数'], word_size_range=[20, 100])
wordcloud

舆论情况如下:


评论内容详情

最后再提下,用pandas读取的数据,无法看到每条评论的全部内容,不太清楚有没有参数可以设置查看全部文本。

这里自行查看长度在50-100区间内的全部评论数据:

import pandas as pd
df = pd.read_csv('Sina_Finance_Comments_All_20180811_toBDP.csv',encoding='utf-8')
df_wa = df[['No','nick','content','length','area','pro','city','emojis_list','time','stamp']]
cont_50_100 = df_wa_len[(df_wa_len['length']<100) & (df_wa_len['length']>=50)]['content'].values.tolist()
for c in cont_50_100:
    print(c,'\n')

完结撒花

以上算是更新完了本项目的全部内容,不算长也不算短的旅程里,耳闻目睹了不少小伙伴去DesertsX/gulius-projects - GitHub下载了代码,并跟着跑程序,古柳也很好奇大家的感受如何,欢迎留言评论进行反馈和分享哈。

此外,古柳也相信大家已经能够应用到自己感兴趣的数据集上并进行好玩的分析、挖掘和可视化了,期待大家分享自己的作品哈。

这里先剧透下古柳想玩的一些玩意,以之前热播的于正的清宫剧《延禧攻略》为例,可以用MIT的深度学习训练后的接口进行城市街景识别,看看下图“大猪蹄子”皇上的场景是什么?



诚不我欺,给出的结果还是挺可靠的:

Type of environment: outdoor
Scene categories: temple/asia (0.778)
Scene attributes: man-made, open area, natural light, sunny, touring, clouds, shingles, far-away horizon, semi-enclosed area

再用偶然接触到的某知识图谱API看看与实体“延禧攻略”相关的内容:



由于原本数据来源就是豆瓣等平台,所以还是蛮准确的,能深挖的内容也很多,比如古柳脑洞清奇的把这个知识图谱API用来当获取豆瓣数据的“爬虫”接口了。逃......以上,这里先卖个关子,后续揭秘这两个好玩的网站哈。

相关文章

本系列及后续其他项目的代码统一开源在GitHub:DesertsX/gulius-projects ,感兴趣的朋友可以先行 star 哈。

本系列文章:
“中国年轻人正带领国家走向危机”,这锅背是不背?
手把手教你完成一个数据科学小项目(1):数据爬取
手把手教你完成一个数据科学小项目(2):数据提取、IP 查询
手把手教你完成一个数据科学小项目(3):数据异常与清洗
手把手教你完成一个数据科学小项目(4):评论数变化情况
手把手教你完成一个数据科学小项目(5):省份提取与可视化
手把手教你完成一个数据科学小项目(6):城市提取与可视化
手把手教你完成一个数据科学小项目(7):经纬度获取与BDP可视化
手把手教你完成一个数据科学小项目(8):Emoji提取与分布图谱

推荐阅读更多精彩内容