一、gensim-word2vec/GLoVe
方法一:切词之后直接将二维句子数据输入到gensim的word2vec模型中
from gensim.models import word2vec
# 引入数据集
raw_sentences = ["the quick brown fox jumps over the lazy dogs","yoyoyo you go home now to sleep"]
# 切分词汇
sentences= [s.encode('utf-8').split() for s in sentences]
# 构建模型
model = word2vec.Word2Vec(sentences, min_count=1)
Word2Vec 模型的期望输入是已经分词的句子列表,即二维数组。笔者之前使用的是 Python 内置的数组,但其在输入数据集较大的情况下会占用大量的 RAM。Gensim 本身只是要求能够迭代的有序句子列表,因此在工程实践中我们可以使用自定义的生成器(需要学一下!),只在内存中保存单条语句。
# 外部语料库
sentences = word2vec.Text8Corpus('text8')
model = word2vec.Word2Vec(sentences, size=200)
方法二:对于一段语料,首先要构建词表,此过程也可使用Keras或torchtext来简化完成。接着可以用gensim加载已训练好的word2vec词向量,此处用的是glove已训练好的词向量,
from gensim.test.utils import datapath, get_tmpfile
from gensim.models import KeyedVectors
# 已有的glove词向量
glove_file = datapath('test_glove.txt')
# 指定转化为word2vec格式后文件的位置
tmp_file = get_tmpfile("test_word2vec.txt")
from gensim.scripts.glove2word2vec
import glove2word2vec glove2word2vec(glove_file, tmp_file)
二、TorchText
Torchtext是 PyTorch的域库,提供了用于处理文本数据的基本组件,例如常用的数据集和基本的预处理管道,旨在加速自然语言处理(NLP)研究和机器学习开发过程。TorchText 因为得到 Pytorch 的支持,所以越来越受欢迎。它包含便利的数据处理实用程序,可在批量处理和准备之前将其输入到深度学习框架中,可用于来加载训练、验证和测试数据集,来进行标记化、vocab 构造和创建迭代器,这些迭代器稍后可被 dataloader 使用。它不仅是一个非常方便的工具,仅用几行简单的代码就能处理所有繁重的工作,还可以轻松地为数据集使用经过预训练的单词嵌入,例如 Word2Vec 或 FastText。
import torchtext.data as data
from torchtext.vocab import Vectors
TEXT = data.Field(tokenize='spacy', lower=True, fix_length=20, batch_first=True) #以空格分开,小写,fix_length指定了每条文本的长度,截断补长
TEXT.build_vocab([['if', 'you', 'go', 'into', 'the', 'theater'],['i','love','apple']])
print(len(TEXT.vocab)) # 11
print(TEXT.vocab.itos) # ['<unk>', '<pad>', 'apple', 'go', 'i', 'if', 'into', 'love', 'the', 'theater', 'you']
主要方法
build_vocab 创建词汇表—加载数据后可以建立词典,建立词典的时候可以使用pre-train的word vector
#使用trochtext默认支持的预训练向量
from torchtext.vocab import GloVe
from torchtext import data
TEXT = data.Field(sequential=True)
# 从预训练的 vectors 中,将当前 corpus 词汇表的词向量抽取出来,构成当前 corpus 的 Vocab(词汇表)。
TEXT.build_vocab(train, vectors=GloVe(name='6B', dim=300))
#使用预训练好的词向量
vectors = Vectors(name='词向量的路径')
TEXT.build_vocab(train, vectors=vectors)
查表得到词表中单词对应的权重weight。在词向量文件中没匹配到的单词则继续保留全0向量。得到weight权重后,即可在PyTorch的Embedding层中就可以指定预训练的词向量。得到预训练好的词向量时,我们需要在神经网络模型的Embedding层中明确地传递嵌入矩阵的初始权重。权重包含在词汇表的vectors属性中。以Pytorch搭建的Embedding层为例:
# 通过pytorch创建的Embedding层
embedding = nn.Embedding(2000, 256)
# 指定嵌入矩阵的初始权重
weight_matrix = TEXT.vocab.vectors
embedding.weight.data.copy_(weight_matrix )
在fine-tune或者根据本地语料库重新训练torchText能自动建立word2id和id2word两个索引,并将index转换为对应词向量,如果要加载预训练词向量,在build_vocab中设置即可。
三、对比(划掉, 改成总结叭)
Gensim和TorchText是PyTorch在NLP任务中的两种加载预训练词向量方法,总结来说可以有以下方法:
- 使用torchtext进行文本预处理后,使用gensim加载预训练的词向量
- 直接使用gensim加载词向量
- 使用TorchText+embedding layer
该来的总会来的!
之前一直在做代码的搬运工却不去理解为什么,以至于已知条件改变较大的时候就不知道怎么调。。。现在居然混淆这些内容!不说了,我去反省了。。。
参考文献:
- https://zhuanlan.zhihu.com/p/24961011
- https://www.jianshu.com/p/5b713f11b9e6?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
- https://www.cnblogs.com/curtisxiao/p/11179006.html
- https://blog.csdn.net/nlpuser/article/details/83627709
- https://blog.csdn.net/u012436149/article/details/79310176
- https://blog.csdn.net/qq_40334856/article/details/104208296
- https://www.cnblogs.com/cxq1126/p/13466998.html
- https://www.cnblogs.com/linzhenyu/p/13277552.html
- https://zhuanlan.zhihu.com/p/199177354