一、数据准备:
链接: https://pan.baidu.com/s/1HDdsnZDTgkpPTWF4X_efow 提取码: 4tk2 复制这段内容后打开百度网盘手机App,操作更方便哦。
二、相关工具包:
导入必备工具包
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt导入chain方法用于扁平化列表
import jieba
from itertools import chain使用jieba中的词性标注功能
import jieba.posseg as pseg
导入绘制词云的工具包
from wordcloud import WordCloud
三、步骤:
1、导入必备工具包。
2、读取数据集-分别读取训练集tsv和验证集tsv。
3、获取训练集、验证集数据标签数量分布。
4、绘制句子长度列的数量分布图。
5、获取训练集与验证集不同词汇总数的统计。
6、获得训练集上正负的样本的高频形容词词云。
四、编辑py文件:
# 导入必备工具包
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
# 导入chain方法用于扁平化列表
import jieba
from itertools import chain
# 使用jieba中的词性标注功能
import jieba.posseg as pseg
# 导入绘制词云的工具包
from wordcloud import WordCloud
# 设置显示风格
plt.style.use('fivethirtyeight')
# 分别读取训练集tsv和验证集tsv
train_data = pd.read_csv(
"/Users/weixiujuan/study/cn_data/train.tsv", sep="\t")
valid_data = pd.read_csv(
"/Users/weixiujuan/study/cn_data/dev.tsv", sep="\t")
# 获取训练集数据标签数量分布
sns.countplot("label", data=train_data)
plt.title("train_data")
plt.show()
# 获取验证数据标签数量分布
sns.countplot("label", data=valid_data)
plt.title("valid_data")
plt.show()
# 在训练数据中添加新的句子长度列,每个元素的值都是对应的句子列的长度
train_data["sentence_length"] = list(map(lambda x: len(x), train_data["sentence"]))
# 绘制句子长度列的数量分布图
sns.countplot("sentence_length", data=train_data)
# 主要关注count长度分布的纵坐标,不需要绘制横坐标,横坐标范围通过dist图进行查看
plt.xticks([])
plt.show()
# 绘制dist长度分布图
sns.displot(train_data["sentence_length"])
# 主要关注dist长度分布横坐标,不需要绘制纵坐标
plt.yticks([])
plt.show()
# 在验证数据中添加新的句子长度列,每个元素的值都是对应的句子列的长度
valid_data["sentence_length"] = list(map(lambda x: len(x), valid_data["sentence"]))
# 绘制句子长度列的数量分布图
sns.countplot("sentence_length", data=valid_data)
# 主要关注count长度分布的纵坐标,不需要绘制横坐标,横坐标范围通过dist图进行查看
plt.xticks([])
plt.show()
# 绘制dist长度分布图
sns.displot(valid_data["sentence_length"])
# 主要关注dist长度分布横坐标,不需要绘制纵坐标
plt.yticks([])
plt.show()
# 获取训练集长度分布的散点图
sns.stripplot(y='sentence_length', x='label', data=train_data)
plt.show()
# 绘制验证集长度分布的散点图
sns.stripplot(y='sentence_length', x='label', data=valid_data)
plt.show()
# 3、获取训练集与验证集不同词汇总数的统计:
# 进行训练集的句子进行分词,并统计出不同词汇的总数
train_vocab = set(chain(*map(lambda x: jieba.lcut(x), train_data["sentence"])))
print("训练集共包含不同词汇总数为:", len(train_vocab))
# 进行验证集的句子进行分词,并统计出不同词汇的总数,set可去重
valid_vocab = set(chain(*map(lambda x: jieba.lcut(x), valid_data["sentence"])))
print("验证集共包含不同词汇总数为:", len(valid_data))
# 4、获得训练集上正负的样本的高频形容词词云:
def get_a_list(text):
"""用于获取形容词列表"""
# 使用jieba的词性标注方法切分文本,获得具有词性属性flag和词汇属性word的对象,
# 从而判断flag是否为形容词,来返回对应的词汇
r = []
for g in pseg.lcut(text):
if g.flag == "a":
r.append(g.word)
return r
def get_word_cloud(keywords_list):
"""绘制词云"""
# 实例化绘制词云的类,
# 其中三个参数:
# font_path:是字体路径,为了能够显示中文,
# max_words:指词云图像最多显示多少个词,
# background_color:为背景颜色
wordcloud = WordCloud(font_path="/Users/weixiujuan/Downloads/util/SimHei.ttf",
max_words=100, background_color="white")
# 将传入的列表转化成词云生成器需要的字符串形式
keywords_string = " ".join(keywords_list)
# 生成词云
wordcloud.generate(keywords_string)
# 绘制图像并显示
plt.figure()
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
# 获得训练集上正样本,提取sentence列
p_train_data = train_data[train_data["label"] == 1]["sentence"]
# 对正样本的每个句子的形容词
train_p_a_vocab = chain(*map(lambda x: get_a_list(x), p_train_data))
# print(train_p_a_vocab)
# 训练集上的负样本
n_train_data = train_data[train_data["label"] == 0]["sentence"]
# 获取负样本的每个句子的形容词
train_n_a_vocab = chain(*map(lambda x: get_a_list(x), n_train_data))
# 调用绘制词云函数
get_word_cloud(train_p_a_vocab)
get_word_cloud(train_n_a_vocab)
# 5、获得验证集上正负的样本的形容词词云
# 获得验证集上正样本
p_valid_data = valid_data[valid_data["label"] == 1]["sentence"]
# 对正样本的每个句子的形容词
valid_p_a_vocab = chain(*map(lambda x: get_a_list(x), p_valid_data))
# print(valid_p_a_vocab)
# 获得验证集上的负样本
n_valid_data = valid_data[valid_data["label"] == 0]["sentence"]
# 获取负样本的每个句子的形容词
valid_n_a_vocab = chain(*map(lambda x: get_a_list(x), n_valid_data))
# 调用绘制词云函数
get_word_cloud(valid_p_a_vocab)
get_word_cloud(valid_n_a_vocab)