用Glove 构建词汇表的工具函数

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列表。
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 预训练语义信息)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值