静态词向量表(Word2Vec/GloVe/FastText)

特点:一个词语永久对应唯一向量,不随上下文变化

一、静态词向量表组成内容

由两部分:词索引字典 + 嵌入权重矩阵

  1. vocab 字典:word → index 包含:PAD、UNK、常规词汇
  2. emb_matrix:shape=[词总数 V, 向量维度 d]`,每行是一个词向量

示例(d=3 维)

表格

index word vector
0 [PAD] [0.,0.,0.]
1 [UNK] [0.1,-0.2,0.3]
2 苹果 [0.52,0.13,-0.61]
3 香蕉 [0.48,0.15,-0.59]
4 汽车 [-0.72,0.33,0.11]

二、使用方法

1. 文本预处理步骤

1)分词 → 词语列表 

2)词语查表转 id:存在取 index,不存在→UNK(1)

3)短句补长→多余位置填PAD(0)

4)id 列表去词向量表索引对应向量,得到句子矩阵

示例:苹果 汽车

1. 分词:["苹果","汽车"]

2. 转 id:[2,4]

3. 固定长度 5 补 PAD:[2,4,0,0,0]

4. 查表取出对应 3 维向量

三、Python 简易代码示例

python

运行

import numpy as np

# 1.构造静态词向量表,字典:通过单词的名称找到其索引。
vocab = {
    "[PAD]":0,
    "[UNK]":1,
    "苹果":2,
    "香蕉":3,
    "汽车":4
}

# 词向量矩阵 V=5, dim=3,通过索引,找到其对应的N维向量。
emb_matrix = np.array([
    [0.0, 0.0, 0.0],          # PAD
    [0.1, -0.2, 0.3],         # UNK
    [0.52, 0.13, -0.61],      # 苹果
    [0.48, 0.15, -0.59],      # 香蕉
    [-0.72, 0.33, 0.11]       # 汽车
])


# 2.句子转id函数
def text2ids(word_list, max_len=5):
    ids = []
    for w in word_list:
        if w in vocab:
            ids.append(vocab[w])
        else:
            ids.append(vocab["[UNK]"])
    # 截断+补PAD
    if len(ids) > max_len:
        ids = ids[:max_len]
    else:
        ids += [vocab["[PAD]"]]*(max_len-len(ids))
    return np.array(ids)

# 3.根据id取词向量
def ids2emb(ids):
    return emb_matrix[ids]

# 测试
sent = ["苹果","汽车","飞机"]  #飞机不在词表→UNK
word_ids = text2ids(sent,max_len=5)
sent_emb = ids2emb(word_ids)

print("词语id:",word_ids)
print("句子向量:\n",sent_emb)

四、输出结果说明

plaintext

词语id: [2 4 1 0 0]
句子向量:
[[ 0.52  0.13 -0.61]
 [-0.72  0.33  0.11]
 [ 0.1  -0.2   0.3 ]
 [ 0.    0.    0.  ]
 [ 0.    0.    0.  ]]
  • 飞机:无词汇→UNK(1)向量
  • 后两位补PAD(0)全零向量

五、真实预训练词向量使用补充

  1. Word2vec/GloVe 文件加载:读取 txt 词向量文件,构建vocab字典+emb矩阵
  2. 两种使用模式
  • 冻结模式:训练模型时词向量表固定不变(经典静态用法)
  • 微调模式:下游任务反向更新词向量数值,不再是原始静态向量

词向量表数值含义(静态词向量)

词向量里每一个浮点数,代表词语在某一个隐语义维度上的权重 / 坐标,整体 d 个数字 = 词语在 d 维语义空间的坐标。

1. 一句话总结

plaintext

[0.52, 0.13, -0.61](苹果)
三个数 = 3维语义空间的(x,y,z)坐标
  • 正数:在该语义维度偏向正向特征
  • 负数:在该语义维度偏向反向特征
  • 绝对值大小:该词语在这个语义特征上强弱程度

2. 具象举例(3 个维度人为释义,方便理解)

假设(实际是神经网络模型推算出来的,并不是人为定义的)预先隐含 3 个语义维度:

维度 1:水果属性

维度 2:电子产品属性

维度 3:交通工具属性

表格

词语 向量 释义拆解
苹果 [0.52, 0.13, -0.61] 水果分高 (+0.52)、微弱电子 (+0.13)、非交通工具 (-0.61)
香蕉 [0.48, 0.15, -0.59] 水果分高,和苹果维度数值接近→空间距离近、语义相近
汽车 [-0.72, 0.33, 0.11] 水果极低 (-0.72)、偏交通工具 (+0.11)

模型不会人为定义维度含义

维度是模型自学习出来的隐含语义特征

人没法直接看懂单个维度代表什么。

3. 数值的来源

数值由无监督训练(Word2Vec/GloVe)通过词语上下文共现规律学习得到:

  • 经常出现在相同上下文的词,在词向量表中各维度数值整体接近,向量距离小;
  • 几乎不共现的词,各维度数值差异大,向量距离大。

4. 数值作用

  1. 算相似度:两个词向量做余弦距离,数值越贴近,词义越像;
  2. 送入神经网络:作为词语的数字化特征,供分类、分词、翻译等任务计算。

5. 特殊向量数值含义

  1. PAD=[0,0,0]:填充占位,无任何语义信息;
  2. UNK 随机小数:未知词的平均语义表征。

补充:单个数字没有独立语义

不能单独拿某一位数字解释词义,语义是整组向量共同组合表达

例:只看第一个数 0.52 不知道含义,结合全部 3 个数才能定位词语在空间位置。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐