诸神缄默不语-个人CSDN博文目录

本文介绍在深度学习中如何应用预训练的词表征(word2vec等),应用到的框架包括numpy、PyTorch和TensorFlow

不同形式,见到了就补充总结一下。

最近更新时间:2023.2.14
最早更新时间:2022.12.15

文章目录

  • 1. 将预训练文件加载为`numpy.ndarray`/`torch.Tensor`格式的矩阵对象
  • 2. 建立模型中的表征层
    • 2.1 TensorFlow 1.14
    • 2.2 PyTorch
  • 3. 将文本转换为数字

1. 将预训练文件加载为numpy.ndarray/torch.Tensor格式的矩阵对象

这两类很容易互相转换,所以我就混着写了。

padding向量(PaddingBLANK)一般都是全0(这样叠mask方便)
UNK向量可以是其他向量的平均池化,也可以随便初始化一个向量

  1. word2id字典文件(用pickle保存)和预训练权重矩阵(用np.save保存)(范例:LADAN)

    1. 写法1(这是LADAN自己写的)
with open('w2id_thulac.pkl', 'rb') as f:word2id_dict = pk.load(f)f.close()emb_path='cail_thulac.npy'
word_embedding=np.cast[np.float32](np.load(emb_path))

   2. 写法2(这是我自己写的,我觉得能比较明显地看出,我在代码简练程度上的这个,匮乏……)

with open('w2id_thulac.pkl', 'rb') as f:word2id_dict = pickle.load(f)
embedding_file_path='cail_thulac.npy'
embedding_weight=np.load(embedding_file_path)
embedding_dim=embedding_weight.shape[1]  #词向量维度
embedding_weight[word2id_dict['BLANK']]=[0 for _ in range(embedding_dim)]
  1. word2vec.json文件和idx2word.json文件(word2id.json文件也行,反正就是直接翻过来)(范例:NeurJudge)
    需要注意的是,不能直接用np.ndarraytorch.FloatTensor来表征后不进行初始化,可以用zeros()zero_()等函数来初始为全0

    1. 写法1
word2vec = json.load(open('./word2vec.json', "r"))
word2vec['UNK'] = np.random.randn(200).tolist()
word2vec['Padding'] = [0. for i in range(200)]
embedding = torch.FloatTensor(339503, 200).zero_()
idx2word = json.load(open('./idx2word.json', "r"))
for i in tqdm(range(339503)):word = idx2word[str(i)]result = list(map(float, word2vec[word]))embedding[i] = torch.from_numpy(np.array(result))

   2. 写法2

word2id=json.load(open('word2vec/word2id.json'))
word2vec=json.load(open('word2vec/word2vec.json'))
word2vec['UNK'] = np.random.randn(200).tolist()
word2vec['Padding'] = [0. for i in range(200)]
embedding=np.zeros((339503,200))
for k in word2id:embedding[word2id[k],:]=[float(factor) for factor in word2vec[k]]
embedding=torch.from_numpy(embedding)

2. 建立模型中的表征层

2.1 TensorFlow 1.14

示例代码改自LADAN项目

description_layer=tf.nn.embedding_lookup(word_embedding,num_input)

word_embedding是np.ndarray格式的词向量矩阵,num_input是转换为数字格式并padding好的文本矩阵

2.2 PyTorch

示例代码改自NeurJudge项目
torch.nn.Module子类__init__()中:
(本代码是不在训练过程中更新embedding权重的意思)

self.embs = nn.Embedding(339503, 200)
self.embs.weight.data.copy_(embedding)
self.embs.weight.requires_grad = False

改自CECP项目

word_embedding = embedding_weight.astype(np.float32)

3. 将文本转换为数字

  1. 分词后使用word2id词典:改自LADAN
    遍历每个样本,在每个样本内:
for j in range(int(min(len(fact), max_length))):  #遍历最长句长内的每个词if fact[j] in word2id_dict:  #对于词表中存在的词id_list.append(int(word2id_dict[fact[j]]))else:id_list.append(int(word2id_dict['UNK']))
while len(id_list) < 512:  #paddingid_list.append(int(word2id_dict['BLANK']))
  1. NeurJudge版的实现,是将整个过程打包成了很多小环节
def transform(self, word):"""将词语转换为索引"""if not (word in self.word2id.keys()):return self.word2id["UNK"]else:return self.word2id[word]def seq2tensor(self, sents, max_len=350):"""将句子序列转换为词索引tensor,注意这里句子序列每个元素是一个已经分词好的list"""sent_len_max = max([len(s) for s in sents])sent_len_max = min(sent_len_max, max_len)sent_tensor = torch.LongTensor(len(sents), sent_len_max).zero_()sent_len = torch.LongTensor(len(sents)).zero_()for s_id, sent in enumerate(sents):sent_len[s_id] = len(sent)for w_id, word in enumerate(sent):if w_id >= sent_len_max: breaksent_tensor[s_id][w_id] = self.transform(word) return sent_tensor,sent_len

如何在深度学习过程中使用预训练的词表征(持续更新ing...)相关推荐

  1. 在 Keras 模型中使用预训练的词嵌入

    原文地址在这里. 什么是词嵌入? "词嵌入"是一系列旨在将语义映射到几何空间的自然语言处理技术.这是通过将数字向量与字典中的每个单词相关联来完成的,这样任何两个向量之间的距离(例如 ...

  2. java ing印版,Java中有趣的事【汇总】持续更新ing

    ×. 有一次,同时说看日志log的时候,发现一个方法前后两次打印同一个对象的时间log格式不一样. 当时也没在意,再一次debug查代码的时候,发现了这个问题的答案.一个时间是Timestamp(da ...

  3. 在Keras的Embedding层中使用预训练的word2vec词向量

    文章目录 1 准备工作 1.1 什么是词向量? 1.2 获取词向量 2 转化词向量为keras所需格式 2.1 获取所有词语word和词向量 2.2 构造"词语-词向量"字典 2. ...

  4. PyTorch在NLP任务中使用预训练词向量

    在使用pytorch或tensorflow等神经网络框架进行nlp任务的处理时,可以通过对应的Embedding层做词向量的处理,更多的时候,使用预训练好的词向量会带来更优的性能.下面分别介绍使用ge ...

  5. StructBERT:将语言结构纳入深度语言理解的预训练中——中文翻译

    STRUCTBERT:将语言结构纳入深度语言理解的预训练中 Wei Wang, Bin Bi, Ming Yan, Chen Wu, Zuyi Bao, Jiangnan Xia, Liwei Pen ...

  6. 深度学习之循环神经网络(12)预训练的词向量

    深度学习之循环神经网络(12)预训练的词向量  在情感分类任务时,Embedding层是从零开始训练的.实际上,对于文本处理任务来说,领域知识大部分是共享的,因此我们能够利用在其它任务上训练好的词向量 ...

  7. BERT论文翻译:用于语言理解的深度双向Transformer的预训练

    Jacob Devlin Ming-Wei Chang Kenton Lee kristina Toutanova Google AI Language {jacobdevlin, mingweich ...

  8. Keras深度学习使用VGG16预训练神经网络实现猫狗分类

    Keras深度学习使用VGG16预训练神经网络实现猫狗分类 最近刚刚接触深度学习不久,而Keras呢,是在众多的深度学习框架中,最适合上手的,而猫狗的图像分类呢,也算是计算机视觉中的一个经典案例,下面 ...

  9. 神经网络 Embedding层理解; Embedding层中使用预训练词向量

    1.Embedding层理解 高维稀疏特征向量到低维稠密特征向量的转换:嵌入层将正整数(下标)转换为具有固定大小的向量:把一个one hot向量变为一个稠密向量 参考:https://zhuanlan ...

最新文章

  1. unzip 压缩包含路径,解压缩覆盖路径下的同名文件
  2. python递归排序组合_如何用Python求list的排列组合:一种递归方式
  3. Swift之深入解析Key Paths的功能与应用
  4. 【翻译】Ext JS 4——Ajax和Rest代理处理服务器端一场和消息的方法
  5. 因改变,赢未来!三星Galaxy重磅新品年后首发!
  6. react 全选反选_js中怎么将createElement出来的复选框实现全选,全不选,反选效果?...
  7. 军事卫星行业调研报告 - 市场现状分析与发展前景预测
  8. vue的$message(提示框换行)
  9. 后渗透篇:清理windows入侵痕迹总结【详细】
  10. android信鸽推送demo_腾讯信鸽推送(java版)
  11. android 缓存用什么地方,哔哩哔哩缓存在哪里 哔哩哔哩缓存文件夹位置
  12. Footprint:一夜暴涨250%的Boba,能否成为下个Layer 2代表
  13. 天体观测位置的计算--方位角和俯仰角
  14. HIVE-启动服务-启动DG连接-迁移数据LINUX-HDFS-HIVE
  15. 协处理器CP15操作指令
  16. Nat. Commun. | 可多层次预测多肽-蛋白质相互作用的深度学习框架
  17. win7 台式机建热点
  18. 透明表——ABAP程序创建透明表
  19. ES学习笔记十-数据建模
  20. 超好用的Git工作流

热门文章

  1. 网络-IP地址,子网掩码,默认网关,DNS服务器详解
  2. 彻底弄懂Python标准库源码(一)—— os模块
  3. 黄淮学院CSDN高校俱乐部把梳子卖给和尚话剧表演活动
  4. 使用pypinyin将中文转换成不带声调的拼音
  5. vijos 1250 最勇敢的机器人
  6. colly爬虫库学习笔记
  7. 【小波分析】学习笔记(一):基础概念和小波理论综述
  8. 调整数组顺序使奇数位于偶数前面——《剑指offer》
  9. Altium Designer使用技巧之相同模块复用
  10. c++基础-继承与派生,定义基类person和公有派生类student