word2vec(gensim) 和 torchText

知乎原文

一、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

该来的总会来的!
之前一直在做代码的搬运工却不去理解为什么,以至于已知条件改变较大的时候就不知道怎么调。。。现在居然混淆这些内容!不说了,我去反省了。。。

参考文献:

  1. https://zhuanlan.zhihu.com/p/24961011
  2. https://www.jianshu.com/p/5b713f11b9e6?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
  3. https://www.cnblogs.com/curtisxiao/p/11179006.html
  4. https://blog.csdn.net/nlpuser/article/details/83627709
  5. https://blog.csdn.net/u012436149/article/details/79310176
  6. https://blog.csdn.net/qq_40334856/article/details/104208296
  7. https://www.cnblogs.com/cxq1126/p/13466998.html
  8. https://www.cnblogs.com/linzhenyu/p/13277552.html
  9. https://zhuanlan.zhihu.com/p/199177354
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值