Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

底层实现:文本处理

语言模型不会直接读取文字,它看到的是一串数字。在文字与数字之间,文本处理程序会作出许多决定:哪些字节属于同一个字符,哪些字符应当被归一化,文本从哪里切开,哪些片段进入词表,以及词表之外的内容如何回退。这些决定一旦在训练语料中固定下来,就会影响模型能够学习什么;训练与推理稍有不一致,同一句话甚至会变成两组不同的输入。

本书沿着这条转换路径逐层实现。Unicode 与 UTF-8 解决字符如何落到字节;正则表达式引擎负责识别和切分文本模式;Trie 为词典前缀查询提供紧凑的数据结构;中文分词把连续汉字段变成可处理的基本片段;SentencePiece 与 BytePiece 再从语料中学习子词,并完成 Token ID 的编码与解码。最后的 W2V 和 LDA 作为番外,展示切分后的词语如何进入经典的表示学习与主题模型。

中文分词不是 Tokenizer 的必要前置步骤,但它可以成为 PreTokenize 的一种实现。空格语言已经有天然的候选边界,中文等非空格语言则往往以整段文本进入子词学习。先在中文内部建立词边界,可以让两类语言通过同一个 PreTokenize 接口进入后续流程,也能缩短单次搜索的片段,减少跨词候选。是否启用这一步取决于任务;本书选择实现它,是为了把这种工程取舍讲清楚。

书中的算法都有对应的 C++ 项目。正文关注的是实现一项技术所需的核心结构、推导和约束,而不是某个库的接口手册。代码可以替换,训练数据也会变化,但字符边界、概率路径、词表覆盖和训练—推理一致性这些问题不会消失。