NLP文本特征处理&文本数据增强

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NLP文本特征处理&文本数据增强相关的知识,希望对你有一定的参考价值。

1. 文本特征处理

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

文本特征处理的作用:

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

常见的文本特征处理方法:

  • 添加n-gram特征
  • 文本长度规范

1.1 什么是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 = 2

def 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)]))

调用:

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)}

1.2 文本长度规范及其作用

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

文本长度规范的实现:

from keras.preprocessing import sequence

# cutlen根据数据分析中句子长度分布,覆盖90%左右语料的最短长度.
# 这里假定cutlen为10
cutlen = 10

def padding(x_train):
    """
    description: 对输入文本张量进行长度规范
    :param x_train: 文本的张量表示, 形如: [[1, 32, 32, 61], [2, 54, 21, 7, 19]]
    :return: 进行截断补齐后的文本张量表示 
    """
    # 使用sequence.pad_sequences即可完成
    return sequence.pad_sequences(x_train, cutlen)

调用:

# 假定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]]

2. 文本数据增强

学习目标

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

2.1 什么是回译数据增强法

  • 回译数据增强目前是文本数据增强方面效果较好的增强方法, 一般基于google翻译接口, 将文本数据翻译成另外一种语言(一般选择小语种),之后再翻译回原语言, 即可认为得到与与原语料同标签的新语料, 新语料加入到原数据集中即可认为是对原数据集数据增强.
  • 回译数据增强优势:
    • 操作简便, 获得新语料质量高.
  • 回译数据增强存在的问题
    • 在短文本回译过程中, 新语料与原语料可能存在很高的重复率, 并不能有效增大样本的特征空间.
  • 高重复率解决办法:
    • 进行连续的多语言翻译, 如: 中文–>韩文–>日语–>英文–>中文, 根据经验, 最多只采用3次连续翻译, 更多的翻译次数将产生效率低下, 语义失真等问题.

2.2 回译数据增强实现

# 假设取两条已经存在的正样本和两条负样本
# 将基于这四条样本产生新的同标签的四条样本
p_sample1 = "酒店设施非常不错"
p_sample2 = "这家价格很便宜"
n_sample1 = "拖鞋都发霉了, 太差了"
n_sample2 = "电视不好用, 没有看到足球"

# 导入google翻译接口工具
from googletrans import Translator
# 实例化翻译对象
translator = Translator()
# 进行第一次批量翻译, 翻译目标是韩语
translations = translator.translate([p_sample1, p_sample2, n_sample1, n_sample2], dest='ko')
# 获得翻译后的结果
ko_res = list(map(lambda x: x.text, translations))
# 打印结果
print("中间翻译结果:")
print(ko_res)


# 最后在翻译回中文, 完成回译全部流程
translations = translator.translate(ko_res, dest='zh-cn')
cn_res = list(map(lambda x: x.text, translations))
print("回译得到的增强数据:")
print(cn_res)

输出效果:

中间翻译结果:
['호텔 시설은 아주 좋다', '이 가격은 매우 저렴합니다', '슬리퍼 곰팡이가 핀이다, 나쁜', 'TV가 잘 작동하지 않습니다, 나는 축구를 볼 수 없습니다']
回译得到的增强数据:
['酒店设施都非常好', '这个价格是非常实惠', '拖鞋都发霉了,坏', '电视不工作,我不能去看足球']

总结

  • 学习了文本特征处理的作用:
    文本特征处理包括为语料添加具有普适性的文本特征, 如: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

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

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

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

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


加油!

感谢!

努力!

以上是关于NLP文本特征处理&文本数据增强的主要内容,如果未能解决你的问题,请参考以下文章

NLP初识:文本预处理

NLP的文本分析与特征工程

自然语言处理NLP之BERTBERT是什么智能问答阅读理解分词词性标注数据增强文本分类BERT的知识表示本质

NLP:自然语言处理领域常见的文本特征表示/文本特征抽取(本质都是“数字化”)的简介四大类方法(基于规则/基于统计,离散式one-hotBOWTF-IDF/分布式)之详细攻略

做项目一定用得到的NLP资源分类版

做项目一定用得到的NLP资源分类版