教AI读小说:把《时光机器》变成一串数字的奇妙旅程

导读:你有没有想过,人工智能是如何“读懂”人类语言的?其实,它们并不认识字。在AI眼里,莎士比亚的十四行诗和超市购物清单没有区别,都是一串串冰冷的数字。今天,我们就以经典科幻小说《时光机器》为例,揭秘如何将一本厚厚的小说,翻译成AI能听懂的“电报码”。


🤖 为什么AI只认识数字?

想象一下,你招了一个来自外星的机器人助手。它数学极好,算数飞快,但完全不认识地球上的任何文字

你想让它读《时光机器》来学习人类的语言习惯。如果你直接把书扔给它,它会一脸茫然。因为它内部的计算核心(神经网络)只能处理矩阵和数字运算,像 "the""time" 这样的字符串对它来说就像乱码。

所以,我们需要充当“翻译官”,执行一个叫做文本预处理(Text Preprocessing)的过程。这个过程简单来说就是:清洗 -> 切碎 -> 编密码 -> 替换


第一步:大扫除(读取与清洗)

首先,我们把《时光机器》的文本文件加载到电脑里。但原文本里有很多“噪音”:

  • 各种标点符号:, . ! ?
  • 大小写混用:Timetime 其实是同一个词,但在计算机眼里它们是不同的字符串。
  • 换行符和特殊字符。

为了简化问题,我们进行一次“大扫除”:

  1. 扔掉标点:把所有非字母的字符都变成空格。
  2. 统一大小写:全部转为小写。

变换前

“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)。这本密码本的生成逻辑非常智能:

  1. 统计频率:先把整本书所有的词元统计一遍,看看谁出现得最多。像 "the", "a", "i" 这种词肯定是高频词。
  2. 排序编号
    • 出现频率最高的词,编号为 1, 2, 3…
    • 频率低的词往后排。
  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,现在变成了一串纯粹的整数列表。这就是深度学习模型真正“吃”进去的食物。模型通过计算这些数字之间的概率关系(比如看到 29527 后,下一个数字是 9528 的概率有多大),从而学会了预测下一个词,甚至续写小说。


💡 总结与思考

整个文本预处理流程,其实就是将非结构化的自然语言,转化为结构化的数值序列的过程。

  1. 读取:加载文本,去除噪音。
  2. 词元化:决定是按“词”切还是按“字”切。
  3. 建词表:统计频率,分配ID,处理生僻词(<unk>)。
  4. 转换:映射为数字序列。

为什么要这么麻烦
因为目前的AI本质上是数学引擎。它们擅长在多维空间里做向量运算,却不擅长直接理解语义。通过这一步,我们搭建了人类语言与机器数学之间的桥梁。

留个思考题
如果是中文,我们该怎么“切蛋糕”?
英文有空格天然分隔,但中文是“我爱人工智能”,字与字之间紧挨着。是直接切成 ["我", "爱", "人", "工", "智", "能"](字符级),还是需要用专门的分词工具切成 ["我", "爱", "人工智能"](词语级)?这又是另一个有趣的话题了。