在自然语言处理中,一个最基础的问题是:
机器如何理解文本?
计算机不能直接理解"我喜欢这部电影"这样的自然语言,它需要把文本转换成数字,才能进行计算、分类、检索、翻译或生成。
因此,文本表示方法就是 NLP 的基础。
从早期的词袋模型,到后来的词向量,再到如今的预训练语言模型,文本表示方法经历了一个从"统计"到"语义",再到"上下文理解"的发展过程。
可以简单概括为:
词袋模型:统计词是否出现
词向量:学习词的语义相似性
预训练语言模型:结合上下文理解文本
一、词袋模型:把文本看成词的集合
词袋模型,英文叫 Bag of Words,简称 BoW。
它的核心思想很简单:
一段文本中出现了哪些词,每个词出现了多少次。
它不关心词语之间的顺序,也不关心句子的语法结构,只把文本当成一个"装词的袋子"。
比如有两句话:
我 喜欢 看 电影
我 喜欢 听 音乐
假设词表是:
[我, 喜欢, 看, 电影, 听, 音乐]
那么这两句话可以表示成:
我 喜欢 看 电影 -> [1, 1, 1, 1, 0, 0]
我 喜欢 听 音乐 -> [1, 1, 0, 0, 1, 1]
如果某个词出现多次,也可以用词频表示:
我 我 喜欢 电影 -> [2, 1, 0, 1, 0, 0]
这种方法非常直观,每个维度都对应词表中的一个词,数值表示这个词在文本中出现的情况。
二、词袋模型的优点和局限
词袋模型最大的优点是简单、稳定、容易解释。
比如在文本分类任务中,如果一篇文章里频繁出现"股票""基金""投资",模型可能判断它更像财经类文章;如果频繁出现"比赛""球队""冠军",模型可能判断它更像体育类文章。
这种方法在早期 NLP 任务中非常常见,例如:
文本分类
垃圾邮件识别
关键词匹配
信息检索
情感分析
但是,词袋模型也有明显的问题。
第一,它不考虑词序。
比如:
我 喜欢 你
你 喜欢 我
这两句话的词基本一样,但表达的关系不同。词袋模型只统计词出现了什么,很难区分这种顺序差异。
第二,它不理解语义相似性。
比如:
电影
影片
电视剧
这些词在语义上有一定关联,但在词袋模型中,它们只是词表里的不同位置。模型不会天然知道"电影"和"影片"更接近,也不会知道"电影"和"香蕉"差得很远。
第三,它容易产生高维稀疏向量。
如果词表有十万个词,那么每篇文章都要表示成十万维向量。但一篇文章实际出现的词可能只有几百个,所以大部分位置都是 0。这会带来存储和计算上的浪费。
所以,词袋模型解决了"文本如何数字化"的问题,但它对语义和上下文的表达能力比较弱。
三、词向量:让词拥有语义坐标
为了解决词袋模型不能表达语义关系的问题,后来出现了词向量,也叫 Word Embedding。
词向量的核心思想是:
把每个词映射成一个低维、稠密、连续的向量。
例如:
电影 -> [0.21, -0.13, 0.88, ...]
音乐 -> [0.19, -0.08, 0.75, ...]
香蕉 -> [-0.42, 0.33, -0.16, ...]
这些数字本身不需要人为解释,但模型可以通过它们计算词和词之间的关系。
词向量背后的思想是:
一个词的含义,可以通过它经常出现的上下文来学习。
比如:
我喜欢看电影
我喜欢看电视剧
我喜欢看纪录片
"电影""电视剧""纪录片"经常出现在类似的上下文里,所以它们的向量可能会比较接近。
再比如:
苹果很好吃
香蕉很好吃
橘子很好吃
"苹果""香蕉""橘子"经常出现在类似语境中,所以模型可能会学到它们都和水果相关。
这种方法比词袋模型更进一步,因为它不只是统计词是否出现,而是把词放进一个语义空间中。
在这个空间里,语义相近的词距离更近,语义差异大的词距离更远。
典型的词向量方法包括:
Word2Vec
GloVe
FastText
四、词向量相比词袋模型的进步
词向量带来了几个重要变化。
首先,它从稀疏表示 变成了稠密表示。
词袋模型可能需要几万甚至几十万维,而词向量通常只需要几十维、几百维或者上千维。
其次,它可以表达一定的语义相似性。
在词袋模型中,"电影"和"影片"是两个完全独立的词。
但在词向量中,它们可能距离很近,因为它们经常出现在相似上下文中。
再次,词向量可以作为神经网络模型的输入。
后来的 RNN、CNN、LSTM、Transformer 等模型,都可以基于词向量继续建模文本序列。
不过,传统词向量也有一个很大的问题:
一个词通常只有一个固定向量。
比如"苹果"这个词:
我吃了一个苹果
我买了一台苹果手机
第一句话里的"苹果"是水果。
第二句话里的"苹果"是公司或手机品牌。
但是在传统词向量中,"苹果"通常对应同一个向量。
这就导致它无法根据上下文灵活区分词义。
这也是预训练语言模型要解决的重要问题。
五、预训练语言模型:结合上下文理解文本
预训练语言模型是当前 NLP 的主流方法。
常见的模型包括:
BERT
GPT
T5
RoBERTa
LLaMA
Qwen
它们和传统词向量最大的区别是:
预训练语言模型得到的是上下文相关的动态表示。
也就是说,同一个词在不同句子中,可以有不同的向量表示。
还是看"苹果"的例子:
我吃了一个苹果
我买了一台苹果手机
在预训练语言模型中,第一句话里的"苹果"会更多结合"吃了"这个上下文,被理解成水果;第二句话里的"苹果"会结合"手机"这个上下文,被理解成品牌。
这就比传统词向量更接近人类理解语言的方式。
预训练语言模型通常会先在大规模文本上进行训练。
在这个过程中,模型会学习大量语言规律,比如:
词语搭配
语法结构
句子关系
上下文依赖
常识知识
表达方式
完成预训练之后,再把模型迁移到具体任务中,比如:
文本分类
情感分析
机器翻译
阅读理解
文本摘要
对话生成
信息抽取
这种方式的好处是,模型不再从零开始学习语言,而是已经具备了一定的语言理解能力。
六、BERT、GPT、T5 的简单区别
虽然它们都属于预训练语言模型,但结构和任务形式有所不同。
BERT 更偏向理解任务。
它通过双向上下文理解句子,常用于文本分类、命名实体识别、相似度计算、阅读理解等任务。
比如输入一句话:
这部电影非常精彩
BERT 可以输出整句话的语义表示,用于判断情感是正向还是负向。
GPT 更偏向生成任务。
它根据前面的文本预测后面的内容。
比如输入:
今天天气很好,我想去
GPT 会继续生成:
公园散步。
它特别适合对话、写作、代码生成、内容创作等任务。
T5 把很多 NLP 任务统一成文本到文本的形式。
不管是翻译、摘要、分类还是问答,都可以看成:
输入一段文本,输出另一段文本
比如:
输入:translate English to Chinese: I love this movie.
输出:我喜欢这部电影。
这种统一形式让 T5 在很多任务上都比较灵活。
七、三类方法的对比
| 方法 | 表示方式 | 是否考虑词序 | 是否表达语义 | 是否结合上下文 |
|---|---|---|---|---|
| 词袋模型 | 高维稀疏向量 | 否 | 弱 | 否 |
| 词向量 | 低维稠密向量 | 间接考虑 | 中等 | 否 |
| 预训练语言模型 | 上下文动态表示 | 是 | 强 | 是 |
可以更直观地理解为:
词袋模型:知道一句话里有哪些词
词向量:知道词和词之间是否相似
预训练语言模型:知道词在当前上下文中是什么意思
八、总结
文本表示方法的发展,本质上是机器对语言理解能力不断增强的过程。
早期的词袋模型,主要依赖词频统计。它简单有效,但无法理解词序和语义。
后来的词向量,把词映射到连续向量空间中,使模型能够学习词与词之间的相似关系。
再到现在的预训练语言模型,模型可以结合上下文动态理解文本,不仅能够表示词和句子,还能完成生成、推理、问答、翻译等复杂任务。
整体来看,这条发展路线可以概括为:
从统计出现次数
到学习语义相似性
再到上下文理解与文本生成
这也是自然语言处理从传统机器学习走向深度学习,再走向大模型时代的一条重要主线。