GloVe词向量自定义函数实现词向量降维

在这里插入图片描述

TEXT.build_vocab(train_data, max_size=10000, vectors='glove.6B.100d')
LABEL.build_vocab(train_data)
pretrained_embedding = TEXT.vocab.vectors

上面代码加载了glove.6B.100d词向量,假设我需要设计一个函数,将词向量长为100映射到长为50,这个映射方法就是取每个向量的前50个元素,现在用torch代码实现这个功能,并将50维的向量加载到bi-lstm神经网络模型中

以下是将100维的GloVe词向量映射到50维的PyTorch代码:

import torch.nn as nn
import torch.nn.functional as F

# 假设词向量已经加载到pretrained_embedding变量中

# 取前50个元素作为新的词向量
new_embeddings = pretrained_embedding[:, :50]

# 构建Bi-LSTM模型
class BiLSTM(nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim, embeddings):
        super(BiLSTM, self).__init__()

        # 将新的50维词向量加载到Embedding层中
        self.embedding = nn.Embedding.from_pretrained(embeddings, freeze=True)

        # Bi-LSTM网络
        self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers=2, batch_first=True, bidirectional=True)
        self.fc = nn.Linear(hidden_dim*2, output_dim)

    def forward(self, text):
        embedded = self.embedding(text)
        output, (hidden, cell) = self.lstm(embedded)
        hidden_concat = torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim=1)
        output = self.fc(hidden_concat)
        return output

# 初始化模型
input_dim = 50  # 50维的词向量
hidden_dim = 256
output_dim = 2
model = BiLSTM(input_dim, hidden_dim, output_dim, new_embeddings)

其中,nn.Embedding.from_pretrained()函数用于将预训练的词向量加载到Embedding层中,参数freeze=True表示冻结词向量,不参与模型的训练过程。在BiLSTM类中,self.embedding表示Embedding层,self.lstm表示Bi-LSTM层,self.fc表示全连接层。torch.cat()函数用于将前向和后向LSTM的最后一层输出进行拼接。

续上要求, TEXT.build_vocab(train_data, max_size=10000, vectors='glove.6B.100d')中的词向量是100维的,假设我要逐一的将每一个词的向量用映射函数A降维到50维,再将各个降维的结果拼凑到TEXT.build_vocab里面,pretrained_embedding = TEXT.vocab.vectors后,每次调用的词向量都是50维的词向量

以下是将100维的GloVe词向量逐一映射到50维并拼凑到TEXT.vocab.vectors中的代码:

import torch.nn.functional as F

# 假设词向量已经加载到TEXT.vocab.vectors变量中

# 逐一将每个词的向量用映射函数A降维到50维
new_vectors = []
for i, word in enumerate(TEXT.vocab.itos):
    old_vector = TEXT.vocab.vectors[i]
    new_vector = F.linear(old_vector, torch.eye(100, 50))
    new_vectors.append(new_vector)

# 将降维后的词向量拼凑成张量
new_embeddings = torch.stack(new_vectors, dim=0)

# 构建Bi-LSTM模型
class BiLSTM(nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim, embeddings):
        super(BiLSTM, self).__init__()

        # 将新的50维词向量加载到Embedding层中
        self.embedding = nn.Embedding.from_pretrained(embeddings, freeze=True)

        # Bi-LSTM网络
        self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers=2, batch_first=True, bidirectional=True)
        self.fc = nn.Linear(hidden_dim*2, output_dim)

    def forward(self, text):
        embedded = self.embedding(text)
        output, (hidden, cell) = self.lstm(embedded)
        hidden_concat = torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim=1)
        output = self.fc(hidden_concat)
        return output

# 初始化模型
input_dim = 50  # 50维的词向量
hidden_dim = 256
output_dim = 2
model = BiLSTM(input_dim, hidden_dim, output_dim, new_embeddings)

其中,torch.eye(100, 50)用于生成100x50的单位矩阵,作为映射函数A。在循环中,对于每个词向量,都通过F.linear()函数与单位矩阵进行映射,将100维的词向量降维到50维,并将结果保存到new_vectors列表中。最后,通过torch.stack()函数将所有降维后的词向量拼凑成张量,并将其加载到Embedding层中,构建Bi-LSTM模型。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
训练好的中文GloVe词向量是通过对大规模中文语料进行训练得到的一种词向量表示方式。GloVe是一种基于全局词频统计的词向量训练方法,通过对语料中的词共现矩阵进行分解,得到每个词的词向量表示。相比于传统的基于语境窗口的词向量方法,GloVe能够更好地捕捉词之间的全局语义关系。 训练好的中文GloVe词向量在中文文本处理任务中具有以下优点。首先,它能够将词语表示为稠密的向量,这样可以更好地进行向量计算和语义相似度的度量。同时,GloVe能够将词与词之间的关系表示为向量空间中的几何关系,从而使得具有相似语义的词之间的距离更近,实现了语义的聚类效果。此外,训练好的GloVe词向量还具有很好的词频特性,能够捕捉词语的重要程度和频繁度,使得词向量在某些应用场景中更加准确。 为了训练好的中文GloVe词向量,首先需要准备大规模的中文语料库。然后,通过对语料库进行预处理和分词,将每个词语转化为一个唯一的ID。接下来,利用词共现矩阵和GloVe算法进行训练,在迭代的过程中优化词向量的表示。最后,根据训练得到的词向量,可以进行词语的语义相似度计算、主题聚类等任务。 总之,训练好的中文GloVe词向量是通过对大规模中文语料进行训练获得的一种词语表示方式,它具有较好的语义表达能力和词频特性,能够在中文文本处理任务中发挥重要作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高山莫衣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值