解决 torchtext 无法下载 glove

最近,在看一个情感分析入门级项目,其中用到了 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 放在什么位置可是苦恼我好久了。

解决步骤

  1. 下载 glove.6B.100d.zip 文件

  2. 通过 xftp 将 glove.6B.100d.zip 上传到远端 linux 服务器

  3. 通过 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

参考 这个博客,看到这里可以使用 外部预训练词向量。他这篇文章中是,通过更改 namecache 来解决的,如下(这是上面这篇博客里面的内容,引用一下):
在这里插入图片描述
我想着这个应该符合我这个情况,但是一用发现 Vectors 是个啥玩意,又报错了:

在这里插入图片描述
还是没搞懂这个 Vectors 是个啥玩意,最后通过本文方法解决了~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值