【NLP自然语言处理】文本特征处理与数据增强

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
简介: 【NLP自然语言处理】文本特征处理与数据增强

学习目标

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

🍀 掌握实现常见的文本数据增强的具体方法

🍀 掌握常见的文本数据增强方法: 回译数据增强法

🍔 什么是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特征:
1. # 一般n-gram中的n取2或者3, 这里取2为例
2. ngram_range = 2
3. 
4. def create_ngram_set(input_list):
5. """
6.     description: 从数值列表中提取所有的n-gram特征
7.     :param input_list: 输入的数值列表, 可以看作是词汇映射后的列表, 
8.                        里面每个数字的取值范围为[1, 25000]
9.     :return: n-gram特征组成的集合
10. 
11.     eg:
12.     >>> create_ngram_set([1, 4, 9, 4, 1, 4])
13.     {(4, 9), (4, 1), (1, 4), (9, 4)}
14.     """
15. return set(zip(*[input_list[i:] for i in range(ngram_range)]))
  • 调用:
1. input_list = [1, 3, 2, 1, 5, 3]
2. res = create_ngram_set(input_list)
3. print(res)
  • 输出效果:
1. # 该输入列表的所有bi-gram特征
2. {(3, 2), (1, 3), (2, 1), (1, 5), (5, 3)}

🍔 文本长度规范及其作用

  • 一般模型的输入需要等尺寸大小的矩阵, 因此在进入模型前需要对每条文本数值映射后的长度进行规范, 此时将根据句子长度分布分析出覆盖绝大多数文本的合理长度, 对超长文本进行截断, 对不足文本进行补齐(一般使用数字0), 这个过程就是文本长度规范.
  • 文本长度规范的实现:
1. from keras.preprocessing import sequence
2. 
3. # cutlen根据数据分析中句子长度分布,覆盖90%左右语料的最短长度.
4. # 这里假定cutlen为10
5. cutlen = 10
6. 
7. def padding(x_train):
8. """
9.     description: 对输入文本张量进行长度规范
10.     :param x_train: 文本的张量表示, 形如: [[1, 32, 32, 61], [2, 54, 21, 7, 19]]
11.     :return: 进行截断补齐后的文本张量表示 
12.     """
13. # 使用sequence.pad_sequences即可完成
14. return sequence.pad_sequences(x_train, cutlen)
  • 调用:
1. # 假定x_train里面有两条文本, 一条长度大于10, 一天小于10
2. x_train = [[1, 23, 5, 32, 55, 63, 2, 21, 78, 32, 23, 1],
3.            [2, 32, 1, 23, 1]]
4. 
5. res = padding(x_train)
6. print(res)
  • 输出效果:
1. [[ 5 32 55 63  2 21 78 32 23  1]
2.  [ 0  0  0  0  0  2 32  1 23  1]]

🍔 回译数据增强法

  • 回译数据增强目前是文本数据增强方面效果较好的增强方法, 一般基于google翻译接口, 将文本数据翻译成另外一种语言(一般选择小语种),之后再翻译回原语言, 即可认为得到与与原语料同标签的新语料, 新语料加入到原数据集中即可认为是对原数据集数据增强.
  • 回译数据增强优势:
  • 操作简便, 获得新语料质量高.
  • 回译数据增强存在的问题:
  • 在短文本回译过程中, 新语料与原语料可能存在很高的重复率, 并不能有效增大样本的特征空间.
  • 高重复率解决办法:
  • 进行连续的多语言翻译, 如: 中文→韩文→日语→英文→中文, 根据经验, 最多只采用3次连续翻译, 更多的翻译次数将产生效率低下, 语义失真等问题.
  • 回译数据增强实现:
1. # 导入对应的工具包
2. from google_trans_new import google_translator
3. 
4. # 实例化翻译对象
5. translator = google_translator()
6. # 进行第一次翻译, 目标语言是韩语
7. texts= ['这家价格很便宜', '这家价格很便宜']
8. tra_list= []
9. for text in texts:
10.     ko_res= translator.translate(text, lang_src='zh-cn', lang_tgt='ko')
11.     tra_list.append(ko_res)
12. # 打印中间结果
13. print('中间结果是:')
14. print(tra_list)
15. 
16. # 进行第二次翻译, 目标语言是汉语
17. cn_list = []
18. for text in tra_list:
19.     cn_res = translator.translate(text, lang_src='ko', lang_tgt='zh-cn')
20.     cn_list.append(cn_res)
21. # 打印最后的结果
22. print("最后的结果是:")
23. print(cn_list)

输出结果展示:

1. 中间翻译结果:
2. ["이 가격은 매우 싼 ", "이 가격은 매우 싼"] 
3. 回译得到的增强数据:
4. ["这个价格非常便宜","这个价格很便宜"]
  • 注意
  • 如果在运行过程中报:json.decoder.JSONDecodeError: Extra data: line 1 column 1962 (char 1961)错误
  • 修改地址参考:https://github.com/lushan88a/google_trans_new/issues/36
  • 温馨提示: 翻译接口在实时进行修改, 所以以后在使用第三方接口的时候要关注接口是否发生变化
  • 修改方案:
  • 使用find命令在服务器上找到对应的google_trans_new.py文件,即: find / -name 'google_trans_new.py'
  • 将google_trans_new.py文件中151行的**response = (decoded_line + ']')修改为**response = decoded_line, 然后保存退出即可.

🍔 小结

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


相关文章
|
15天前
|
机器学习/深度学习 存储 人工智能
大数据中自然语言处理 (NLP)
【10月更文挑战第19天】
109 60
|
8天前
|
机器学习/深度学习 自然语言处理 知识图谱
GraphRAG在自然语言处理中的应用:从问答系统到文本生成
【10月更文挑战第28天】作为一名自然语言处理(NLP)和图神经网络(GNN)的研究者,我一直在探索如何将GraphRAG(Graph Retrieval-Augmented Generation)模型应用于各种NLP任务。GraphRAG结合了图检索和序列生成技术,能够有效地处理复杂的语言理解和生成任务。本文将从个人角度出发,探讨GraphRAG在构建问答系统、文本摘要、情感分析和自动文本生成等任务中的具体方法和案例研究。
29 5
|
10天前
|
自然语言处理 Python
如何使用自然语言处理库`nltk`进行文本的基本处理
这段Python代码展示了如何使用`nltk`库进行文本的基本处理,包括分词和词频统计。首先需要安装`nltk`库,然后通过`word_tokenize`方法将文本拆分为单词,并使用`FreqDist`类统计每个单词的出现频率。运行代码后,会输出每个词的出现次数,帮助理解文本的结构和常用词。
|
13天前
|
人工智能 自然语言处理 语音技术
利用Python进行自然语言处理(NLP)
利用Python进行自然语言处理(NLP)
26 1
|
24天前
|
人工智能 自然语言处理 语音技术
利用Python进行自然语言处理(NLP)
利用Python进行自然语言处理(NLP)
26 3
|
25天前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
42 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术在自然语言处理中的应用与挑战
【10月更文挑战第3天】本文将探讨AI技术在自然语言处理(NLP)领域的应用及其面临的挑战。我们将分析NLP的基本原理,介绍AI技术如何推动NLP的发展,并讨论当前的挑战和未来的趋势。通过本文,读者将了解AI技术在NLP中的重要性,以及如何利用这些技术解决实际问题。
|
2月前
|
机器学习/深度学习 数据采集 自然语言处理
深度学习在自然语言处理中的应用与挑战
本文探讨了深度学习技术在自然语言处理(NLP)领域的应用,包括机器翻译、情感分析和文本生成等方面。同时,讨论了数据质量、模型复杂性和伦理问题等挑战,并提出了未来的研究方向和解决方案。通过综合分析,本文旨在为NLP领域的研究人员和从业者提供有价值的参考。
|
27天前
|
自然语言处理 算法 Python
自然语言处理(NLP)在文本分析中的应用:从「被动收集」到「主动分析」
【10月更文挑战第9天】自然语言处理(NLP)在文本分析中的应用:从「被动收集」到「主动分析」
43 4
|
29天前
|
机器学习/深度学习 人工智能 自然语言处理
探索AI在自然语言处理中的创新应用
【10月更文挑战第7天】本文将深入探讨人工智能在自然语言处理领域的最新进展,揭示AI技术如何改变我们与机器的互动方式,并展示通过实际代码示例实现的具体应用。
33 1

热门文章

最新文章

下一篇
无影云桌面