文本数据分析之中文酒店评论数据分析

前言

文本数据分析能够有效帮助我们理解数据语料, 快速检查出语料可能存在的问题, 并指导之后模型训练过程中一些超参数的选择

题目

中文酒店评论数据分析

主要是判别该数据的好坏,评论为二分类,好评用1表示,差评用0表示

判别方面

  1. 排除极端数据,判断评论的好坏有没有一边倒,比如好评占比90%,差评占比10%
  2. 判断这些评论大部分为长文本还是短文本,或是长短相差无几

导入数据


import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

#更改plt的呈现风格,更多参数详见https://blog.csdn.net/qq_42505705/article/details/84962815
plt.style.use('fivethirtyeight')

#train_data用来训练的数据
#test_data用来测试的数据
train_data = pd.read_csv('./nlp/textDataProcess/cn_data/train.tsv',sep='\t')
test_data = pd.read_csv('./nlp/textDataProcess/cn_data/dev.tsv',sep='\t')

可视化原始数据分布

对评论内容的好坏进行统计
#seaborn统计数据可视化库
sns.countplot("label",data=train_data)
plt.title("train_data")
plt.show()

sns.countplot("label",data=test_data)
plt.title("test_data")
plt.show()

在这里插入图片描述
在这里插入图片描述

结果评论

从结果可以看出,在train_data中差评比好评多,在test_data中则相反,可以采取数据删减使得两者一样,或是数据增强来使得其一样。

对评论内容的长度进行统计
#将sentence列的数据统计出来的字符长度新建为列表加入到train_data中
train_data["sentence_length"] = list(map(lambda x:len(x),train_data["sentence"]))

sns.countplot("sentence_length",data=train_data)
plt.xticks([])
plt.show()

在这里插入图片描述

sns.displot(train_data["sentence_length"])
plt.yticks([])
plt.show()

在这里插入图片描述
同理test_data做相同的处理

结果评论

从train_data的柱状图可以看出,它的评论长度大部分集中在0~250个字左右。
可以截取这部的评论

对评论内容长度的散点分布
# 获取训练集和测试集的正负样本长度散点分布
sns.stripplot(x='label',y="sentence_length",data=train_data)
plt.title("train_data")
plt.show()

sns.stripplot(x='label',y="sentence_length",data=test_data)
plt.title("test_data")
plt.show()

在这里插入图片描述在这里插入图片描述

结果评论

从两张图可以看出,有少部分的评论长度过长,可以去除这些数据

获取评论内容中形容词的词云
# 获取训练集和测试集不同词汇总数统计
import jieba
from itertools import chain
train_vocab = set(chain(*map(lambda x:jieba.lcut(x),train_data["sentence"])))
print("训练集包含不同词汇的总数为:\n",len(train_vocab))

test_vocab = set(chain(*map(lambda x:jieba.lcut(x),test_data["sequence"])))
print("测试集包含不同词汇的总数为:\n",len(test_vocab))

在这里插入图片描述

# 获取训练集上的高频形容词词云
#jieba.cut->cut提供最基本的分词功能,返回的结果是个生成器generator,可通过迭代的方法访问各个分词
#jieba.lcut->lcut返回的是list。也可以通过list(jieba.cut()) 来等价jieba.lcut()
#jieba.posseg.lcut->posseg还提供了词性,方便对句法做分析
import jieba.posseg as pseg
def get_adj_list(text):
    r = []
    #pseg.lcut(text)返回两个值【word,flag】,访问可以用生成器g.word、g.flag
    for word,flag in pseg.lcut(text):
        if flag == 'a':
            r.append(word)
    return r

# 导入绘制词云的工具包
from wordcloud import WordCloud

def get_word_cloud(ketwords_list):
    wordcloud = WordCloud(font_path="./nlp/textDataProcess/chinese.ttf",max_words=100,background_color="lightpink")
    ketwords_strings = ' '.join(ketwords_list)
    wordcloud.generate(ketwords_strings)

    plt.figure()
    plt.imshow(wordcloud,interpolation='bilinear')
    plt.axis("off")
    plt.show()

if __name__ == "__main__":
    p_train_data1 = train_data[train_data["label"]==1]["sentence"]
    train_adj_vocab = chain(*map(lambda x:get_adj_list(x),p_train_data1))
    get_word_cloud(train_adj_vocab)

    p_train_data0 = train_data[train_data["label"]==0]["sentence"]
    train_adj_vocab = chain(*map(lambda x:get_adj_list(x),p_train_data0))
    get_word_cloud(train_adj_vocab)
    

在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

365JHWZGo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值