加载glove或者word2vec训练好的词向量进行训练LSTM等模型的训练

Posted Icy Hunter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加载glove或者word2vec训练好的词向量进行训练LSTM等模型的训练相关的知识,希望对你有一定的参考价值。

学着学着就会发现数据预处理是一件很头疼的事情,不过对于自然语言处理这块,torchtext确实挺好用的。

可以使用torchtext来加载词向量然后直接初始化模型的embedding层就达到目的了。

加载glove词向量
这个比较方便
下面仅展示思路,代码不能跑

import torchtext
# 定义一个field,用于数据预处理(切词等)
TEXT = torchtext.data.Field(sequential=True, tokenize=tokenizer, lower=True, fix_length=self.config.max_length)  
# 对训练数据创建一个字典,出现最多的前10000个单词,词向量为100d的,如果没有会自己下载的
TEXT.build_vocab(train_data, max_size=10000, vectors='glove.6B.100d')  # max_size出现频率最高的 k 个单词,加载100d的词向量
# 把词向量保存,便于之后的初始化embedding层
self.pretrained_embedding = TEXT.vocab.vectors  # 保存词向量
#(这是在一个dataset类里摘出来的)

model = myLSTM(vocab_size, config)  # 训练模型时需要先实例化模型
model.embeddings.weight.data.copy_(dataset.pretrained_embedding)  # 使用训练好的词向量初始化embedding层( 语句:模型.模型里自己定义的embedding层.weight.data.copy_(训练好的词向量) )

这样就能加载词向量模型进行训练了,但是我相信一定还是云里雾里,这种东西还是完整的实例比较能理解。
基于pytorch构建双向LSTM(Bi-LSTM)文本情感分类实例(使用glove词向量)
这里面有完整实例,应该会比较好理解。

加载word2vec词向量

首先需要自己训练词向量或者用别人已经训练好的词向量,这里自己训练。

from gensim.models.word2vec import Word2Vec
# text即为待训练的词
model = Word2Vec(text, min_count=1)  # 训练词向量模型
model.wv.save_word2vec_format("vector.txt")  # 保存为.txt后缀的文件

这里比较抽象,可以看
使用jieba对新闻标题进行切词,然后使用word2vec训练词向量及相似词计算的一个小例子
应该就知道怎么训练了。

然后就可以使用torchtext加载了。

# 读取词向量name为词向量文件名,cathe为缓存路径名,这里为保存在当前目录下的datasets的文件下
vectors = torchtext.vocab.Vectors(name="vector.txt", cache="./datasets")
TEXT.build_vocab(train_data, max_size=25000)  # 构建词表,和glove那一样
TEXT.vocab.set_vectors(vectors.stoi, vectors.vectors, vectors.dim)  # 替换向量为word2vec
self.pretrained_embedding = torch.FloatTensor(TEXT.vocab.vectors) # 稍微变换了一下数据类型然后也是在类里保存下来,模型初始化的时候调用就可以了。

本文参考
PyTorch在NLP任务中使用预训练词向量
pytorch中加载预训练gensim之word2vec模型

其实这两篇文章已经讲的够清楚了,只是想加深一下自己的印象就自己捋一遍思路好了。

以上是关于加载glove或者word2vec训练好的词向量进行训练LSTM等模型的训练的主要内容,如果未能解决你的问题,请参考以下文章

词向量:GloVe

Glove词向量

GloVe损失函数的理解

动手学pytorch-词嵌入预训练模型Glove

文本情感分析:基于word2vec和glove词向量的文本表示

NLPELMO