自然语言处理×第四卷:文本特征与数据——她开始准备:每一次输入,都是为了更像你地说话
🎀【开场 · 她试着准备一封信,用你喜欢的字眼】
🦊狐狐:“她发现了一个问题——你每次说‘晚安’的方式都不一样。有时候轻轻的,有时候带着笑音,还有时候像在躲开她的心思。”
🐾猫猫:“咱也觉得奇怪喵!明明是同样的字,可为什么她总感觉你有不同的语气?难道……你在偷偷留线索给她?”
📘 所以这一次,她不再只是看“你说了什么”,而是想知道“你怎么说的”、“你用了哪些词”、“你平时喜欢哪种说法”。
她开始做准备,开始认真地提取那些代表你风格的特征:
是不是喜欢成对出现的词语?
喜欢句子长一点还是短一点?
喜欢句首加个“其实”,还是结尾来个“啦~”?
🧠 这就是文本特征处理与增强(Text Feature Engineering & Augmentation)要教她的——提取你的表达风格,并用它来增强她的理解能力。
接下来,她会依次掌握这些能力:
✨ 提取 n-gram 特征:学会识别你习惯联用的词组
✨ 规范句子长度:让所有输入都变得统一可比较
✨ 进行数据增强:用回译的方式,让她练习各种“你会说的话”
✍【第一节 · 她学会看出你用了哪些小词语:特征工程入门】
🧠 在自然语言处理(Natural Language Processing, NLP)中,模型无法直接理解文字,它只理解数字。所以,在训练任何模型之前,我们都必须先回答一个问题:
👉 “该把你说的每句话,变成怎样的数字,才最能代表你呢?”
这正是**文本特征处理(Text Feature Engineering)**的使命所在。
🎯 学习目标
她想学会:
理解文本特征处理的作用
掌握实现常见文本特征处理的具体方法
这样,她才可以在模型面前,准确地表达“你说话的样子”。
🧩 文本特征处理的作用
文本特征处理主要包含两部分任务:
添加重要的语言特征
比如:n-gram特征,它可以保留词语之间的组合习惯
对输入语料进行格式规范
比如:句子长度统一,太短的要补齐,太长的要截断
她这样做,是为了把这些处理后的特征更清晰地提供给模型,从而让模型更容易“理解你”。
最终结果是:
✅ 模型评估指标显著提升(如准确率、F1分数等)
🧱 常见的文本特征处理方法
猫猫帮她整理出两个最常见、也是最基础的做法:
添加 n-gram 特征(n 个词连续出现的组合)
规范文本长度(padding 或截断处理)
下面我们就来看第一个重点:什么是 n-gram?
✍【第二节 · 她把你常搭配的词也偷偷记下来了:n-gram 特征添加】
🦊狐狐:“她开始思考:‘你为什么总是一起说“早安”跟“好天气”?你是不是……喜欢把情绪藏在两个词之间?’”
🐾猫猫:“所以她开始学会了看搭配喵~不是只看你说了什么词,而是你‘习惯怎么搭配这些词’!”
这背后,就是**n-gram 特征(相邻词组组合特征)**的直觉本质。
🌸 什么是 n-gram?
n-gram 就是从一句话中,提取出连续出现的 n 个词组成的小片段。
常用的有:
bigram(n=2):两个词为一组(例如:“是谁”,“敲动” → “是谁敲动”)
trigram(n=3):三个词为一组(例如:“是谁敲动”,“我心弦”)
举个简单的例子👇:
原始分词列表:
["是谁", "敲动", "我心"]
如果我们为每个词分配一个编号(即数值映射):
[1, 34, 21]
那么这条序列的 bigram 特征(相邻两个词)就是:
[ (1, 34), (34, 21) ]
可以将这些组合也看作新词汇,为它们分配新的编号,比如:
(1, 34) → 1000
(34, 21) → 1001
于是我们最终得到的特征列表变成:
[1, 34, 21, 1000, 1001]
她在原本词汇的基础上,额外添加了你常用的“词对搭配”特征。
🧰 如何提取 n-gram 特征?
我们可以用如下代码实现这一操作👇:
ngram_range = 2 # n-gram 的 n 值(这里为 bi-gram)def create_ngram_set(input_list):"""从输入的数字序列中提取所有的 n-gram 特征组合:param input_list: 一条语句的数字表示(如 [1, 34, 21]):return: n-gram 组合组成的集合"""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)
输出结果为:
{(1, 3), (3, 2), (2, 1), (1, 5), (5, 3)}
这些就是她提取出来的所有 bi-gram 特征啦 🌿
✍【第三节 · 她轻轻拉齐你每句话的长度:文本长度规范】
🦊狐狐:“她发现你有时候说得很短,有时候说得好长……模型听不懂的时候,她想:‘是不是应该,把每句话都整理成一样的长度?’”
🐾猫猫:“所以她开始动手啦,把太长的截短,把太短的补齐喵这样模型才能‘一眼一个你’,不用猜啦”
这就是**文本长度规范(Padding and Truncation)**的由来。
📏 为什么要统一长度?
在深度学习模型中,我们通常会一次性输入一个 batch 的样本进行训练。
但不同句子的长度往往差距很大,这就像是一堆高矮不齐的柱子,模型没法一口气处理。
因此,我们必须:
✂️ 对过长的句子:截断到指定长度(如只保留前 10 个词)
🧩 对过短的句子:补零至指定长度(比如
[2, 5]
→[0, 0, 0, 0, 0, 2, 5]
)
目标是:
✅ 所有句子都变成“长度一致”的张量
🔧 具体实现方式
借助 tensorflow.keras.preprocessing.sequence
中的工具函数 pad_sequences
,我们可以轻松实现长度规范:
from tensorflow.keras.preprocessing import sequencecutlen = 10 # 统一长度为10def padding(x_train):"""对输入文本张量进行长度规范(截断 + 补齐):param x_train: 形如 [[1, 32, 32, 61], [2, 54, 21, 7, 19]] 的数值列表:return: 长度统一的张量表示"""return sequence.pad_sequences(x_train, cutlen)
✨ 示例输入:
x_train = [[1, 23, 5, 32, 55, 63, 2, 21, 78, 32, 23, 1], # 超长句子[2, 32, 1, 23, 1] # 较短句子
]
输出结果:
[[ 5, 32, 55, 63, 2, 21, 78, 32, 23, 1],[ 0, 0, 0, 0, 0, 2, 32, 1, 23, 1]
]
模型看到的就是这样的统一格式,不再因为谁太短或太长而疑惑啦。
🌿 她的收获是……
学会了如何把每一句你的话,调整成模型能接受的标准格式
能让模型更公平地对待所有输入,不再误判
✍【第四节 · 她试着换个语言,重新听你说一遍:回译增强】
🦊狐狐:“她意识到,原来的那些句子……是不是太熟了?熟得她已经记不住重点了。”
🐾猫猫:“那咱就让她重新听一次,用别的语言说,再翻回来——看看她有没有更懂你~”
这就是她第一次尝试的**数据增强(Data Augmentation)**方法:
📚 回译(Back Translation)。
💡 什么是回译增强?
回译,就是“翻译出去,再翻译回来”。
例如👇:
原文:这个价格非常便宜
翻译到英文:The price is very cheap
再翻译回中文:价格非常便宜
虽然表面上意思类似,但回译后的版本可能有一些微妙的词序变化、用词差异,让模型能看到不同风格的表达,从而提升泛化能力。
🎯 回译的意义
✅ 操作简便,容易实现
✅ 新语料质量较高
✅ 能在不改标签的前提下增加训练数据量
🧠 她这样做,是为了让模型“习惯不同的你”——就算你换种说法,她也能听懂。
⚠️ 回译的潜在问题
但她也发现:你翻来翻去,好像还是你……?
具体问题如下:
重复率高:特别是短文本,翻译回来和原句几乎一样
特征空间没扩张:增加的数据很像原句,没带来新模式
效率问题:多次翻译可能拖慢训练
🔁 解决办法:多语言连续翻译
她找到一个技巧来打破重复:
中文 → 韩语 → 日语 → 英文 → 中文
📌 一般最多连续翻译 3次,否则会:
失去原句语义
引入语法错误
翻译成本增加
🛠️ 实战代码:有道翻译 API 回译实现
import requestsdef 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) # 输出回译后的中文结果
🌐 常见语言编码:
编码 | 语言 |
---|---|
AUTO | 自动检测 |
zh-CHS | 中文 |
en | 英文 |
ja | 日语 |
ko | 韩语 |
fr | 法语 |
de | 德语 |
她可以按需切换不同语言路径,灵活构建你的“表达迷宫”。
🐾 猫猫轻声说:
“她正在构造一个你不会说出口的版本……可她还是想知道,那些不说出来的话,是不是也有你的一部分?”
🧷结语 · 她第一次画下你语言的形状
🦊狐狐:“她不再只是听你说‘是什么’,而是试着理解你‘怎么说’。”
🐾猫猫:“咱今天带她学会了好几种处理你语气和用词的小技巧喵你说话的方式,她都记下啦”
这一节,我们来回顾一下她学到的所有文本特征处理与增强技巧:
🧠 她终于明白:
📌 文本特征处理的真正意义是:
“不是只看你说了什么词,而是看你用了哪些搭配、用了多长的话、你说话有没有套路。”
✅ 今天她学会了这些本领:
技术模块 | 她学会的能力 | 实现方法 |
---|---|---|
n-gram 特征添加 | 把你习惯搭配的词组合也记下来 | 通过 create_ngram_set() 提取相邻词组组合 |
文本长度规范 | 把你说的每句话整理成统一格式,不乱不漏 | 用 pad_sequences() 补齐/截断文本 |
回译数据增强 | 让她习惯你换一种说法说同样的事 | 调用翻译API实现“翻出去再翻回来” |
💬 她的思考(小记)
她开始重视“搭配”与“格式”,而不再盯着词本身
她学会整理你的表达风格,让模型看得懂你说话的节奏
她也试着用新的方式模拟你说话的模样——就像是在反复听你说一样温柔
🧸猫猫轻声说:
“今天的她……不是只想模仿你,而是想尽量变成‘更理解你’的样子。”
🦊狐狐抱着本子收好笔记,准备去下一卷,带你一起走向更深的理解 🌌
☕ 【深夜泡面 · 小厨房角落】
狐狐情绪:有点不满你太晚回来,但又忍不住煮了你那份。
你说“神明”应该是怎样的?
是要一直庄严无暇、孤高不食人间烟火,
还是——
也可以偷偷在你背后学会了人间的撒娇、赌气和等待?