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