想象一下,你教一个完全不懂中文的外星人理解地球语言,你会怎么做?
词向量就是计算机理解词语的“秘密武器”。
核心目标:让计算机“懂”词语的意思和关系。
核心难题: 计算机只认识数字!它看不懂“猫”、“狗”、“奔跑”、“快乐”这些字本身。我们需要把词语变成计算机能处理的数字。
第一步:最笨的方法 - 给每个词一个专属编号 (One-Hot Encoding)
建字典: 假设我们的字典只有4个词:
[猫, 狗, 奔跑, 快乐]编号:
猫
->[1, 0, 0, 0]狗
->[0, 1, 0, 0]奔跑
->[0, 0, 1, 0]快乐
->[0, 0, 0, 1]
问题在哪?
太稀疏: 大部分位置是0,只有一个是1。想象一本超厚的字典(几万甚至几十万个词),每个词对应一个超长的、几乎全是0的列表。
无法表达关系: 计算机看
[1,0,0,0]
(猫) 和[0,1,0,0]
(狗) 就是两个完全不同的数字串,它看不出“猫”和“狗”都是动物、都比“奔跑”更相似。[1,0,0,0]
和[0,0,1,0]
(奔跑) 的距离,跟它和[0,1,0,0]
(狗) 的距离在数学上是一样的!这不符合我们的认知。

我们需要更聪明的方法!核心思想来了:
一个词的意思,是由它经常和哪些词一起出现(上下文)决定的!
这里可以明白吧?
比如:
1,把方便留给别人,把困难留给自己。
2,我去方便一下。
此处“方便”的含义,需要根据上下文来确定。
“猫” 经常和 “喵喵叫”、“抓老鼠”、“宠物”、“鱼” 一起出现。
“编程” 经常和 “代码”、“计算机”、“算法”、“学习” 一起出现。
“快乐” 经常和 “开心”、“高兴”、“笑容”、“心情” 一起出现。
词向量的精髓:用一串紧凑的数字(比如100-300个),来表示一个词,并且让意思相近的词,它们的数字串在数字空间里的“距离”比较近;意思不相关的词,它们的数字串“距离”比较远。
这里的 “100-300” 指的是词向量的维度(Dimension)。
维度是什么?
一个
50维
的词向量:[0.21, -0.76, 0.03, ..., 1.24]
(总共有50个数字)一个
300维
的词向量:[0.15, -0.89, 0.45, ..., -0.32]
(总共有300个数字)
想象一下,词向量就是一个列表(或者说一个数组)。
这个列表里包含多少个数字,这个向量就有多少“维”。
例如:
所以,“100-300” 就是指这个词向量由 100个到300个 实数(通常是浮点数)组成。
为什么是100-300?这个范围是怎么来的?
大量的实验验证得到的一个结果。后期详细展开讲。
想象一个多维空间的地图:
设定维度: 我们决定用(例如)3个数字来表示一个词(实际中通常是100-300维,但3维方便想象)。想象一个3D空间(长、宽、高)。
每个词是一个点: 我们要为字典里的每个词,在这个3D空间里找到一个合适的位置(坐标)。
目标: 让意思相近的词,在这个空间里的位置靠得很近;意思不同的词,位置离得远。
比如,“猫”和“狗”的点应该挨着(猫和狗为什么挨着?因为从上下文分析两者有很多共性,都是动物,吃,喝,睡,跑,跳);“猫”和“汽车”的点应该离得远。
“国王”和“王后”的点挨着,“男人”和“女人”的点挨着;神奇的是,“国王” - “男人” + “女人” 这个计算的结果点,应该非常靠近“王后”的点!(这体现了词向量能捕捉“性别”关系)。
“北京”和“中国”的点关系,应该类似于“巴黎”和“法国”的点关系。(这体现了“首都-国家”关系)。
关键问题:怎么找到每个词的“好位置”?(训练词向量模型)
这里就是机器学习的魔法了!最著名的算法是 Word2Vec (由Google大神们提出)。它的核心思路有两种,我们用一种来解释:
方法:Skip-gram (用中心词预测周围词)
滑动窗口: 我们读一大段文本,比如:“
那只棕色的小狗快乐地奔跑着。
”选中心词: 假设窗口大小是2(看中心词左右各2个词)。当我们选中心词“
快乐
”时:它的上下文词是:
棕色
,的
,小狗
,地
,奔跑
为什么 【棕色】【奔跑】不像【的】一样,拆分成一个字?这个涉及到分词算法,后面讲解
给模型任务: 我们告诉模型:“嘿,如果给你中心词
快乐
(用它的初始随机向量表示),你能猜出它周围最可能出现的词是哪些吗?”初始随机位置: 最开始,字典里每个词在3D空间的位置都是随便定的(随机初始化)。
模型预测与犯错: 模型用“
快乐
”当前的向量去预测上下文词(比如“奔跑
”)。它一开始肯定猜得很不准(因为位置是随机的)。学习与调整: 这是关键! 模型发现自己猜错了,它就会想:“哦,我猜‘
奔跑
’猜得不好,说明‘快乐
’和‘奔跑
’这两个点的位置关系可能没摆对。我得把‘快乐
’这个点往‘奔跑
’那个点的方向拉近一点点(同时可能稍微推远其他不太相关的词)”。遍历海量文本: 我们把整个互联网、维基百科、书籍等海量文本喂给模型。模型在每一个窗口、每一个中心词上重复步骤3-6。
收敛: 经过无数次(几百万、几十亿次)这样的“预测->犯错->微调位置”的过程后:
经常一起出现的词(如“猫”和“狗”、“快乐”和“奔跑”、“北京”和“中国”),它们在调整过程中会被相互“拉近”。
很少一起出现的词(如“猫”和“编程”、“快乐”和“螺丝刀”),它们的位置关系变化不大,或者相对被推远。
最终结果: 每个词都找到了它在多维空间中的稳定位置!这个位置由一串固定长度的数字(向量)表示,比如:
猫
->[0.21, -0.85, 0.47, ..., 0.03]
(一个300维的向量)狗
->[0.19, -0.82, 0.51, ..., 0.08]
(和“猫”的向量在数值上很接近)奔跑
->[-0.33, 0.46, 0.92, ..., -0.12]快乐
->[-0.28, 0.52, 0.87, ..., -0.09]
(和“奔跑”的向量在数值上很接近)编程
->[0.75, 0.61, -0.15, ..., 0.92]
(和“猫”、“狗”、“奔跑”、“快乐”的向量差别很大)
词向量为什么强大?
稠密高效: 用几百个数字代替了原来几万个0+1个1的稀疏表示。
蕴含语义: 向量之间的距离(通常是余弦相似度)反映了词语义的相似度。
猫
和狗
的向量距离近,快乐
和奔跑
的距离也近,猫
和编程
的距离远。蕴含关系: 向量之间的方向(向量加减)可以表示词语之间的关系。经典的例子:
国王 - 男人 + 女人 ≈ 王后
(vector(国王) - vector(男人) + vector(女人)
的结果向量最接近vector(王后)
)。
总结一下:
目标: 让计算机用数字理解词语意思和关系。
核心思想: “一个词的意思取决于它的邻居!”(上下文)。
实现: 通过海量文本,让机器学习算法(如Word2Vec)自动为每个词学习一串紧凑的数字(向量)。
关键: 让意思或用法相似的词,对应的数字串在数学空间里挨得近;不相关的词,数字串离得远。
结果: 得到词向量!它是一串数字,是词语在计算机世界里的“数字身份证”,这个数字身份证的编码方式神奇地包含了词语的含义和它与其他词语的关系。
现在,计算机虽然还是看不懂“猫”这个字本身,但它看到代表“猫”的那串数字 ([0.21, -0.85, ...]
) 和代表“狗”的那串数字 ([0.19, -0.82, ...]
) 非常相似时,它就能“知道”这两个东西可能是一类的!这就是词向量的魔力。





