【NLP自然语言处理】4.基础-文本特征处理文本数据增强
一.文本特征处理
目标
- 了解文本特征处理的作用
掌握实现常见的文本特征处理的具体方法
文本特征处理的作用:
- 文本特征处理包括为语料添加具有普适性的文本特征,如:n-gram特征, 以及对加入特征之后的文本语料进行必要的处理, 如: 长度规范.这些特征处理工作能够有效的将重要的文本特征加入模型训练中,增强模型评估指标
常见的文本特征处理方法:
- 添加n-gram特征
- 文本长度规范
1.什么是n-gram特征
给定一段文本序列, 其中n个词或字的相邻共现特征即n-gram特征, 常用的n-gram特征是bi-gram和tri-gram特征, 分别对应n为2和3
n-gram分类:
- uni-gram(1-gram): 把每个 词/字 拆出来
- bi-gram(2-gram): 找连续2个词的组合
- tri-gram(3-gram): 找连续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-gram的作用, 以及怎么使用n-gram:如何计算两段文本的相似性?
2.提取n-gram特征
在提取n-gram特征前, 需要了解一下zip函数:
# 扩展4: zip()函数, 功能: 合并迭代对象 def method04(): # 1. 定义两个测试列表. list1 = [1, 2, 3, 4, 5, 6] list2 = [2, 3, 4] # 2. 使用zip()合并. result = zip(list1, list2) # print(f'result: {result}') # <zip object at 0x00000229422E2940> print(f'result: {list(result)}') # [(1,2), (2, 3), (3,4)] # 3. 演示zip()的 * 解包 list3 = [ [1, 2, 3], [2, 3, 4] ] # 如果不使用解包,zip会把 list3当做单个迭代对象处理 # print(list(zip(list3))) # [([1, 2, 3],), ([2, 3, 4],)] # *list3:解包list3,拆成多个参数,即:[1,2,3]和[2,3,4] print(list(zip(*list3))) # [(1, 2, 3), (2, 3, 4)]""" 案例: 演示n-gram特征 n-gram介绍: 概述: 就是连续的n个词/字, 把这些连续片段当做1种特征(小词组特征), 帮我们分析文本规律 分类: uni-gram(1-gram): 把每个 词/字 拆出来 bi-gram(2-gram): 找连续2个词的组合 tri-gram(3-gram): 找连续3个词的组合 目的: 让计算机更好的理解 文本规律 """ # 1. 定义变量, 记录: n-gram的 n值, 一般是2 或者 3 ngram_range = 2 # 表示n-gram的窗口大小, 此处是2-gram(bi-gram) # 2. 定义函数, 获取 n-gram特征 def create_ngram_set(input_list): # 1. 通过滑动窗口, 生成n-gram # i = 0的时候, 即: input_list[0:]: 获取的元素: [1, 3, 2, 1, 5, 3] # i = 1的时候, 即: input_list[1:]: 获取的元素: [3, 2, 1, 5, 3] slice_list = [ input_list[i:] for i in range(ngram_range)] # [[1, 3, 2, 1, 5, 3], [3, 2, 1, 5, 3]] """ [ [1, 3, 2, 1, 5, 3], [3, 2, 1, 5, 3] ] """ # print(slice_list) # 2. 使用zip()函数, 对切片列表数据进行组合 """ 通过zip对slice_list进行组合: [(1, 3), (3, 2), (2, 1), (1, 5), (5, 3)] """ ngram_tuples = zip(*slice_list) # 3. 转换为集合(自动去重), 返回结果 return set(ngram_tuples) # 4. 进阶版, 1行搞定 # return set(zip(*[input_list[i:] for i in range(ngram_range)])) # 测试代码 if __name__ == '__main__': # 1.定义变量,记录: 输入值列表 input_list = [1, 3, 2, 1, 5, 3] # 2.调用函数, 生成n-gram组合 res = create_ngram_set(input_list) # 3.输出结果 print(res) # {(2, 1), (1, 5), (5, 3), (3, 2), (1, 3)}3.文本长度规范及其作用
一般模型的输入需要等尺寸大小的矩阵, 因此在进入模型前需要对每条文本数值映射后的长度进行规范, 此时将根据句子长度分布分析出覆盖绝大多数文本的合理长度, 对超长文本进行截断, 对不足文本进行补齐(一般使用数字0), 这个过程就是文本长度规范
文本长度规范的实现:
""" 案例: 演示文本长度规范案例 文本长度规范解释: 概述: 一般模型的输入需要 等尺寸大小的矩阵, 所以需要对 超长文本做截断, 对不足文本进行补齐 -> 文本长度规范 实现方式: 思路1: 第三方包. tensorflow#sequence() 思路2: 纯Python基础代码实现 """ import os os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0' # 设置环境参数: 关闭onednn优化, 避免TensorFlow与onednn的版本不兼容 # 导包 from tensorflow.keras.preprocessing import sequence # 定义变量, 记录: 截断补齐长度参数 cutlen = 10 # 1.定义函数, 对输入的文本张量进行长度规范 -> 第三方包 def padding(x_train): # 使用keras的sequence模块中的pad_sequences方法处理 # 参1: 待处理的文本张量 # 参2: 最大长度.(max length) # 参3: truncating, 截断策略: pre(默认, 从序列前端截取), post(从序列后端截取) # 参4: padding, 补齐策略: pre(默认, 从序列前端补齐), post(从序列后端补齐) return tensorflow.pad_sequences(x_train, maxlen=cutlen, truncating="post", padding="post") # 2.定义函数, 对输入的文本张量进行长度规范 -> 纯Python基础代码实现 def padding_custom(data): # 1. 定义变量, 记录: 初始化列表 list = [] # 2. 遍历每条序列 for value in data: # 3. 处理超长文本, 截断维度, 保留前cutlen个元素(之类: 默认是10) if len(value) > cutlen: # 长度超长, 就截断 list.append(value[:cutlen]) # 4. 走这里, 处理短序列 else: # 计算需要补齐0的量 padding_len = cutlen - len(value) # 创建补齐列表 list.append(value + [0] * padding_len) # 6. 返回处理后的序列列表 return list # 3.测试 if __name__ == '__main__': # 假定x_train里面有两条文本, 一条长度大于10, 一天小于10 x_train = [[1, 23, 5, 32, 55, 63, 2, 21, 78, 32, 23, 1], [2, 32, 1, 23, 1]] # 思路1: 第三方包 # res = padding(x_train) # 思路2: 纯Python基础代码实现 res = padding_custom(x_train) print(res) import torch.nn as nn nn.RNN()[[1, 23, 5, 32, 55, 63, 2, 21, 78, 32], [2, 32, 1, 23, 1, 0, 0, 0, 0, 0]]小结
学习了文本特征处理的作用:
- 文本特征处理包括为语料添加具有普适性的文本特征, 如: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.回译数据增强法
回译数据增强目前是文本数据增强方面效果较好的增强方法, 一般基于google、有道等翻译接口, 将文本数据翻译成另外一种语言(一般选择小语种),之后再翻译回原语言, 即可认为得到与与原语料同标签的新语料,新语料加入到原数据集中即可认为是对原数据集数据增强
回译数据增强优势:
- 操作简便, 获得新语料质量高
回译数据增强存在的问题:
- 在短文本回译过程中, 新语料与原语料可能存在很高的重复率, 并不能有效增大样本的特征空间
高重复率解决办法:
- 进行连续的多语言翻译, 如: 中文→韩文→日语→英文→中文, 根据经验, 最多只采用3次连续翻译, 更多的翻译次数将产生效率低下, 语义失真等问题.
回译数据增强实现(基于有道翻译接口)代码如下:
# 导入必备的工具包 import requests # 思路分析 # 1 定义需要访问的有道翻译API接口--url # 2 定义需要翻译的文本:text # 3 定义data数据:from代表原始语言, to代表目标语言, i代表需要翻译的文本, doctype:文本的类型 # 4 requests.post(url=url, params=data)即代表访问api接口的方法 def dm_translate(): url = 'http://fanyi.youdao.com/translate' # 第一次翻译,目标语言英文 text1 = '这个价格非常便宜' data1 = {'from': 'zh-CHS', 'to': 'en', 'i': text1, 'doctype': 'json'} response1 = requests.post(url=url, params=data1) res1 = response1.json() # 打印第一次翻译结果 print(res1) # 第二次翻译, 目标语言中文 text2 = 'The price is very cheap' data2 = {'from': 'en', 'to': 'zh-CHS', 'i': text2, 'doctype': 'json'} response2 = requests.post(url=url, params=data2) res2 = response2.json() # 打印第二次翻译结果 print(res2)输出结果展示:
第一次翻译结果:{'type': 'ZH_CN2EN', 'errorCode': 0, 'elapsedTime': 1, 'translateResult': [[{'src': '这个价格非常便宜', 'tgt': 'The price is very cheap'}]]} 第二次翻译结果:{'type': 'EN2ZH_CN', 'errorCode': 0, 'elapsedTime': 1, 'translateResult': [[{'src': 'The price is very cheap', 'tgt': '价格非常便宜'}]]}语言及其对应编码:
'AUTO': '自动检测语言' 'zh-CHS': '中文', 'en': '英文' 'ja': '日语' 'ko': '韩语' 'fr': '法语' 'de': '德语'小结
学习了常见的文本数据增强方法:
- 回译数据增强法
学习了什么是回译数据增强法:
- 回译数据增强目前是文本数据增强方面效果较好的增强方法, 一般基于google、有道等翻译接口, 将文本数据翻译成另外一种语言(一般选择小语种),之后再翻译回原语言, 即可认为得到与与原语料同标签的新语料, 新语料加入到原数据集中即可认为是对原数据集数据增强.
学习了回译数据增强优势:
- 操作简便, 获得新语料质量高.
学习了回译数据增强存在的问题:
- 在短文本回译过程中, 新语料与原语料可能存在很高的重复率, 并不能有效增大样本的特征空间.
学习了高重复率解决办法:
- 进行连续的多语言翻译, 如: 中文→韩文→日语→英文→中文, 根据经验, 最多只采用3次连续翻译, 更多的翻译次数将产生效率低下, 语义失真等问题.
学习了回译数据增强实现
【上一篇】【NLP自然语言处理】3.基础-文本数据分析
【下一篇】【NLP自然语言处理】5.基础-RNN及其变体:传统RNN模型&LSTM模型&GRU模型
