今天我们来介绍实现Embedding的方法,分为手动实现、利用平台获取以及预训练模型

手动实现一个简单word2vec

import numpy as np
from argparse import Namespace
from collections import defaultdictclass word2vec(object):def __init__(self, args):self.window_size = args.window_sizeself.hdim = args.hdimself.epochs = args.epochsself.learning_rate = args.learning_ratedef generate_training_data(self,text):c = self.window_sizetrain_data = []sentence_list = [sentence for sentence in text.split(',')] #语料库句子间以逗号为分隔符corpus = [[word.lower() for word in sentence.split()] for sentence in sentence_list]self.word_counts, self.word_index, self.index_word = self.word_to_index(corpus)#返回单词出现频次,索引字典for sentence in corpus:for n, word in enumerate(sentence):context_list = sentence[n-c:n] + sentence[n+1:n+1+c] #上下文input_vector = self.word2onehot(word)output_vector = [self.word2onehot(word) for word in context_list]train_data.append([input_vector, output_vector])return train_datadef word_to_index(self,corpus):word_counts = defaultdict(int)for sentence in corpus:for word in sentence:word_counts[word] += 1word_index = dict((word, i) for i, word in enumerate(word_counts.keys()))index_word = dict((i, word) for i, word in enumerate(word_counts.keys()))return word_counts,word_index,index_worddef word2onehot(self, word):word_vec = [0 for i in range(len(self.word_index))]word_vec[self.word_index[word]] = 1return word_vecdef softmax(self, x):e_x = np.exp(x - np.max(x))return e_x / e_x.sum(axis=0)def forward(self,x):h = np.dot(self.W1.T, x)u = np.dot(self.W2.T, h)y_pred = self.softmax(u)return y_pred,h,udef backward(self, e, h, x):dl_dw2 = np.outer(h, e)dl_dw1 = np.outer(x, np.dot(self.W2, e.T))# UPDATE WEIGHTSself.W1 = self.W1 - (self.learning_rate * dl_dw1)self.W2 = self.W2 - (self.learning_rate * dl_dw2)def train(self,train_data):self.W1 = np.random.uniform(low=-1,high=1,size=(len(self.word_counts),self.hdim)) #初始化输入层到隐藏层的系数矩阵self.W2 = np.random.uniform(low=-1,high=1,size=(self.hdim,len(self.word_counts)))#初始化隐藏层到输出层的系数矩阵for epoch in range(self.epochs):self.loss = 0  #计算损失函数for input,output in train_data:#前向传播y_pred,h,u = self.forward(input)#计算损失EI = np.sum([np.subtract(y_pred, word) for word in output], axis=0)#后向传播更新矩阵self.backward(EI, h, input)#一次更新后计算损失self.loss += -np.sum([u[word.index(1)] for word in output]) + len(output) * np.log(np.sum(np.exp(u)))if epoch % 5000 == 0:print('epoch is {},loss is:{}'.format(epoch,self.loss))
args = Namespace(window_size=2, # 窗口大小hdim=4, # 隐藏层维度learning_rate=0.01, # 学习率epochs=50000 # 训练迭代次数)text = "natural language processing and machine learning is fun and exciting"R = word2vec(args)
train_data = R.generate_training_data(text)
n = 2
print('training set size is:',len(train_data))
print('input vector:', train_data[n][0], 'output vector:', train_data[n][1])R.train(train_data)
print('embedding vector:', R.W1)

来看看训练过程吧:

从训练过程可以看到,每一次迭代,都要执行四个步骤:前向传播、计算损失、反向传播更新梯度、计算损失。

利用pytorch生成embedding

获取embedding第二种方法是通过pytorch等平台自动获取:

import torch
import torch.nn as nnembedding = nn.Embedding(10, 3) #假设共有10个单词,对应索引为0到9
embedding.weight #初始化weight,这个权重矩阵是可学习的
input = torch.LongTensor([[1,2,4,5],[4,3,2,9]])#从10个单词选择6个不同单词,分两个批次
embedding(input) #把输入中的每个词(这里对应每个索引)转换为词嵌入

通过预训练获取

获取embedding第三种方法是通过预训练模型,这里介绍gensim库的word2vec实现过程。

先来一个最简单的实现代码:

import jieba
import warnings
from gensim.models import Word2Vecwarnings.filterwarnings('ignore')raw_sentences = ['我在凌晨三点醒来的夜里想起失去的你','曾经说着永远一起现在却不再联系']# 切分词汇
sentences = []
for s in raw_sentences:tmp = []for item in jieba.cut(s):tmp.append(item)sentences.append(tmp)model = Word2Vec(sentences, vector_size=5,min_count=1)
model.wv['凌晨'] #输出词向量表示

Word2Vec传入语料库的形式列表,即代码中的sentences:

训练后通过wv方法获取词向量,比如“凌晨”:

下面介绍一下Word2Vec相关参数:

  • sentence:语料库,list形式
  • vector_size:词向量维度,即隐藏层神经元个数
  • sg:{0,1},算法参数,1代表skip-gram,0代表CBOW
  • window:窗口词汇个数,即上下文有关的词语个数
  • min_count:词频少于该阈值的词语忽略
  • hs:{0,1},激活函数,1代表选择hierarchical softmax函数
  • negative:hs参数为0时,选择负采样算法,参数代表负采样的样本数
  • alpha:梯度更新的初始学习率
  • epochs:迭代轮数
  • cbow_mean:使用CBOW算法前提下,0代表上下文词向量求和,1代表取均值
  • workers:使用进程训练模型

上面是基本的参数,更多的参数设置参加源码。

对于大型语料库,gensim提供了一些工具进行训练,主要有以下三个:

from gensim.models.word2vec import BrownCorpus
from gensim.models.word2vec import Text8Corpus
from gensim.models.word2vec import LineSentence

获取模型相关参数用wv方法,我们举一个例子来说明,用以下语料作为训练语料库:

import warnings
warnings.filterwarnings('ignore')
import multiprocessing
from gensim.models import Word2Vec
from gensim.models.word2vec import BrownCorpus,Text8Corpus,LineSentencesentences = LineSentence(r'E:\kh.txt')
# sentences = Text8Corpus(r'E:\kh.txt')
print('the input corpus:')
print(list(sentences))
model = Word2Vec(sentences,vector_size=5,hs=0,negative=2,window=3,min_count=1,sg=0,workers=multiprocessing.cpu_count())print('... *** word2vec exchange *** ...')
print(model.wv['江湖']) #打印词向量
print(model.wv.similarity('为国','孤村')) #两个词之间的相似性
print(model.wv.most_similar('孤村')) #与某一个词相似的词的排序
print(model.wv.doesnt_match(['风卷', '江湖', '铁马', '孤村'])) #找出不同类的词out_vector = 're.vector'
model.wv.save_word2vec_format(out_vector) #保存词向量out_model = 'word2vecRe.model'
model.save(out_model) #保存模型
# Word2Vec.load() #加载模型print(model.predict_output_word(['不自哀','为国'],topn=1)) #预测模型

看看结果吧:

可以看到,LineSentence和Text8Corpus可以将一个文本直接转化为语料库,文本的单词用空格隔开,每一行作为一条句子。

可以保存词向量,文件是“vector"后缀,打开直接看到所有词向量的embedding表示:

获取Embedding相关推荐

  1. 【赠书】深入浅出embedding:原理解析与应用实践

    ‍‍ Embedding(嵌入)是当下人工智能领域的热点,并发挥着越来越重要的作用.本书从Embedding基础概念和方法讲起,逐渐深入其原理,并以应用实例作为辅助,是快速了解并掌握Embedding ...

  2. 推荐系统中的Embedding应用

    文章目录 1. Word2Vec 1.1 Skip-gram 2. Airbnb中的Embedding 2.1 用在相似推荐中的List Embedding 2.1.1 优化一:Booked List ...

  3. 深度学习中的embedding

    整理翻译自google developer的机器学习入门课程,介绍了embedding的应用方式和如何计算embedding,后面还配有通过tensorflow DNN训练embedding练习加深理 ...

  4. Bert系列:如何用bert模型输出文本的embedding

    问题: 分类模型可以输出其文本的embedding吗?LM模型可以输出其文本的embedding吗?答案:可以. 假设你已经用自己的数据fine-tuing好模型. 主要工具设备型号: python3 ...

  5. GNN教程:DGL框架中的采样模型!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:秦州,算法工程师,Datawhale成员 引言 本文为GNN教程的 ...

  6. 第八课.特征工程与CTR预测

    目录 特征工程 缺失值处理 特征归一化 连续特征离散化 离散特征one-hot编码 ID特征Embedding 特征构造方法 AUC指标补充 实验:LR预估CTR 特征工程 缺失值处理 pandas ...

  7. 预训练BERT学习笔记_Storm*Rage的博客

    Transformer的Attention Decoder的结构与Encoder相比多了一个Encoder-Decoder Attention,两个Attention分别用于计算输入和输出的权值: S ...

  8. 综述 | 三大路径,一文总览知识图谱融合预训练模型的研究进展

    当前,预训练模型已是AI领域较为成熟的一项技术,但由于基于神经网络架构的模型本身不具有常识能力,在一些涉及逻辑推理和认知的任务上力有不逮. 近年来,知识图谱越来越受到人们的关注,知识图谱旨在提供一种复 ...

  9. 推荐系统中的召回算法--协同过滤

    工业界通用推荐系统架构: Match&Rank 定义:Match基于当前user(profile.history)和context,快速在全库中找到TopN最相关的Item,给Rank来做小范 ...

最新文章

  1. AngularJS学习笔记(3)——通过Ajax获取JSON数据
  2. 微信小程序配置WSS协议
  3. hdu1532(最大流裸题)
  4. live555 源码分析:MediaSever
  5. Python导包、模块报错的问题
  6. linux常用命令 打开文件,【Linux】常用命令 lsof查看打开的文件
  7. 重庆电子工程学院计算机专业,重庆计算机电子工程职业学院2020年招生录取分数线...
  8. 量化评估推荐系统效果
  9. 人生的许多不经意-致51CTO
  10. redis_lua_nginx环境配置过程
  11. 网狐荣耀手机端内核源码
  12. 【hightopo】【基础图标】 HT for Web简单图标的制作:进度图标
  13. 谷歌云服务器账号,免费使用谷歌云服务器一年
  14. python的bytes数据类型
  15. Debian11新装系统美化
  16. c++ 从入门到放弃
  17. ajax仿百度搜索效果,利用autocomplete.js实现仿百度搜索效果(ajax动态获取后端[C#]数据)...
  18. ant-design实现主题暗黑主题 和 亮色主题的 切换(实现网站黑白皮肤)
  19. 原美团联合创始人欲打造中国版 OpenAI ;ChatGPT 爆红惊动谷歌退隐创始人布林;Gradle 8.0 发布|极客头条
  20. C#【保留小数点后位数】与【字符串数字格式化】

热门文章

  1. 目标跟踪心得篇二:ByteTrack原理及其在MMTracking上的代码逐行分析(本文顺带分析MMTracking相关难点,后期不在赘述)
  2. 第一座月球核电站明年问世
  3. Auto_ML自动机器学习之TPOT——学习笔记(2)
  4. UIControl 详细解释
  5. 关于双碳中的一些单位换算
  6. QuizCardGame
  7. 高通平台开发系列讲解(外设篇)什么是TDM
  8. java实现多功能记事本
  9. EDA(Quartus II)——正弦信号发生器的设计
  10. android ts格式,MPEG2TS文件格式概述