# 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()