前言
文本数据分析能够有效帮助我们理解数据语料, 快速检查出语料可能存在的问题, 并指导之后模型训练过程中一些超参数的选择
题目
中文酒店评论数据分析
主要是判别该数据的好坏,评论为二分类,好评用1表示,差评用0表示
判别方面
- 排除极端数据,判断评论的好坏有没有一边倒,比如好评占比90%,差评占比10%
- 判断这些评论大部分为长文本还是短文本,或是长短相差无几
导入数据
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)