3 文本特征处理¶
学习目标¶
- 了解文本特征处理的作用
- 掌握实现常见的文本特征处理的具体方法
- 常见的文本特征处理方法
3.1 n-gram特征¶
-
概念
n-gram特征是自然语言处理中一种重要的特征表示方式。它通过将文本中的相邻n个词(或字符)组合起来,形成新的特征表示,可以用于很多任务,如文本分类、语言建模、机器翻译等。
常用的n-gram特征是bi-gram和tri-gram特征, 分别对应n为2和3。
例如:
Python假设给定分词列表: ["是谁", "敲动", "我心"] 对应的数值映射列表为: [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] -
作用
捕捉文本中词语之间的局部上下文信息,这些信息在许多NLP任务中非常重要。
-
优势
- 捕捉局部上下文信息:
- n-gram 不像 uni-gram 那样孤立地看待词语,而是将相邻的词语组合起来,从而捕捉到了词语之间的局部上下文信息。
- 例如,”not happy” 这个 bigram 与 uni-gram “happy” 表达的含义完全相反,使用 n-gram 可以更好地捕捉这种关系。
- 简单高效:
- n-gram 特征的生成和使用相对简单,计算效率高。
- 不需要复杂的语法分析和语义理解。
- 无需预训练:
- n-gram 特征不需要预先训练,可以直接在数据集中生成。
- 可用于各种 NLP 任务:
- n-gram 特征广泛应用于各种 NLP 任务,例如文本分类、情感分析、信息检索、语言模型等。
- 捕捉局部上下文信息:
-
代码实现
Python# 一般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, 3, 2, 1, 5, 3]) # {(3, 2), (1, 3), (2, 1), (1, 5), (5, 3)} return set(zip(*[input_list[i:] for i in range(ngram_range)])) if __name__ == '__main__': input_list = [1, 3, 2, 1, 5, 3] res = create_ngram_set(input_list) print(res)输出结果:
3.2 文本长度规范¶
-
概念
一般模型的输入需要等尺寸大小的矩阵, 因此在进入模型前需要对每条文本数值映射后的长度进行规范, 此时将根据句子长度分布分析出覆盖绝大多数文本的合理长度, 对超长文本进行截断, 对不足文本进行补齐(一般使用数字0), 这个过程就是文本长度规范。
-
作用
- 深度学习模型输入要求:
- 大多数深度学习模型,例如循环神经网络(RNN)、长短期记忆网络(LSTM)、Transformer 等,都要求输入固定长度的序列。
- 如果文本长度不一致,则需要进行填充或截断等处理,才能将文本数据输入到模型中。
- 计算效率:
- 如果文本长度差异过大,则会影响模型的计算效率,因为模型需要处理更长的序列。
- 通过统一文本长度,可以减少计算量,加快训练速度。
- 数据一致性:
- 统一文本长度可以使数据更加一致,从而方便进行后续的统计分析和可视化。
- 如果长度差异太大,则难以进行比较和分析。
- 防止过拟合:
- 过长的文本可能包含过多的噪声和冗余信息,导致模型过拟合。
- 截断过长的文本可以减少噪声,提高模型的泛化能力。
- 避免信息丢失:
- 过短的文本可能包含较少的信息,导致模型无法学习到足够的特征。
- 可以通过填充等方式,让短文本补充一定的信息,提高模型的准确性。
- 深度学习模型输入要求:
-
方法
- 截断 (Truncation):
- 方法:将文本截断到指定的最大长度,丢弃超过长度的部分。
- 适用场景:当文本长度过长,且我们只需要文本的前面部分时,可以使用截断。
- 优点:简单易行,计算效率高。
- 缺点:可能丢失文本尾部的信息。
- 策略:可以选择从文本开头截断(前截断)或从文本结尾截断(后截断)。
- 填充 (Padding):
- 方法:将文本填充到指定的最大长度,通常使用特殊字符(例如,
或 0)进行填充。 - 适用场景:当文本长度过短,需要补充信息时,可以使用填充。
- 优点:可以使短文本保持固定的长度。
- 缺点:会引入一些额外的数据,可能影响模型的训练。
- 策略:可以选择在文本开头填充(前填充)或在文本结尾填充(后填充)。
- 方法:将文本填充到指定的最大长度,通常使用特殊字符(例如,
- 截断 + 填充:
- 方法:结合截断和填充,将文本统一到一个指定的长度。 对于长度超过指定长度的文本进行截断,对于长度短于指定长度的文本进行填充。
- 适用场景:适用于大部分场景,可以处理长度过长或过短的文本。
- 截断 (Truncation):
-
代码实现
Pythonfrom tensorflow.keras.preprocessing import sequence # cutlen根据数据分析中句子长度分布,覆盖90%左右语料的最短长度. # 这里假定cutlen为8 cutlen = 8 def padding_truncating(x_train): # 使用sequence.pad_sequences即可完成 # truncating:pre->表示从前面截断 默认 post->表示从后面截断 # padding:pre->表示从前面补齐 默认 post->表示从后面补齐 return sequence.pad_sequences(sequences=x_train, maxlen=cutlen, truncating='pre', padding='pre') if __name__ == '__main__': x_train = [[1, 23, 5, 32, 55, 63, 2, 21, 78, 32, 23, 1], [2, 32, 1, 23, 1]] res = padding_truncating(x_train) print(res)输出结果:
3.3 小结¶
- 文本特征处理的作用:
- 文本特征处理包括为语料添加具有普适性的文本特征, 如:n-gram特征, 以及对加入特征之后的文本语料进行必要的处理, 如: 长度规范. 这些特征处理工作能够有效的将重要的文本特征加入模型训练中, 增强模型评估指标.
- 常见的文本特征处理方法:
- 添加n-gram特征
- 文本长度规范
- 什么是n-gram特征:
- 给定一段文本序列, 其中n个词或字的相邻共现特征即n-gram特征, 常用的n-gram特征是bi-gram和tri-gram特征, 分别对应n为2和3.
- 文本长度规范及其作用:
- 一般模型的输入需要等尺寸大小的矩阵, 因此在进入模型前需要对每条文本数值映射后的长度进行规范, 此时将根据句子长度分布分析出覆盖绝大多数文本的合理长度, 对超长文本进行截断, 对不足文本进行补齐(一般使用数字0), 这个过程就是文本长度规范.