天池比赛——用户情感可视化分析

天池比赛——用户情感可视化分析

目录

天池比赛——用户情感可视化分析

前言

一、读取数据,查看基本情况并做数据预处理

引入相关库

读取数据,基础分析数据

空值处理,数据映射

对评论进行分词分析

二、词云可视化

三、柱状图

四、热力图

总结


前言

这是一个天池里的教学赛,整体没什么难度,主要是对pandas,基本的数据分析的练习。

题目主要内容如下

  1. 词云可视化(评论中的关键词,不同情感的词云)
  2. 柱状图(不同主题,不同情感,不同情感词)
  3. 相关性系数热力图(不同主题,不同情感,不同情感词)

其中数据源主要如下

字段名称类型描述说明
content_idInt数据ID/
contentString文本内容/
subjectString主题提取或依据上下文归纳出来的主题
sentiment_valueInt情感分析分析出的情感
sentiment_wordString情感词情感词

下面直接分析数据并完成内容

一、读取数据,查看基本情况并做数据预处理

当得到一个数据的时候,我们应该对数据包含什么信息,数据中是否有缺省值,某些列值有什么取值等情况进行查看

引入相关库

import numpy as np
import pandas as pd
from pylab import *
import matplotlib.pyplot as plt
import seaborn as sns
import jieba

读取数据,基础分析数据

#读取数据
df = pd.read_csv('./data/earphone_sentiment.csv')
#查看数据前几行信息
df.head()

#查看数据基本信息
print(df.info())
print("----------------")
#查看数据缺指信息
print(df.isnull().sum())
print("----------------")
print(df['sentiment_word'].unique())
print("----------------")
print(df['sentiment_value'].value_counts())

输出如下,这里主要分析了表格中缺省值和 sentiment_word这一列的取值,因为我们这里分析主要也是针对情感词来进行分析的(这个比赛比较简单还在与直接给出了情感词)

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 17176 entries, 0 to 17175
Data columns (total 5 columns):
 #   Column           Non-Null Count  Dtype 
---  ------           --------------  ----- 
 0   content_id       17176 non-null  int64 
 1   content          17176 non-null  object
 2   subject          17176 non-null  object
 3   sentiment_word   4966 non-null   object
 4   sentiment_value  17176 non-null  int64 
dtypes: int64(2), object(3)
memory usage: 671.1+ KB
None
----------------
content_id             0
content                0
subject                0
sentiment_word     12210
sentiment_value        0
dtype: int64
----------------
dtype: int64
 0    12210
 1     4376
-1      590
Name: sentiment_value, dtype: int64
----------------
不评价    12210
好       3302
不错       569
差        415
强        244
牛        133
垃圾        32
高级        31
追求        26
呵呵        24
难听        22
骗         21
噪音        16
用心        16
舒适        16
疼         14
音染        14
水准        12
轰         10
精致         7
惊艳         7
良心         7
无语         6
无奈         5
不舒服        4
小巧         3
充足         3
上当         2
辣鸡         2
模糊         2
混浊         1
Name: sentiment_word, dtype: int64

空值处理,数据映射

由输出的数据可以分析出,我们可以根据sentiment_value的值对sentiment_word进行划分为3类,分别为0对于没有评价,我们这里当作是中性评价,1对于好评,-1对应差评。所以再做以下数据预处理——填上空值,对sentiment_value做映射

# 填上空值
df['sentiment_word'].fillna('不评价', inplace=True)
# 将sentiment_value映射
map_sentiment_value = {-1: '差评', 0: '中评', 1: '好评'}
df['sentiment_value'] = df['sentiment_value'].map(map_sentiment_value)

做个关于情感词和主题之间的透视表,可以很直观的看出,每个主题中好评,差评,中评的情况

# 做sentiment_value的透视表
df_pivot_table = df.pivot_table(index='subject', columns='sentiment_value', values='sentiment_word',
                                aggfunc=np.count_nonzero)

df_r_pivot_tabel = df.pivot_table(index='sentiment_value', columns='subject', values='sentiment_word',
                                   aggfunc=np.count_nonzero)
sentiment_value    中评    好评   差评
subject                         
价格                495   256   42
其他               9493  2837  326
功能                 83    63   10
外形                 85    68    5
舒适                 10    37   22
配置               1452   759  121
音质                592   356   64
subject           价格    其他  功能  外形  舒适    配置   音质
sentiment_value                                  
中评               495  9493  83  85  10  1452  592
好评               256  2837  63  68  37   759  356
差评                42   326  10   5  22   121   64

对评论进行分词分析

我们还需要对数据中content评论部分进行分析,而评论中有许多不必要的内容,我们就需要对此分词并去除停用词(也就是一些连接词,以帮助我们分析),对评论分词,主要应用jieba这个分词包。停用词用的是常用的中文停用词。在下面链接中可以获取。

中文常用停用词表

stopwords = []
with open('./data/mStopwords.txt', encoding='utf-8') as f:
    for line in f:
        stopwords.append(line.strip('\n').split()[0])

# 切词
rows, cols = df.shape
cutwords = []
for i in range(rows):
    content = df['content'][i]
    g_cutword = jieba.cut_for_search(content)
    cutword = [x for x in g_cutword if (len(x) > 1) and x not in stopwords]
    cutwords.append(cutword)

s1 = pd.Series(cutwords)
df['cutwords'] = s1
print(s1.value_counts())

用jieba这个包,很容易将分词搞定,结果如下。

0                      [Silent, Angel, 期待, 光临, 共赏, 美好, 声音]
1        [HD650, 1k, 失真, 声道, 左声道, 声道, 右声道, 左右, 超出, 官方, ...
2                                [达音科, 17, 周年, 数据, 好看, 便宜]
3               [bose, beats, apple, 消費者, 根本, 知道, 有曲線, 存在]
4                                                 [不错, 数据]
                               ...                        
17171                        [3000, 价位, hd650, S7, 更好, 耳放]
17172                          [hd800, 爆皮, 正常, 根线, 这种, 忧虑]
17173     [焊接, 一下, 就行了, 820, 原线, 全新, 800s, 原线, 99, 盒子, 没动]
17174                                             [赶紧, 出手]
17175           [sommer, 参考, diy, 两米, 成本, 600, 左右, 吊打, 原线]

由于我们还要做不同情感的分析,所以我们根据sentiment_value的值,将表格划分为差评,中评和好评三个表。

# 根据情感划分切词
df_pos = df.loc[df['sentiment_value'] == '好评'].reset_index(drop=True)
df_neu = df.loc[df['sentiment_value'] == '中评'].reset_index(drop=True)
df_neg = df.loc[df['sentiment_value'] == '差评'].reset_index(drop=True)

这里基本的预处理就结束了,也对数据有了一个直观的了解,后面就通过一些手段可视化上面的结果。

二、词云可视化

想利用词云可视化,主要是利用WordCloud这个开源包,这个包直接用pip安装有可能会出现问题,所以这部分我直接在百度的AIstudio上跑了。

这个库用起来也比较简单,只需要设定自己需要的txt文件和图案,调个包就好了。

里面的图片都是上网随便找的黑白图

pos_txt = '/'.join(np.concatenate(pos_df['cutwords']))
neg_txt = '/'.join(np.concatenate(neg_df['cutwords']))
neu_txt = '/'.join(np.concatenate(neu_df['cutwords']))
neu_mask = imread('./data/neu.png')
pos_mask = cv.imread('./data/pos.png')
neg_mask = cv.imread('./data/neg.png')
# 绘制好评词云
pos_wc = WordCloud(font_path='./data/simhei.ttf',background_color='white',mask=pos_mask).generate(pos_txt)
neg_wc = WordCloud(font_path='./data/simhei.ttf',background_color='white',mask=neg_mask).generate(neg_txt)
neu_wc = WordCloud(font_path='./data/simhei.ttf',background_color='white',mask=neu_mask).generate(neu_txt)

plt.subplot(1,3,1)
plt.imshow(pos_wc)
plt.title("Postive wordcloud")
plt.axis('off')
plt.subplot(1,3,2)
plt.imshow(neu_wc)
plt.axis('off')
plt.title("Neutural wordcloud")
plt.subplot(1,3,3)
plt.imshow(neg_wc)
plt.title("Negative wordcloud")
plt.axis('off')
plt.show()

三、柱状图

柱状图主要分析不同主题下,不同情感评论的评论数,来看用户重点关注的地方是什么。

# 直接对透视表使用绘图即可
df_pivot_table.plot.bar()
for x, y in enumerate(df_pivot_table['中评'].values):
    plt.text(x - 0.2, y, str(y), horizontalalignment='right')
for x, y in enumerate(df_pivot_table['好评'].values):
    plt.text(x, y, str(y), horizontalalignment='center')
for x, y in enumerate(df_pivot_table['差评'].values):
    plt.text(x + 0.2, y, str(y), horizontalalignment='left')
plt.title('不同主题,不同情感评论数')
plt.ylabel('评论数')
plt.show()

可以看到用户多集中在价格,配置和音质上评论,其他方面比较多评论。

然后我们可以看看在褒义词和贬义词中比较多的评论在说什么 

# 取出褒义词和贬义词中的评论列
pos_word = df_pos['sentiment_word'].value_counts()
neg_word = df_neg['sentiment_word'].value_counts()

pos_word.plot.barh()
for x, y in enumerate(pos_word):
    plt.text(y, x, str(y), horizontalalignment='left')
plt.xlabel('评论数')
plt.title('褒义词评论词统计')
plt.show()

neg_word.plot.barh()
for x, y in enumerate(neg_word):
    plt.text(y, x, str(y), horizontalalignment='left')
plt.xlabel('评论数')
plt.title('贬义词评论词统计')
plt.show()

 

四、热力图

热力图的绘制,主要是来看耳机不同的方面的相关系数,主要调用seaborn这个包,对pandas也是兼容非常好。

# 热力图
sns.heatmap(df_r_pivot_tabel.corr(), annot=True)
plt.title('不同主题相关系数热力图')
plt.show()

 

显然,舒适感,和其他的方面都成负相关的关系,而其他功能上基本都呈正相关关系。 

总结

一个对于学习pandas和一些可视化,非常好的比赛。

### 关于情感分析可视化的工具、方法或教程 #### 背景知识与发展脉络 数据分析可视化的目标在于通过直观的方式呈现复杂的数据模式和趋势,从而帮助人们更好地理解数据中的信息[^1]。在情感分析领域,可视化技术能够将文本的情感特征转化为图形表示,使得分析师可以快速识别情绪分布及其变化。 --- #### 微博数据分析可视化教程 一个具体的案例来自 `weibo-analysis-and-visualization` 项目,该项目提供了详细的微博数据分析流程,其中包括多种情感分析可视化形式[^2]: - **LDA 主题建模**:利用 LDA 对微博文本进行主题抽取,并以树图的形式展示各个主题之间的层次结构。 - **关系图**:用于描绘用户之间或者话题之间的关联程度。 - **词云**:突出显示高频词汇,反映当前热点讨论的内容。 - **时间趋势(折线图)**:展现特定时间段内的舆情波动情况。 - **热度地图**:基于地理位置的信息生成热力图,揭示哪些地区对该事件的关注度较高。 - **情感分析图表**: - 饼图和 3D 柱状图可用于比较正面、负面及中立三种情绪的比例; - 条形图则适合对比不同类别下的具体评分差异。 以下是绘制条形图的一个实例代码片段[^3]: ```python import seaborn as sns import matplotlib.pyplot as plt # 解决中文乱码问题 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 数据可视化 sns.barplot(x=list(sum_scores.values()), y=list(sum_scores.keys())) plt.xlabel('情感值') plt.ylabel('主题') plt.title('不同主题下的情感得分柱形图') for x, y in enumerate(list(sum_scores.values())): plt.text(y, x, '%s' % y, va='center') plt.show() ``` 此脚本实现了根据不同主题计算得出的情感分数制作成垂直排列的直方图样式,便于观察每种分类对应的情绪强度大小。 此外,还有更高级的技术应用到该场景里头,像 TF-IDF 加权后的 K-Means 或 DBSCAN 聚类算法来发现隐藏群体;借助预训练好的 Word Embedding 向量空间模型执行语义层面的距离测量进而完成相似文档检索等功能扩展。 --- #### 推荐工具列表 对于希望深入研究并实践上述提到的各种技术和手段的学习者来说,下面列举了一些常用且强大的开源软件包可供参考选用: | 名称 | 功能描述 | |---------------|---------------------------------------------------------------------------------------------| | Matplotlib | Python 的基础绘图库,支持创建静态、动态以及交互式的二维图像 | | Seaborn | 建立在 Matplotlib 上面的一层封装接口,简化了许多统计学相关的作图操作 | | Plotly | 提供在线编辑器和服务端渲染功能的强大 JavaScript 图表库 | | Bokeh | 类似于 Plotly ,专注于构建可缩放的大规模 Web 应用程序 | | Gephi | 开源网络分析平台,擅长处理大规模节点边集合 | | Tableau Public| 商业智能解决方案之一,允许任何人免费分享他们的作品 | 这些资源各有侧重方向,可以根据实际需求挑选合适的产品组合起来使用。 --- #### 总结 综上所述,在开展涉及自然语言处理任务特别是针对社交媒体评论之类非结构性资料实施量化评估工作之前,有必要熟悉掌握一系列专门设计用来辅助此类工作的专用框架和技术栈。只有这样才能够高效准确地挖掘潜在价值所在之处。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzzzzzzm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值