文本数据分析(nlp)

复制代码
# 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()
相关推荐
小虎牙^O^3 分钟前
2024春秋杯密码题第一、二天WP
python·密码学
梦魇梦狸º38 分钟前
mac 配置 python 环境变量
chrome·python·macos
查理零世1 小时前
算法竞赛之差分进阶——等差数列差分 python
python·算法·差分
ByteBlossom6663 小时前
MDX语言的语法糖
开发语言·后端·golang
查士丁尼·绵3 小时前
面试-字符串1
python
盼小辉丶3 小时前
TensorFlow深度学习实战——情感分析模型
深度学习·神经网络·tensorflow
好评笔记3 小时前
AIGC视频生成模型:Stability AI的SVD(Stable Video Diffusion)模型
论文阅读·人工智能·深度学习·机器学习·计算机视觉·面试·aigc
肖田变强不变秃4 小时前
C++实现矩阵Matrix类 实现基本运算
开发语言·c++·matlab·矩阵·有限元·ansys
沈霁晨4 小时前
Ruby语言的Web开发
开发语言·后端·golang
小兜全糖(xdqt)4 小时前
python中单例模式
开发语言·python·单例模式