# coding: utf-8
import jieba
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
from itertools import chain
import jieba.posseg as pseg
from wordcloud import WordCloud
# 显示内置风格
# 1. default (Matplotlib 3.0+ 默认风格)
# • 特点: Matplotlib 在 3.0 版本中改进的默认样式,更现代、清晰。
# • 适用场景: 各类数据分析、报告。作为默认样式,适合大部分通用绘图需求。
# 2. ggplot
# • 特点: 模仿 R 语言 ggplot2 包的样式,灰色背景、浅色网格,简洁清晰。
# • 适用场景: 数据科学报告、数据展示,尤其是习惯于 R 风格的用户。广泛用于统计图表,适合展示数据趋势。
# 3. fivethirtyeight
# • 特点: 模仿 FiveThirtyEight 网站的风格,淡灰背景,线条粗,文字清晰,有较高辨识度。
# • 适用场景: 适合数据驱动的新闻风格图表,适用于展示数据新闻、商业报告等。
# 4. Solarize_Light2
# • 特点: 明亮的太阳能风格,背景为浅色,线条和颜色较为柔和。
# • 适用场景: 比较独特的浅色风格,适合在深色背景上展示数据或生成不一样的报告风格。
def dm_label_sns_countplot():
# 1 设置显示风格
plt.style.use('ggplot')
# 2 读取数据
train_data = pd.read_csv('./cn_data/train.tsv', sep='\t')
print(train_data.head())
print(type(train_data))
dev_data = pd.read_csv('./cn_data/dev.tsv', sep='\t')
# 3 统计训练集的01标签 countplot条形图
sns.countplot(x='label', data=train_data, hue='label')
plt.title('train_data')
plt.show()
# 4 统计dev
sns.countplot(x='label', data=dev_data, hue='label')
plt.title('dev_data')
plt.show()
def dm_len_sns_countplot_displot():
# 1 设置显示风格
plt.style.use('ggplot')
# 2 读取数据
train_data = pd.read_csv('./cn_data/train.tsv', sep='\t')
print(train_data.head())
print(type(train_data))
dev_data = pd.read_csv('./cn_data/dev.tsv', sep='\t')
# 3 添加一列句子长度
train_data['sentence_length'] = list(map(lambda x: len(x), train_data['sentence']))
print(train_data.head())
dev_data['sentence_length'] = list(map(lambda x: len(x), dev_data['sentence']))
print(dev_data.head())
print(train_data['sentence_length'].max())
print(dev_data['sentence_length'].max())
# 4 绘制图像 train
sns.countplot(x='sentence_length', data=train_data)
plt.xticks([]) # 不显示x轴刻度
plt.show()
sns.displot(x='sentence_length', data=train_data, kde=True)
plt.xticks([i for i in range(0, 3500, 200)])
plt.show()
# 5 绘制 dev
# countplot 条形图;displot直方图,kde=True密度曲线图
sns.countplot(x='sentence_length', data=dev_data)
plt.show()
sns.displot(x='sentence_length', data=dev_data, kde=True)
plt.xticks([i for i in range(0, 3500, 200)])
plt.show()
def dm_sns_stripplot():
# 1 设置显示风格
plt.style.use('ggplot')
# 2 读取数据
train_data = pd.read_csv('./cn_data/train.tsv', sep='\t')
print(train_data.head())
print(type(train_data))
dev_data = pd.read_csv('./cn_data/dev.tsv', sep='\t')
# 3 添加一列句子长度
train_data['sentence_length'] = list(map(lambda x: len(x), train_data['sentence']))
print(train_data.head())
dev_data['sentence_length'] = list(map(lambda x: len(x), dev_data['sentence']))
print(dev_data.head())
# 4 绘制训练集散点图 stripplot
sns.stripplot(y='sentence_length', x='label', data=train_data, hue='label')
plt.show()
# 5 绘制 dev
sns.stripplot(y='sentence_length', x='label', data=dev_data, hue='label')
plt.show()
def dm_words_count():
# 1 读取数据
train_data = pd.read_csv('./cn_data/train.tsv', sep='\t')
dev_data = pd.read_csv('./cn_data/dev.tsv', sep='\t')
# 2 获取train词语数量
# * 解包,把map中的每个列表作为一个独立的元素,传给chain
print(map(lambda x: jieba.lcut(x), train_data['sentence']))
print(type(map(lambda x: jieba.lcut(x), train_data['sentence'])))
train_vocab = set(chain(*map(lambda x: jieba.lcut(x), train_data['sentence'])))
print('训练集的token数量:', len(train_vocab))
# 2 获取dev
dev_vocab = set(chain(*map(lambda x: jieba.lcut(x), dev_data['sentence'])))
print('验证集的token数量:', len(dev_vocab))
# 7 获得train高频adj词云
# 7.1 获得每个句子的adj列表
def get_a_list(text):
r = []
for g in pseg.lcut(text): # g pair (词性,token)
# g.flag 词性;g.word 具体的token
if g.flag == 'a':
r.append(g.word)
return r
# 7.2 绘制词云
def get_word_cloud(keywords_list):
# 1 实例化词云对象
my_wordcloud = WordCloud(font_path='./cn_data/SimHei.ttf', max_words=100, background_color='white')
# 2 准备好数据
a_str = ' '.join(keywords_list)
# 3 产生词云
my_wordcloud.generate(a_str)
# 4 绘制图像
plt.figure()
plt.imshow(my_wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
# 7.3 生成词云
def dm_word_cloud():
# 1 拿到数据
train_data = pd.read_csv('./cn_data/train.tsv', sep='\t')
# 2 获取正样本数据
p_train_data = train_data[train_data['label'] == 1]['sentence']
# 3 获取全部数据的adj列表 生成词云
p_a_words = list(chain(*map(lambda x: get_a_list(x), p_train_data)))
get_word_cloud(p_a_words)
# 4 获取负样本数据
n_train_data = train_data[train_data['label'] == 0]['sentence']
# 5 获取每个句子的adj列表 绘制词云
n_a_words = list(chain(*map(lambda x: get_a_list(x), n_train_data)))
get_word_cloud(n_a_words)
if __name__ == '__main__':
# dm_label_sns_countplot()
# dm_len_sns_countplot_displot()
# dm_sns_stripplot()
# dm_words_count()
dm_word_cloud()