GLove
是什么?
是一种预训练词向量模型。
干什么??
用于将数据集中的文本数据转换为可供查询的词表,它通常有以下作用:将词汇映射为语义向量,捕捉词间关系、作为深度学习模型的嵌入层初始化、 降低模型训练成本。
怎么用???
在mindspore框架下用RNN进行对评价情感分类的实例中,利用GloVe创建嵌入层初始化代码如下
import zipfile #导入zipfile 用于文件解压
import numpy as np
def load_glove(glove_path):
#^定义load_glove方法 可接收GLove词向量的文件路径。
glove_200d_path = os.path.join(cache_dir, 'glove.6B.200d.txt')
#^构建200维Glove词向量文件路径。这里假设cache_dir是一个已经定义好的缓存目录
if not os.path.exists(glove_200d_path):
#^这里检查glove_200d_path 是否存在。如果没存在执行如下操作
glove_zip = zipfile.ZipFile(glove_path) #打开GloVe zip文件
glove_zip.extractall(cache_dir) #将zip文件解压到指定缓存目录
embeddings = []
tokens = [] #定义两个空列表 ,用于储存词向量和对应的单词
with open(glove_200d_path, encoding='utf-8') as gf: #打开200维 GloVe 词向量文本文件,并指定编码为UTF-8
for glove in gf: ##逐个遍历文件内容
word, embedding = glove.split(maxsplit=1) #将每行内容按空格分割,最多分割一次得到词向量
tokens.append(word) #将单词添加到token 列表中
embeddings.append(np.fromstring(embedding, dtype=np.float32, sep=' ')) #将词向量字符串转化为numpy格式,并添加到embedding列表中。
# 添加 <unk>, <pad> 两个特殊占位符对应的embedding
embeddings.append(np.random.rand(200)) #为未知单词 添加一个随机初始化的200维词向量
embeddings.append(np.zeros((200,), np.float32)) #为填充符 添加一个全零 200维词向量
vocab = ds.text.Vocab.from_list(tokens, special_tokens=["<unk>", "<pad>"], special_first=False) #使用 ds.text.Vocab.from_list 方法从 tokens 列表创建一个词汇表,并将 <unk> 和 <pad> 作为特殊标记添加到词汇表中,special_first=False 表示特殊标记不放在词汇表的开头。
embeddings = np.array(embeddings).astype(np.float32) 将 embeddings 列表转换为 numpy 数组,并将数据类型转换为 float32。
return vocab, embeddings
GloVe 创建词表流程
步骤 1:构建目标文件路径并解压(若需)
- 构建路径:通过
os.path.join(cache_dir, 'glove.6B.200d.txt')拼接 200 维 GloVe 词向量文本文件的完整路径(glove_200d_path),其中cache_dir是预设的缓存目录(用于存放词向量文件)。 - 检查并解压:若
glove_200d_path对应的文本文件不存在,则通过zipfile.ZipFile打开传入的 GloVe 压缩包(glove_path),并调用extractall(cache_dir)将压缩包内容解压到缓存目录,确保后续可直接读取词向量文本。import zipfile import numpy as np def load_glove(glove_path): glove_100d_path = os.path.join(cache_dir, 'glove.6B.100d.txt') if not os.path.exists(glove_100d_path): glove_zip = zipfile.ZipFile(glove_path) glove_zip.extractall(cache_dir)
步骤 2:读取 GloVe 词向量文本,提取词与向量
- 初始化两个空列表:
tokens(存储单词)和embeddings(存储对应词向量)。 - 打开
glove_200d_path文本文件(指定utf-8编码),逐行读取内容:- 每行格式为 “单词 向量值 1 向量值 2 ... 向量值 200”,通过
split(maxsplit=1)分割为 “单词(word)” 和 “向量字符串(embedding)”。 - 将
word添加到tokens列表,将向量字符串通过np.fromstring(..., sep=' ')转换为 200 维float32的 numpy 数组,添加到embeddings列表。
- 每行格式为 “单词 向量值 1 向量值 2 ... 向量值 200”,通过
embeddings = []
tokens = []
with open(glove_100d_path, encoding='utf-8') as gf:
for glove in gf:
word, embedding = glove.split(maxsplit=1)
tokens.append(word)
embeddings.append(np.fromstring(embedding, dtype=np.float32, sep=' '))
步骤 3:添加特殊符号的词向量
GloVe 预训练词向量中不包含 NLP 任务常用的特殊符号,需手动补充:
- 为
<unk>(未知词)添加随机初始化的 200 维向量(np.random.rand(200)),用于表示未在词汇表中出现的词。 - 为
<pad>(填充符)添加全零 200 维向量(np.zeros((200,), np.float32)),用于统一文本序列长度,且不携带额外语义。
embeddings.append(np.random.rand(100))
embeddings.append(np.zeros((100,), np.float32))
步骤 4:构建词汇表并整合词向量矩阵
- 构建词汇表:通过
ds.text.Vocab.from_list基于tokens列表创建词汇表,同时加入<unk>和<pad>作为特殊符号;special_first=False确保特殊符号的索引在普通词之后(与embeddings中 “普通词向量→特殊符号向量” 的顺序一致)。 - 整合向量矩阵:将
embeddings列表转换为float32的 numpy 数组(形状为(词汇量, 200)),作为最终的词向量矩阵。
vocab = ds.text.Vocab.from_list(tokens, special_tokens=["<unk>", "<pad>"], special_first=False)
embeddings = np.array(embeddings).astype(np.float32)
return vocab, embeddings
返回两个结果:
vocab:词汇表对象,用于将文本中的词转换为整数索引(映射到词向量矩阵的行)。embeddings:200 维词向量矩阵,可直接用于初始化模型的嵌入层(复用 GloVe 预训练语义信息)。
364

被折叠的 条评论
为什么被折叠?



