前言

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

题目

中文酒店评论数据分析

主要是判别该数据的好坏,评论为二分类,好评用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)
    

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

Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐