当前位置: 首页 > news >正文

文本预处理(四)

1.5 文本特征处理


学习目标

  • 了解文本特征处理的作用.
  • 掌握实现常见的文本特征处理的具体方法.

  • 文本特征处理的作用:
    • 文本特征处理包括为语料添加具有普适性的文本特征, 如:n-gram特征, 以及对加入特征之后的文本语料进行必要的处理, 如: 长度规范. 这些特征处理工作能够有效的将重要的文本特征加入模型训练中, 增强模型评估指标.

  • 常见的文本特征处理方法:
    • 添加n-gram特征
    • 文本长度规范

什么是n-gram特征

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

  • 举个例子:
假设给定分词列表: ["是谁", "敲动", "我心"]对应的数值映射列表为: [1, 34, 21]我们可以认为数值映射列表中的每个数字是词汇特征.除此之外, 我们还可以把"是谁"和"敲动"两个词共同出现且相邻也作为一种特征加入到序列列表中,假设1000就代表"是谁"和"敲动"共同出现且相邻此时数值映射列表就变成了包含2-gram特征的特征列表: [1, 34, 21, 1000]这里的"是谁"和"敲动"共同出现且相邻就是bi-gram特征中的一个."敲动"和"我心"也是共现且相邻的两个词汇, 因此它们也是bi-gram特征.假设1001代表"敲动"和"我心"共同出现且相邻那么, 最后原始的数值映射列表 [1, 34, 21] 添加了bi-gram特征之后就变成了 [1, 34, 21, 1000, 1001]


  • 提取n-gram特征:
# 一般n-gram中的n取2或者3, 这里取2为例
ngram_range = 2def create_ngram_set(input_list):"""description: 从数值列表中提取所有的n-gram特征:param input_list: 输入的数值列表, 可以看作是词汇映射后的列表, 里面每个数字的取值范围为[1, 25000]:return: n-gram特征组成的集合eg:>>> create_ngram_set([1, 4, 9, 4, 1, 4]){(4, 9), (4, 1), (1, 4), (9, 4)}""" return set(zip(*[input_list[i:] for i in range(ngram_range)]))

代码解释
  1. input_list[i:]:
  • 这是列表切片操作,表示从input_list的第i个元素开始,一直到列表的末尾。
  • 例如,如果input_list = [1, 2, 3, 4],那么:
    • input_list[0:] → [1, 2, 3, 4]
    • input_list[1:] → [2, 3, 4]
    • input_list[2:] → [3, 4]
  1. [input_list[i:] for i in range(ngram_range)]:
  • 这是一个列表推导式,生成一个包含多个切片的列表。
  • range(ngram_range)表示从0到ngram_range - 1的整数序列。
  • 对于每个i,生成input_list[i:]。
  • 例如,如果input_list = [1, 2, 3, 4],ngram_range = 3,那么:
    • [input_list[i:] for i in range(ngram_range)] → [[1, 2, 3, 4], [2, 3, 4], [3, 4]]
  1. zip(*[...]):
  • zip函数用于将多个可迭代对象“打包”成一个元组的列表。
  • *操作符用于解包列表,将列表中的每个切片作为独立的参数传递给zip。
  • 例如,zip(*[[1, 2, 3, 4], [2, 3, 4], [3, 4]])会生成:
    • (1, 2, 3)(第1个元素组合)
    • (2, 3, 4)(第2个元素组合)
    • 注意:由于[3, 4]只有2个元素,所以不会生成包含4的组合。
  1. set(...):
  • set函数将结果转换为集合,用于去除重复项。
  • 例如,如果zip的结果是[(1, 2, 3), (2, 3, 4)],那么set(...)会返回{(1, 2, 3), (2, 3, 4)}。
注意事项
  1. 如果ngram_range大于len(input_list),zip会返回空结果。
  2. 如果input_list为空,结果也会是空集合。
  • 调用:
input_list = [1, 3, 2, 1, 5, 3] res = create_ngram_set(input_list) print(res)

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

文本长度规范及其作用

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

  • 文本长度规范的实现:
假设我们有一个文本数据集,每个文本已经被转换为单词索引的序列(通常在使用词嵌入之前会进行这一步)。我们需要将这些序列填充或截断到相同的长度,以便输入到神经网络中。
输入数据
假设我们有以下文本序列(单词索引列表):
sequences = [[1, 2, 3],  # 第一个文本[4, 5],     # 第二个文本[6, 7, 8, 9],  # 第三个文本[10]        # 第四个文本
]

目标我们将这些序列填充或截断到长度为
5。如果序列长度不足 5,我们会在后面填充 0;如果序列长度超过 5,我们从后面截断。

使用 sequence.pad_sequences

from keras.preprocessing import sequence# 输入的序列
sequences = [[1, 2, 3],  # 第一个文本[4, 5],     # 第二个文本[6, 7, 8, 9],  # 第三个文本[10]        # 第四个文本
]# 填充序列,使所有序列长度为 5
# padding='post' 表示在序列后面填充
# truncating='post' 表示从序列后面截断
padded_sequences = sequence.pad_sequences(sequences, maxlen=5, padding='post', truncating='post')print("原始序列:")
print(sequences)
print("填充后的序列:")
print(padded_sequences)
"""
输出结果
原始序列:
[[1, 2, 3], [4, 5], [6, 7, 8, 9], [10]]
填充后的序列:
[[ 1  2  3  0  0][ 4  5  0  0  0][ 6  7  8  9  0][10  0  0  0  0]]
"""

解释
  1. maxlen=5:
  • 指定所有序列的长度为 5。
  • 如果序列长度不足 5,则在后面填充 0。
  • 如果序列长度超过 5,则从后面截断。
  1. padding='post':
  • 在序列后面填充 0。
  1. truncating='post':
  • 从序列后面截断多余的元素。
其他参数
  • padding='pre':在序列前面填充 0。
  • truncating='pre':从序列前面截断多余的元素。
示例:在前面填充和截断如果我们将
padding 和 truncating 参数改为 'pre',代码如下:
padded_sequences = sequence.pad_sequences(sequences, maxlen=5, padding='pre', truncating='pre')
print("在前面填充和截断后的序列:")
print(padded_sequences)
"""
输出结果:
在前面填充和截断后的序列:
[[ 0  0  1  2  3][ 0  0  0  4  5][ 0  6  7  8  9][10  0  0  0  0]]
"""

调用:
# 假定x_train里面有两条文本, 一条长度大于10, 一天小于10
x_train = [[1, 23, 5, 32, 55, 63, 2, 21, 78, 32, 23, 1],[2, 32, 1, 23, 1]]res = padding(x_train)
print(res)


输出效果:
[[ 5 32 55 63  2 21 78 32 23  1][ 0  0  0  0  0  2 32  1 23  1]]


小节总结

  • 学习了文本特征处理的作用:
    • 文本特征处理包括为语料添加具有普适性的文本特征, 如:n-gram特征, 以及对加入特征之后的文本语料进行必要的处理, 如: 长度规范. 这些特征处理工作能够有效的将重要的文本特征加入模型训练中, 增强模型评估指标.

  • 学习了常见的文本特征处理方法:
    • 添加n-gram特征
    • 文本长度规范

  • 学习了什么是n-gram特征:
    • 给定一段文本序列, 其中n个词或字的相邻共现特征即n-gram特征, 常用的n-gram特征是bi-gram和tri-gram特征, 分别对应n为2和3.

  • 学习了提取n-gram特征的函数: create_ngram_set

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

  • 学习了文本长度规范的实现函数: padding

1.6 文本数据增强


学习目标

  • 了解文本数据增强的作用.
  • 掌握实现常见的文本数据增强的具体方法.

  • 常见的文本数据增强方法:
    • 回译数据增强法

什么是回译数据增强法

  • 回译数据增强目前是文本数据增强方面效果较好的增强方法, 一般基于google翻译接口, 将文本数据翻译成另外一种语言(一般选择小语种),之后再翻译回原语言, 即可认为得到与与原语料同标签的新语料, 新语料加入到原数据集中即可认为是对原数据集数据增强.

  • 回译数据增强优势:
    • 操作简便, 获得新语料质量高.

  • 回译数据增强存在的问题:
    • 在短文本回译过程中, 新语料与原语料可能存在很高的重复率, 并不能有效增大样本的特征空间.

  • 高重复率解决办法:
    • 进行连续的多语言翻译, 如: 中文-->韩文-->日语-->英文-->中文, 根据经验, 最多只采用3次连续翻译, 更多的翻译次数将产生效率低下, 语义失真等问题.

  • 回译数据增强实现:
# pip install google_trans_new安装一下  谷歌接口发生了变化
from google_trans_new import google_translator# 实例化翻译对象
translator = google_translator()
# 将中文文本翻译为韩语。lang_src 是源语言代码(中文为 "zh-cn"),lang_tgt 是目标语言代码(韩语为 "ko")。
text = ["这家价格很便宜", "这家价格很便宜"]
ko_res = translator.translate(text, lang_src="zh-cn", lang_tgt="ko")# 打印结果
print("中间翻译结果:")
print(ko_res)
#
# 最后在翻译回中文, 完成回译全部流程
cn_res = translator.translate(ko_res, lang_src='ko', lang_tgt='zh-cn')print("回译得到的增强数据:")
print(cn_res)


输出效果:
中间翻译结果:
["이 가격은 매우 싼 ", "이 가격은 매우 싼"] 
回译得到的增强数据:
["这个价格非常便宜","这个价格很便宜"]


  • 注意
    • 如果在运行过程中报:json.decoder.JSONDecodeError: Extra data: line 1 column 1962 (char 1961)错误
    • 修改地址参考:https://github.com/lushan88a/google_trans_new/issues/36
    • 温馨提示: 翻译接口在实时进行修改, 所以以后在使用第三方接口的时候要关注接口是否发生变化

小节总结

  • 学习了常见的文本数据增强方法:
    • 回译数据增强法

  • 学习了什么是回译数据增强法:
    • 回译数据增强目前是文本数据增强方面效果较好的增强方法, 一般基于google翻译接口, 将文本数据翻译成另外一种语言(一般选择小语种),之后再翻译回原语言, 即可认为得到与与原语料同标签的新语料, 新语料加入到原数据集中即可认为是对原数据集数据增强.

  • 学习了回译数据增强优势:
    • 操作简便, 获得新语料质量高.

  • 学习了回译数据增强存在的问题:
    • 在短文本回译过程中, 新语料与原语料可能存在很高的重复率, 并不能有效增大样本的特征空间.

  • 学习了高重复率解决办法:
    • 进行连续的多语言翻译, 如: 中文-->韩文-->日语-->英文-->中文, 根据经验, 最多只采用3次连续翻译, 更多的翻译次数将产生效率低下, 语义失真等问题.

  • 学习了回译数据增强实现.

附录

  • jieba词性对照表:
- a 形容词  - ad 副形词  - ag 形容词性语素  - an 名形词  
- b 区别词  
- c 连词  
- d 副词  - df   - dg 副语素  
- e 叹词  
- f 方位词  
- g 语素  
- h 前接成分  
- i 成语 
- j 简称略称  
- k 后接成分  
- l 习用语  
- m 数词  - mg - mq 数量词  
- n 名词  - ng 名词性语素  - nr 人名  - nrfg    - nrt  - ns 地名  - nt 机构团体名  - nz 其他专名  
- o 拟声词  
- p 介词  
- q 量词  
- r 代词  - rg 代词性语素  - rr 人称代词  - rz 指示代词  
- s 处所词  
- t 时间词  - tg 时语素  
- u 助词  - ud 结构助词 得- ug 时态助词- uj 结构助词 的- ul 时态助词 了- uv 结构助词 地- uz 时态助词 着
- v 动词  - vd 副动词- vg 动词性语素  - vi 不及物动词  - vn 名动词  - vq 
- x 非语素词  
- y 语气词  
- z 状态词  - zg 


  • hanlp词性对照表:
【Proper Noun——NR,专有名词】【Temporal Noun——NT,时间名词】【Localizer——LC,定位词】如“内”,“左右”【Pronoun——PN,代词】【Determiner——DT,限定词】如“这”,“全体”【Cardinal Number——CD,量词】【Ordinal Number——OD,次序词】如“第三十一”【Measure word——M,单位词】如“杯”【Verb:VA,VC,VE,VV,动词】【Adverb:AD,副词】如“近”,“极大”【Preposition:P,介词】如“随着”【Subordinating conjunctions:CS,从属连词】【Conjuctions:CC,连词】如“和”【Particle:DEC,DEG,DEV,DER,AS,SP,ETC,MSP,小品词】如“的话”【Interjections:IJ,感叹词】如“哈”【onomatopoeia:ON,拟声词】如“哗啦啦”【Other Noun-modifier:JJ】如“发稿/JJ 时间/NN”【Punctuation:PU,标点符号】【Foreign word:FW,外国词语】如“OK

http://www.dtcms.com/a/279186.html

相关文章:

  • 2025-7-14-C++ 学习 排序(2)
  • 【LeetCode 热题 100】94. 二叉树的中序遍历——DFS
  • 死锁!哲学家进餐问题(操作系统os)
  • 光电融合新范式:长春光机所孙晓娟/李大冰团队《Light》发表铁电量子阱相纯度调控策略
  • 系统分析师第五课:进程通信-死锁-存储管理-固定分页分段
  • SpringMVC注解:@RequestParam 与 @PathVariable
  • 详解同步、异步、阻塞、非阻塞
  • 关于机械臂控制中的 MoveL 和 MoveJ 操作
  • Spring Boot + Thymeleaf + RESTful API 前后端整合完整示例
  • FBRT-YOLO: Faster and Better for Real-Time Aerial Image Detection论文精读(逐段解析)
  • linux服务器换ip后客户端无法从服务器下载数据到本地问题处理
  • 学生管理系统(C++实现)
  • 13.梯度scharr与lapkacia算子
  • 成都,工业设备边缘计算如何落地?——“边缘智能”新解法!
  • Linux入门:从文件存储到常用命令详解
  • 从数据库到播放器:Java视频续播功能完整实现解析
  • simscape中坐标系和坐标变换Frames and Transforms
  • MySQL数据实时同步到Elasticsearch的高效解决方案
  • 小波变换 | 连续小波变换
  • Effective Modern C++ 条款10:优先考虑限域enum而非未限域enum
  • 安全架构中身份与访问管理体系设计
  • 基于Yolov8车辆检测及图像处理系统【有代码】
  • python多版本管理--pyenv
  • pyspark中map算子和flatmap算子
  • RAG优化
  • Mysql数据库学习--约束
  • 聚宽sql数据库传递
  • 非阻塞写入核心:asyncio.StreamWriter 的流量控制与数据推送之道
  • python+requests 接口自动化测试实战
  • 支付宝小程序代运营:专业助力提升运营效能