03_NLP常用的文本数据分析处理方法

打印 上一主题 下一主题

主题 937|帖子 937|积分 2811

文本数据分析

1.配景

文本数据分析,也称为文本发掘或文本分析,是指**从非结构化的文本数据中提取有价值的信息、模式和看法的过程。**随着互联网和社交媒体的快速发展,文本数据变得越来越丰富,掌握文本数据分析技术对于许多范畴都至关重要。

2.常用的文本数据分析方法



  • 数据标签分布
  • 句子长度分布
  • 词频统计
  • 关键词词云
语料数据介绍

  1. 数据来源:中文酒店评论语料
  2. 结构:sentence,label
  3.         - sentence:用户评论
  4.         - label:1对应积极情绪,0代表消极情绪
  5. =========================================================
  6. 目的:使用以上数据,介绍常用的几种文本数据分析方法
复制代码
部门数据展示

sentencelabel早餐不好,服务不到位,晚餐无西餐,早餐晚餐相同,房间条件不好,餐厅不分吸烟区.房间不分有无烟房.0去的时候 ,酒店大厅和餐厅在装修,感觉大厅有点挤.由于餐厅装修本来该享受的早饭,也没有享受(他们是8点开始每个房间送,但是我时间来不及了)不过前台服务员态度好!1有很长时间没有在西藏大厦住了,从前去北京在这里住的较多。这次住进来发现换了液晶电视,但网络不是很好,他们本身说是收费的原因造成的。别的还好。1……
1.数据标签分布

应用于分类问题,用来检察各种别对应的样本数量的分布,检察是否存在样本种别不平衡问题


  • 作用

    • 相识数据集中各种别的平衡性
    • 指导模子训练
    • 选择符合的评估指标
    • 指导数据加强或重采样

  • 用到的技术栈
    ​ 利用sns.countplot()统计label标签的0,1分布数量

    • sns.countplot()介绍
      seaborn.countplot() 是 seaborn 库中用于可视化种别型变量分布的常用函数,它可以快速绘制每个种别的观测数量
      焦点功能

      • 自动计数:自动统计每个种别的样本数量,无需手动盘算
      • 分类展示:直观展示离散型变量(如性别、国家、产品种别)的分布
      • 横向/纵向:支持水平 (orient=‘h’) 或垂直 (orient=‘v’) 表现
      • 多级分类:可通过 hue 参数添加次级分类维度
      参数列表
      1. sns.countplot(
      2.     x=None,          # 指定x轴变量(垂直条形图)
      3.     y=None,          # 指定y轴变量(水平条形图)
      4.     hue=None,        # 次级分类变量
      5.     data=None,       # 输入数据(DataFrame或数组)
      6.     order=None,      # 控制主分类顺序
      7.     hue_order=None,  # 控制次级分类顺序
      8.     palette=None,    # 颜色方案
      9.     ax=None,         # matplotlib轴对象
      10.     **kwargs         # 其他matplotlib参数
      11. )
      复制代码


  • 实今世码
  1. import seaborn as sns
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. # todo:1- 获取标签数量分布
  5. def dm_label_sns_count_plot():
  6.     # 1. 设置显示风格
  7.     plt.style.use('fivethirtyeight')
  8.     # 2. 读取训练集,验证集数据
  9.     train_data = pd.read_csv(filepath_or_buffer='./data/train.tsv', sep='\t')
  10.     dev_data = pd.read_csv(filepath_or_buffer='./data/dev.tsv', sep='\t')
  11.     # 3.统计label标签的0,1分组数量
  12.     sns.countplot(data=train_data, x='label')
  13.     plt.title('train_label')
  14.     plt.show()
  15.     # 4.统计验证集上标签数量分布
  16.     sns.countplot(data=dev_data, x='label')
  17.     plt.title('dev_label')
  18.     plt.show()
复制代码


  • 部门效果展示


2.句子长度分布

概念:指数据集中各个句子的长度(通常以词语数量来衡量)的分布环境,相识句子的是非特征


  • 作用

    • 相识文本数据的特征
    • 指导模子输入长度设置
    • 指导预处理
    • **发现非常值:**某些极短或极长的句子可能是非常值,需要进行处理。

  • 思路分析

    • 获取句子长度分布
           什么是句子长度分布? 求长度为50的有多少个 长度51的有多少个 长度为52的有多少个
          

    • 设置表现风格: plt.style.use('fivethirtyeight')
    • 读取数据集: pd.read_csv
    • 新增数据长度列: train_data['sentence_length']
    • 绘制数据长度分布柱状图 : sns.countplot

  1. def dm_len_sns_countplot_distplot():
  2.     # 1 设置显示风格plt.style.use('fivethirtyeight')
  3.     plt.style.use('fivethirtyeight')
  4.     # 2 pd.read_csv 读训练集 验证集数据
  5.     train_data = pd.read_csv(filepath_or_buffer='data/train.tsv', sep='\t')
  6.     dev_data = pd.read_csv(filepath_or_buffer='data/dev.tsv', sep='\t')
  7.     # 3 求数据长度列 然后求数据长度的分布
  8.     # map(func, *iterables): 对可迭代对象中的每个元素应用到指定的函数上, 返回一个迭代器对象
  9.     # list(map(lambda x: len(x), train_data['sentence'])): 获取每个句子的长度
  10.     # [len(value) for value in train_data['sentence'].values]: 也可以用此行代码实现获取每个句子的长度
  11.     train_data['sentence_length'] = list(map(lambda x: len(x), train_data['sentence']))
  12.     # 4 绘制数据长度分布图-柱状图
  13.     sns.countplot(x='sentence_length', data=train_data)
  14.     # sns.countplot(x=train_data['sentence_length'])
  15.     plt.xticks([]) # x轴上不要提示信息
  16.     # plt.title('sentence_length countplot')
  17.     plt.show()
  18.     # 5 绘制数据长度分布图-曲线图
  19.     sns.displot(x='sentence_length', data=train_data, kde=True)
  20.     # sns.displot(x=train_data['sentence_length'])
  21.     plt.yticks([]) # y轴上不要提示信息
  22.     plt.show()
  23.     # 验证集
  24.     # 3 求数据长度列 然后求数据长度的分布
  25.     dev_data['sentence_length'] = list(map(lambda x: len(x), dev_data['sentence']))
  26.     # 4 绘制数据长度分布图-柱状图
  27.     sns.countplot(x='sentence_length', data=dev_data)
  28.     # sns.countplot(x=dev_data['sentence_length'])
  29.     plt.xticks([])  # x轴上不要提示信息
  30.     # plt.title('sentence_length countplot')
  31.     plt.show()
  32.     # 5 绘制数据长度分布图-曲线图
  33.     sns.displot(x='sentence_length', data=dev_data, kde=True)
  34.     # sns.displot(x=dev_data['sentence_length'])
  35.     plt.yticks([])  # y轴上不要提示信息
  36.     plt.show()
复制代码


  • 效果展示


3.词频统计

指统计文本数据集中每个词语出现的频率。


  • 作用

    • 相识文本数据的关键词
    • 过滤停用词
    • 选择特征(词频可以作为一种特征,用于文本分类、信息检索等任务。)
    • 可视化关键词

  • 实今世码
  1. # 导入jieba用于分词
  2. # 导入chain方法用于扁平化列表
  3. import jieba
  4. from itertools import chain
  5. def dm_word_count():
  6.     #设置显示风格plt.style.use('fivethirtyeight')
  7.     plt.style.use('fivethirtyeight')
  8.     # 读训练集 验证集数据
  9.     train_data = pd.read_csv(filepath_or_buffer='data/train.tsv', sep='\t')
  10.     dev_data = pd.read_csv(filepath_or_buffer='data/dev.tsv', sep='\t')
  11.     # 进行训练集的句子进行分词, 并统计出不同词汇的总数
  12.     # chain(*iterables): 将多个可迭代对象合并为一个可迭代对象
  13.     # *:拆解嵌套的列表/元组等 *[[1,2],[3,4]]->[1,2],[3,4]
  14.     # *[jieba.lcut(value) for value in train_data["sentence"].values] -> 也可以用此代码替换
  15.     train_vocab = set(chain(*map(lambda x: jieba.lcut(x), train_data["sentence"])))
  16.     print("训练集共包含不同词汇总数为:", len(train_vocab))
  17.     # 进行验证集的句子进行分词, 并统计出不同词汇的总数
  18.     dev_vocab = set(chain(*map(lambda x: jieba.lcut(x), dev_data["sentence"])))
  19.     print("训练集共包含不同词汇总数为:", len(dev_vocab))
复制代码


  • 实现效果
  1. 训练集共包含不同词汇总数为: 12162
  2. 训练集共包含不同词汇总数为: 6857
复制代码
4.关键词词云

一种可视化技术,以图形化的方式展示文本中词语的频率,通常频率越高的词语表现得越大。


  • 作用

    • 直观展示关键词
    • 帮助理解文本主题
    • 信息传递

  • 获取训练集高频词词云

    • 思路分析

      • 获得训练集上正样本
      • 获取正样本的每个句子的形容词


  1. # 使用jieba中的词性标注功能
  2. import jieba.posseg as pseg
  3. from wordcloud import WordCloud
  4. # pip install wordcloud -i https://mirrors.aliyun.com/pypi/simple/
  5. # 每句话产生形容词列表
  6. def get_a_list(text):
  7.     r = []
  8.     # 使用jieba的词性标注方法切分文本 找到形容词存入到列表中返回
  9.     for g in pseg.lcut(text):
  10.         if g.flag == "a":
  11.             r.append(g.word)
  12.     return r
  13. # 根据词云列表产生词云
  14. def get_word_cloud(keywords_list):
  15.     # 实例化词云生成器对象
  16.     # font_path: 字体文件路径
  17.     # max_words: 词云图上最多显示的词数
  18.     # background_color: 词云图背景颜色, 默认black黑色
  19.     wordcloud = WordCloud(font_path="data/SimHei.ttf", max_words=100, background_color='white')
  20.     # 准备数据
  21.     keywords_string = " ".join (keywords_list)
  22.     # 产生词云
  23.     wordcloud.generate(keywords_string)
  24.     # 画图
  25.     plt.figure()
  26.     # 显示词云
  27.     # nterpolation="bilinear":指定图像的插值方式,使图像在显示时更加平滑。
  28.     plt.imshow(wordcloud, interpolation="bilinear")
  29.     plt.axis('off')
  30.     plt.show()
  31. def dm_train_word_cloud():
  32.     # 1 获得训练集上正样本p_train_data
  33.     #   eg: 先使用逻辑==操作检索符合正样本 train_data[train_data['label'] == 1]
  34.     train_data = pd.read_csv(filepath_or_buffer='data/train.tsv', sep='\t')
  35.     p_train_data = train_data[train_data['label'] == 1 ]['sentence']
  36.     # 2 获取正样本的每个句子的形容词 p_a_train_vocab = chain(*map(a,b))
  37.     p_a_train_vocab = chain(*map(lambda x: get_a_list(x) , p_train_data))
  38.     # print(p_a_train_vocab)
  39.     # print(list(p_a_train_vocab))
  40.     # 3 调用绘制词云函数
  41.     get_word_cloud(p_a_train_vocab)
  42.     print('*' * 60 )
  43.     # 训练集负样本词云
  44.     n_train_data = train_data[train_data['label'] == 0 ]['sentence']
  45.     # 2 获取正样本的每个句子的形容词 p_a_train_vocab = chain(*map(a,b))
  46.     n_a_train_vocab = chain(*map(lambda x: get_a_list(x) , n_train_data))
  47.     # print(n_a_dev_vocab)
  48.     # print(list(n_a_dev_vocab))
  49.     # 3 调用绘制词云函数
  50.     get_word_cloud(n_a_train_vocab)
复制代码


  • 效果展示
ain_data[train_data[‘label’] == 0 ][‘sentence’]
  1. # 2 获取正样本的每个句子的形容词 p_a_train_vocab = chain(*map(a,b))
  2. n_a_train_vocab = chain(*map(lambda x: get_a_list(x) , n_train_data))
  3. # print(n_a_dev_vocab)
  4. # print(list(n_a_dev_vocab))
  5. # 3 调用绘制词云函数
  6. get_word_cloud(n_a_train_vocab)
复制代码
  1. - 效果展示
  2. ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a4f5bc265c334246a8215f268338d7de.png#pic_center)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表