最近,在看一个情感分析入门级项目,其中用到了 glove 预训练词嵌入。
但是,可能是因为网络原因,直接使用 torchtext 下载 glove 却又没反应。
搞得有点头大,辗转好久才解决。
采用如下代码构建词典时,本会自动下载 “glove.6B.100d”:
TEXT.build_vocab(train_data,
max_size = MAX_VOCAB_SIZE,
vectors = "glove.6B.100d",
unk_init = torch.Tensor.normal_)
但是,可能是因为网络原因,直接这样下载 glove 却又没反应。
于是,想着能不能仿照之前 安装 en_core_web_sm-3.0.0 先把 glove 下载到本地,然后在传到服务器上。思路没毛病,网上也能找到 golve 文件,但是 torchtext 不会玩的我,把 glove 放在什么位置可是苦恼我好久了。
解决步骤
-
下载
glove.6B.100d.zip
文件 -
通过 xftp 将 glove.6B.100d.zip 上传到远端 linux 服务器
-
通过 unzip 命令解压文件 glove.6B.100d.zip
解压后主要有四个文件,如下如所示,但这里用的是 glove.6B.100d 的
4. 将 “glove.6B.100d” 移动到待执行 py 文件所在文件夹下的 .vector_cache 文件夹即可
注意:
-
第一次执行待执行 py 文件后,会在其所在文件夹下生成一个 .vector_cache 的隐藏目录;
-
若未生成,则可以使用 mkdir .vertor_cache 创建之。
使用
ls -a
命令可以查看之,如下所示:
-
将解压后的
glove.6B.100d.txt
移动到 .vector_cache,再次执行代码后会在 .vector_cache 文件夹下生成一个对应的 pt 文件,如下:
到这里,就可以正常在 torchtext 里使用 glove了。其实挺好处理的,主要一开始对torchtext 不熟悉,不知道改吧解压后的 glove 文件放在什么位置。
下面是,试验代码以及成功运行glove的图:
试验代码:
## 加载数据集
from torchtext.legacy import datasets
train_data, test_data = datasets.IMDB.splits(TEXT, LABEL)
print(f'Number of training examples: {len(train_data)}')
print(f'Number of testing examples: {len(test_data)}')
print(vars(train_data.examples[0]))
## 从 train 从划分 train/dev
import random
train_data, valid_data = train_data.split(random_state = random.seed(SEED))
print(f'Number of training examples: {len(train_data)}')
print(f'Number of validation examples: {len(valid_data)}')
print(f'Number of testing examples: {len(test_data)}')
## 使用预训练词嵌入 构建词典
MAX_VOCAB_SIZE = 25_000
# cache = '/home/duanxinshen/GLOVE/glove.6B' # 预训练文件位置
# vectors = Vectors(name = 'glove.6B.100d.txt', cache=cache)
TEXT.build_vocab(train_data,
max_size = MAX_VOCAB_SIZE,
vectors = "glove.6B.100d",
unk_init = torch.Tensor.normal_)
LABEL.build_vocab(train_data)
print(f"Unique tokens in TEXT vocabulary: {len(TEXT.vocab)}")
print(f"Unique tokens in LABEL vocabulary: {len(LABEL.vocab)}")
print(TEXT.vocab.freqs.most_common(20))
print(TEXT.vocab.itos[:10])
print(LABEL.vocab.stoi)
运行结果:
下面不用看了,主要是记录一下自己踩的坑。
踩坑1
太年轻,一开始想着直接更改 vectors 为自定义防止 glove 的文件夹位置,直接gg
TEXT.build_vocab(train_data,
max_size = MAX_VOCAB_SIZE,
vectors = "/home/xxx/GLOVE/glove.6B/glove.6B.100d.txt
", # 错误示例1
unk_init = torch.Tensor.normal_)
果不其然报错如下:
踩坑2
参考 这个博客,看到这里可以使用 外部预训练词向量。他这篇文章中是,通过更改 name
和 cache
来解决的,如下(这是上面这篇博客里面的内容,引用一下):
我想着这个应该符合我这个情况,但是一用发现 Vectors
是个啥玩意,又报错了:
还是没搞懂这个 Vectors
是个啥玩意,最后通过本文方法解决了~