1. 语义表达的起源与挑战
1.1 计算机理解语言的基本困境
计算机本质上是个"数字白痴",它只能处理0和1组成的二进制数据。当我们把"苹果"这个词扔给计算机时,它看到的不是红彤彤的水果,而是一串毫无意义的字符编码。这个根本差异导致了NLP领域的核心挑战:如何把人类语言转化为计算机能够处理的数学表示。
早期工程师们想出的第一个解决方案是ASCII编码。比如字母"A"对应数字65,"B"对应66。但这种方法只能表示字符,无法表达词语的含义。于是出现了更高级的表示方法——独热编码(One-hot Encoding)。
1.2 独热编码的工作原理
假设我们有一个微型词表,只包含三个词:["苹果","香蕉","电脑"]。用独热编码表示就是:
- "苹果" = [1, 0, 0]
- "香蕉" = [0, 1, 0]
- "电脑" = [0, 0, 1]
这种表示方法看似简单直接,但存在几个致命缺陷:
-
维度灾难:实际词表可能有数万甚至数十万词,每个词都需要一个同样长度的向量,导致存储和计算成本极高。
-
语义缺失:所有向量都是互相正交的,无法表达"苹果"和"香蕉"都是水果这种语义关系。在向量空间中,"苹果"与"香蕉"的距离,和"苹果"与"电脑"的距离完全相同。
-
数据稀疏:绝大多数位置都是0,有效信息密度极低。
提示:在实际工程中,当词表达到10万量级时,独热编码矩阵的存储就需要GB级别的内存,这对大多数应用来说都是不可接受的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 分布式语义的革命
2.1 分布式语义假设的提出
1957年,语言学家John Rupert Firth提出了著名的分布式语义假设:"You shall know a word by the company it keeps."(观其伴而知其意)。这个看似简单的观点成为了后来所有词向量技术的理论基础。
具体来说,这个假设包含两个核心观点:
- 词语的含义可以通过其出现的上下文来推断
- 出现在相似上下文中的词语,其语义也相似
举个例子,"银行"这个词:
- 在"去__取钱"的上下文中,指的是金融机构
- 在"河__边散步"的上下文中,指的是河流的边缘
2.2 早期分布式表示方法
在word2vec出现之前,研究者们已经尝试过
