【NLP】文本特征处理:n-gram特征和文本长度规范

devtools/2024/9/22 17:55:13/

文章目录

  • 1、本章目标
  • 2、n-gram特征
    • 2.1、概念
    • 2.2、举个例子
    • 2.3、代码
  • 3、文本长度规范及其作用
  • 4、小结

🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎人工智能和前端开发。
🦅个人主页:@逐梦苍穹
📕所属专栏:人工智能
🌻gitee地址:xzl的人工智能代码仓库
✈ 您的一键三连,是我创作的最大动力🌹

1、本章目标

  1. 了解文本特征处理的作用.
  2. 掌握实现常见的文本特征处理的具体方法.
  3. 文本特征处理的作用:
    1. 文本特征处理包括为语料添加具有普适性的文本特征,如n-gram特征;
    2. 以及对加入特征之后的文本语料进行必要的处理,如长度规范;
    3. 这些特征处理工作能够有效的将重要的文本特征加入模型训练中,增强模型评估指标
  4. 常见的文本特征处理方法:
    1. 添加n-gram特征
    2. 文本长度规范

2、n-gram特征

2.1、概念

给定一段文本序列,其中n个词或字的相邻共现特征n-gram特征,常用的n-gram特征是bi-gram和tri-gram特征,分别对应n为2和3。
image.png

2.2、举个例子

这个示例讲解了如何从词汇列表生成数值特征并扩展到 N-gram 特征
首先,理解 N-gram 特征的一些基本概念:

  • 词汇列表:是一个包含文本中所有词的列表。例如,给定一个句子 “是谁 鼓动 我心”,其词汇列表为 ["是谁", "鼓动", "我心"]
  • 数值映射列表:通常用于将每个词映射到一个唯一的数字(索引)。例如,可以将 ["是谁", "鼓动", "我心"] 映射为 [1, 34, 21]

N-gram 特征的意思是将文本中的相邻词对作为特征。例如,Bigram(2-gram)就是由两个相邻的词组成的特征。
假设有一个词汇列表 ["是谁", "鼓动", "我心"],对应的数值映射列表为 [1, 34, 21]
这些数值可以被视为单个词汇的特征(Unigram),即每个词在序列中的独立存在。
现在,假设你要考虑 Bigram 特征(2-gram),即两个相邻词的组合。
步骤:

  1. 识别相邻的词对:在列表中,“是谁” 和 “鼓动” 是相邻的,“鼓动” 和 “我心” 也是相邻的。
  2. 为每个相邻词对生成新的特征值
    • 假设数字 1000 代表 “是谁” 和 “鼓动” 的相邻关系。
    • 假设数字 1001 代表 “鼓动” 和 “我心” 的相邻关系。

结果:

  • 原始的数值映射列表 [1, 34, 21] 现在扩展为包含 Bigram 特征的 [1, 34, 21, 1000, 1001]

在这个例子中,N-gram 特征的引入使得特征表示不仅仅是词汇本身,还包括词汇之间的相邻关系(如 “是谁” 和 “鼓动” 的相邻)。通过引入这些特征,模型可以更好地捕捉词汇之间的上下文关系。
具体来说:

  • 原来的 [1, 34, 21] 仅表示单个词汇。
  • 添加了 Bigram 特征后,特征列表变为 [1, 34, 21, 1000, 1001],表示不仅有单个词汇的信息,还有相邻词对的信息。

2.3、代码

提取n-gram特征:

# -*- coding: utf-8 -*-
# @Author: CSDN@逐梦苍穹
# @Time: 2024/8/12 21:51
# TODO 一般n-gram中的n取2或者3, 这里取2为例
def create_ngram_set(input_list):# 使用 zip 和列表推导式生成 n-gram 特征ngram_set = set(zip(*[input_list[i:] for i in range(ngram_range)]))return ngram_setif __name__ == '__main__':ngram_range = 2example_input = [1, 4, 9, 4, 1, 4]print(create_ngram_set(example_input))# Output: {(4, 9), (4, 1), (1, 4), (9, 4)}

输出效果:

# 该输入列表的所有bi-gram特征
{(3, 2), (1, 3), (2, 1), (1, 5), (5, 3)}

3、文本长度规范及其作用

一般模型的输入需要等尺寸大小的矩阵,因此在进入模型前需要对每条文本数值映射后的长度进行规范,
此时将根据句子长度分布分析出覆盖绝大多数文本的合理长度,
对超长文本进行截断,对不足文本进行补齐(一般使用数字0),这个过程就是文本长度规范
文本长度规范的实现:

# -*- coding: utf-8 -*-
# @Author: CSDN@逐梦苍穹
# @Time: 2024/8/12 22:39
# 从 Keras 的 preprocessing 模块中导入 sequence,用于序列处理
from keras.preprocessing import sequence
# 根据数据分析中句子长度的分布,确定覆盖 90% 左右语料的最短长度
# 这里假定 cutlen 为 10,意味着我们将所有的句子统一处理为长度为 10 的序列
cutlen = 10
def padding(x_train):"""description: 对输入文本张量进行长度规范,确保所有文本的长度一致:param x_train: 文本的张量表示, 形如: [[1, 32, 32, 61], [2, 54, 21, 7, 19]]这是一个二维列表,其中每个子列表表示一条文本的词汇索引序列:return: 进行截断补齐后的文本张量表示,输出的形状为 (len(x_train), cutlen)如果文本长度小于 cutlen,则补齐至 cutlen;如果文本长度大于 cutlen,则截断至 cutlen"""# 使用 sequence.pad_sequences 函数对序列进行补齐(或截断)# pad_sequences 会将每个序列截断或补齐到相同的长度 cutlen# 默认情况下,较短的序列会在前面补 0(默认补在序列的左侧),# 较长的序列会从前面截断(即保留序列的最后 cutlen 个元素)return sequence.pad_sequences(x_train, cutlen)if __name__ == '__main__':# 假定 x_train 里面有两条文本,一条长度大于 10,一条长度小于 10x_train = [[1, 23, 5, 32, 55, 63, 2, 21, 78, 32, 23, 1],  # 长度为 12,超过了 cutlen[2, 32, 1, 23, 1]  # 长度为 5,少于 cutlen]# 调用 padding 函数,对 x_train 中的序列进行补齐(或截断)res = padding(x_train)# 输出处理后的结果# 预期输出:# array([[ 5, 32, 55, 63,  2, 21, 78, 32, 23,  1],   # 第1条序列被截断至长度10#        [ 0,  0,  0,  0,  0,  2, 32,  1, 23,  1]])  # 第2条序列前面补5个0至长度10print(res)

输出:

E:\anaconda3\python.exe D:\Python\AI\自然语言处理\7-文本长度规范.py 
2024-08-12 22:44:53.195415: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.
2024-08-12 22:44:54.269741: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.
[[ 5 32 55 63  2 21 78 32 23  1][ 0  0  0  0  0  2 32  1 23  1]]Process finished with exit code 0

4、小结

  1. 学习了文本特征处理的作用:
    1. 文本特征处理包括为语料添加具有普适性的文本特征,如:n-gram特征,以及对加入特征之后的文本语料进行必要的处理,如:长度规范. 这些特征处理工作能够有效的将重要的文本特征加入模型训练中,增强模型评估指标
  2. 学习了常见的文本特征处理方法:
    1. 添加n-gram特征
    2. 文本长度规范
  3. 学习了什么是n-gram特征:
    1. 给定一段文本序列,其中n个词或字的相邻共现特征即n-gram特征,常用的n-gram特征是bi-gram和tri-gram特征,分别对应n为2和3
  4. 学习了提取n-gram特征的函数:create_ngram_set
  5. 学习了文本长度规范及其作用:
    1. 一般模型的输入需要等尺寸大小的矩阵,因此在进入模型前需要对每条文本数值映射后的长度进行规范,此时将根据句子长度分布分析出覆盖绝大多数文本的合理长度,对超长文本进行截断,对不足文本进行补齐(一般使用数字0),这个过程就是文本长度规范.
  6. 学习了文本长度规范的实现函数:padding

http://www.ppmy.cn/devtools/95306.html

相关文章

已解决org.xml.sax.SAXNotRecognizedException异常的正确解决方法,亲测有效!!!

已解决org.xml.sax.SAXNotRecognizedException异常的正确解决方法,亲测有效!!! 目录 问题分析 出现问题的场景 典型案例 报错原因 解决思路 解决方法 步骤1:验证特性URI 步骤2:检查拼写错误 步骤3…

【Qt】QWidget的font属性

QWidget的font属性 API说明 font() 获取当前 widget 的字体信息. 返回 QFont 对象. setFont(const QFont& font) 设置当前 widget 的字体信息. 关于Qfont 属性说明 family 字体家族. ⽐如 "楷体", "宋体", "微软雅⿊" 等. pointSiz…

智匠MindCraft AI 1.2.6版本更新啦!!

智匠MindCraft AI​​​​​​​迎来1.2.6版本更新,本次更新四大内容: 1、网页代码及python代码渲染优化。更稳定的代码渲染功能,您可以在智匠AI中,实现炫酷的网页效果,或者用python制作图表和游戏。 2、语音实验室增…

windows安装conda标注软件

1、安装 conda conda 分为 anaconda 和 miniconda,anaconda 是一个包含了许多常用库的集合版本,miniconda 是精简版本(只包含conda、pip、zlib、python 以及它们所需的包),剩余的通过 conda install command 命令自行安…

游戏测试中需求分析的本质

游戏测试大不同 1.游戏功能模块介绍1.1. 登录模块1.2. 注册模块1.3. 故事情节模块1.4. 动画模块1.5. 音频模块1.6. 结束界面模块1.7. 网络模块1.8. 数据库模块 2.需求文档编写2.1需求的定义2.2需求分类2.3需求分析目标 3.测试用例编写3.1测试用例的定义3.2测试用例拆解包含测试…

技术爱好者完全用台式机部件定制游戏笔记本电脑

高端笔记本电脑的功能强大到令人难以置信的地步,但大多数笔记本电脑在至少几个关键性能方面仍然落后于台式机。一位 YouTuber 对这种情况感到厌倦,为了抹除这种差距,他开始了为期 14 个月的旅程,使用真正的台式机硬件打造自己的笔…

PMP到底有什么用?

PMP 就是项目管理证书,全称是项目管理专业人士资格认证,对于一个在项目管理岗位混迹五年的老油条来说,PMP 证书是敲开项目管理岗位的第一块砖,每年考 PMP 的人都很多,要是 PMP 证书没有价值,还会有那么多人…

机器学习/深度学习——关于分类任务的机器学习、深度学习模型的评估指标详解

机器学习/深度学习——模型的评估详解 搭配以下文章进行学习: 卷积神经网络: 深度学习——卷积神经网络(convolutional neural network)CNN详解(一)——概述. 步骤清晰0基础可看 深度学习——卷积神经网…