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

张开发
2026/4/14 16:44:27 15 分钟阅读

分享文章

教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)备注0unk未知词专用1pad填充专用2the全书出现次数最多3i4and……9527time9528machine小技巧我们可以设置一个门槛min_freq。如果一个词在全书中出现次数少于5次直接把它从密码本里删掉以后见到它统统视为unk。这样做可以大大减小密码本的厚度让模型更专注学习常用词。第四步发电报转换为数字序列万事俱备最后一步就是替换。拿着刚才编好的密码本我们把切好的词元一个个查表换成对应的数字ID。原始文本“the time machine”查表过程the- 查到 ID2time- 查到 ID9527machine- 查到 ID9528最终输出[2, 9527, 9528]看原本充满文学色彩的 sentence现在变成了一串纯粹的整数列表。这就是深度学习模型真正“吃”进去的食物。模型通过计算这些数字之间的概率关系比如看到2和9527后下一个数字是9528的概率有多大从而学会了预测下一个词甚至续写小说。 总结与思考整个文本预处理流程其实就是将非结构化的自然语言转化为结构化的数值序列的过程。读取加载文本去除噪音。词元化决定是按“词”切还是按“字”切。建词表统计频率分配ID处理生僻词unk。转换映射为数字序列。为什么要这么麻烦因为目前的AI本质上是数学引擎。它们擅长在多维空间里做向量运算却不擅长直接理解语义。通过这一步我们搭建了人类语言与机器数学之间的桥梁。留个思考题如果是中文我们该怎么“切蛋糕”英文有空格天然分隔但中文是“我爱人工智能”字与字之间紧挨着。是直接切成[我, 爱, 人, 工, 智, 能]字符级还是需要用专门的分词工具切成[我, 爱, 人工智能]词语级这又是另一个有趣的话题了。

更多文章