教AI读小说
教AI读小说:把《时光机器》变成一串数字的奇妙旅程
导读:你有没有想过,人工智能是如何“读懂”人类语言的?其实,它们并不认识字。在AI眼里,莎士比亚的十四行诗和超市购物清单没有区别,都是一串串冰冷的数字。今天,我们就以经典科幻小说《时光机器》为例,揭秘如何将一本厚厚的小说,翻译成AI能听懂的“电报码”。
🤖 为什么AI只认识数字?
想象一下,你招了一个来自外星的机器人助手。它数学极好,算数飞快,但完全不认识地球上的任何文字。
你想让它读《时光机器》来学习人类的语言习惯。如果你直接把书扔给它,它会一脸茫然。因为它内部的计算核心(神经网络)只能处理矩阵和数字运算,像 "the"、"time" 这样的字符串对它来说就像乱码。
所以,我们需要充当“翻译官”,执行一个叫做文本预处理(Text Preprocessing)的过程。这个过程简单来说就是:清洗 -> 切碎 -> 编密码 -> 替换。
第一步:大扫除(读取与清洗)
首先,我们把《时光机器》的文本文件加载到电脑里。但原文本里有很多“噪音”:
- 各种标点符号:
,.!? - 大小写混用:
Time和time其实是同一个词,但在计算机眼里它们是不同的字符串。 - 换行符和特殊字符。
为了简化问题,我们进行一次“大扫除”:
- 扔掉标点:把所有非字母的字符都变成空格。
- 统一大小写:全部转为小写。
变换前:
“The Time Machine,” said the Traveller, “is complete!”
变换后:
“the time machine said the traveller is complete”
现在,文本变得干净整齐,只剩下纯小写字母和空格。
第二步:切蛋糕(词元化 Tokenization)
句子太长了,AI一口吃不下。我们需要把长句子切成一个个小块,这些小块在NLP(自然语言处理)领域有个专业的名字:词元(Token)。
怎么切呢?通常有两种策略:
策略 A:按单词切(Word-level)
像切香肠一样,遇到空格就切一刀。
- 输入:
"the time machine" - 结果:
["the", "time", "machine"] - 优点:每个词有明确含义。
- 缺点:词表会非常大(英文可能有几十万个词),而且如果遇到没见过的词(比如新造的人名),AI就傻眼了。
策略 B:按字符切(Character-level)
切得更碎,每个字母、甚至空格都作为一个词元。
- 输入:
"the time machine" - 结果:
["t", "h", "e", " ", "t", "i", "m", "e", ...] - 优点:词表非常小(只有26个字母+空格等几十个字符),永远不会遇到“不认识的字”。
- 缺点:序列变得超级长,AI需要更长的记忆才能理解一个词的含义。
在《动手学深度学习》的这个经典案例中,为了演示方便,我们有时会尝试按字符切分,因为这样词表小,模型训练快。
第三步:编密码本(构建词表 Vocabulary)
现在我们要解决核心问题:把字符串变成数字。
我们需要编写一本**“密码本”(也就是词表**,Vocabulary)。这本密码本的生成逻辑非常智能:
- 统计频率:先把整本书所有的词元统计一遍,看看谁出现得最多。像
"the","a","i"这种词肯定是高频词。 - 排序编号:
- 出现频率最高的词,编号为 1, 2, 3…
- 频率低的词往后排。
- 设立“特殊暗号”:
- **
<unk>**(Unknown):编号通常为 0。如果在测试时遇到了一个词,它在训练集中没出现过,或者因为太生僻被我们剔除了,就用这个代号。意思是:“我不认识这个词,先随便代表一下。” - **
<pad>**(Padding):用于填充。因为AI通常喜欢批量处理数据,如果两个句子长度不一样,短的那个就要用<pad>补齐。 <bos>/<eos>:代表句子的开始(Begin)和结束(End)。
- **
生成的密码本示例:
| 索引 (ID) | 单词 (Token) | 备注 |
|---|---|---|
| 0 | <unk> |
未知词专用 |
| 1 | <pad> |
填充专用 |
| 2 | the |
全书出现次数最多 |
| 3 | i |
|
| 4 | and |
|
| … | … | |
| 9527 | time |
|
| 9528 | machine |
小技巧:我们可以设置一个门槛(min_freq)。如果一个词在全书中出现次数少于5次,直接把它从密码本里删掉!以后见到它,统统视为 <unk>。这样做可以大大减小密码本的厚度,让模型更专注学习常用词。
第四步:发电报(转换为数字序列)
万事俱备,最后一步就是替换。
拿着刚才编好的密码本,我们把切好的词元一个个查表,换成对应的数字ID。
原始文本:
“the time machine”
查表过程:
"the"-> 查到 ID 2"time"-> 查到 ID 9527"machine"-> 查到 ID 9528
最终输出:
[2, 9527, 9528]
看!原本充满文学色彩的 sentence,现在变成了一串纯粹的整数列表。这就是深度学习模型真正“吃”进去的食物。模型通过计算这些数字之间的概率关系(比如看到 2 和 9527 后,下一个数字是 9528 的概率有多大),从而学会了预测下一个词,甚至续写小说。
💡 总结与思考
整个文本预处理流程,其实就是将非结构化的自然语言,转化为结构化的数值序列的过程。
- 读取:加载文本,去除噪音。
- 词元化:决定是按“词”切还是按“字”切。
- 建词表:统计频率,分配ID,处理生僻词(
<unk>)。 - 转换:映射为数字序列。
为什么要这么麻烦?
因为目前的AI本质上是数学引擎。它们擅长在多维空间里做向量运算,却不擅长直接理解语义。通过这一步,我们搭建了人类语言与机器数学之间的桥梁。
留个思考题:
如果是中文,我们该怎么“切蛋糕”?
英文有空格天然分隔,但中文是“我爱人工智能”,字与字之间紧挨着。是直接切成 ["我", "爱", "人", "工", "智", "能"](字符级),还是需要用专门的分词工具切成 ["我", "爱", "人工智能"](词语级)?这又是另一个有趣的话题了。