Pytorch词向量word2vec的实现(Skip-gram+negative sampling)

本文介绍了使用PyTorch实现word2vec的经典算法,包括数据预处理、模型构建和训练词向量。通过Skip-gram模型和负采样技术,训练词向量并探讨了模型结构与训练过程中的细节。在训练过程中,作者遇到了未执行反向传播导致的优化问题。
摘要由CSDN通过智能技术生成

0前言

2013年,谷歌发布了一款用于训练词向量的工具——word2vec,可谓是经典,对NLP的贡献极大。
对于这篇文章,也是膜拜至极,里面的思想让人回味无穷,当然了,其中的精华还是来自于上个世纪一个大佬的一句话“You shall know a word by the company it keeps”。
词向量的基础介绍这里就跳过了,我们讲究的是实战,所以一切从代码开始。

1 数据初探

首先,我们需要看一下我们的数据集,分为三个部分,dev,train和test。顾名思义,dev是开发时使用的,语料量比较小,打印看下数据情况,总语料为85W词左右,去重以后还有45370词,这部分加上一个作为我们的词汇表。

2 算法总体框架

  1. 数据预处理
  2. 构建模型
  3. 训练词向量

2.1 数据预处理

数据的模样我们大概清楚了,怎么处理成我们可用的数据呢,换句话说,我们训练词向量都需要什么数据呢?词汇表,skip-gram是用中心词来预测上下文单词,我们还需要采样一些negative词。即我们需要一个词序列,(中心词,上下文单词,负采样单词)可以将其当成我们的一次训练的样本,这块我们用Dataloader实现。

import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.utils.data as tud
import pandas as pd
import sklearn
import scipy
import random

from torch.nn.parameter import Parameter
from collections import Counter
from sklearn.metrics.pairwise import cosine_similarity

#1.参数和数据初始化,提供给dataloader
USE_CUDA = torch.cuda.is_available()

random.seed(53113)
np.random.seed(53113)
torch.manual_seed(53113)
if USE_CUDA:
    torch.cuda.manual_seed(53113)

C = 3 #context window
K = 100 #negative num
VOCA_SIZE = 30000 #词汇表大小
BATCH_SIZE = 128
NUM_EPOCHS = 2
LEARNING_RATE = 0.2
EMBEDDING_SIZE = 100

LOG_FILE = "train-log.txt"
#数据获取与处理
with open("text8.dev.txt", "r") as f:
    corpus = f.read()
corpus = corpus.lower().split()
#建立词汇表索引,方便后面对索引的选择
voca = dict(Counter(corpus).most_common(VOCA_SIZE-1))
voca["<unk>"] = len(corpus) - np.sum(list(voca.values())) #voca是个dict,所以必须要建立索引了
idx2word = [w for w in voca.keys()]
word2idx = {
   w:i for i,w in enumerate(idx2word)}
#负采样根据词频来的,所以还需要计算voca的词频
word_counts = np.array([wc for wc in voca.values()], dtype=np.float32)
word_freqs = word_counts / np.sum(word_counts)
word_freqs = word_freqs ** 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值