哈喽,小伙伴们!今天聊一聊自然语言处理(NLP)中的一个小概念.语料的数值化转化.因为有一定了解的小伙伴应该都知道在NLP中,汉字是没办法直接送到模型训练的,因为计算机只能识别二进制的数据.所以我们需要把汉字转成张量的形式,这样变成二进制数据后就可以放入模型中训练.那有哪些常用方式呢?我们接着往下聊.
一 基本概述
自然语言中词向量的转化方式很多,比如one-hot编码,这中方式操作简单,易于理解.但是有一个很大不足就是如果遇到大语料集时会非常占用内存.由此我们常用的是word2vec和word embedding两种方式.今天主要介绍后者.
# 广义的word embedding包括所有密集词汇向量的表示方法,如word2vec, 即可认为是word embedding的一种.
# 狭义的word embedding是指在神经网络中加入的embedding层, 对整个网络进行训练的同时产生的embedding矩阵(embedding层的参数), 这个embedding矩阵就是训练过程中所有输入词汇的向量表示组成的矩阵.
二者又有区别,word2vec是先通过训练得到词向量矩阵让后放到项目下游使用;word embedding是先生成一个随机的词向量矩阵,随着项目一起更新这个矩阵.所以使用时需要注意这个点.
word_embedding_15">二 word embedding可视化
# 导包
word">import jieba
word">import torch
word">import torch.nn word">as nn
word">from tensorflow.keras.preprocessing.text word">import Tokenizer
word">from torch.utils.tensorboard word">import SummaryWriter
# 定义函数
word">def embedding_show():# 准备语料sent1 = '我爱北京天安门'sent2 = '我爱中国'# 合并语料sents = [sent1, sent2]# 创建空列表储存分词后的数据word_list = []# 遍历 语料库中的文本 分词 加到 word_list中word">for s word">in sents:word_list.append(jieba.lcut(s))# 打印分词后的数据word">print(f'分词后的数据{word_list}') # 分词后的数据[['我', '爱', '北京', '天安门'], ['我', '爱', '中国']]# 实例化my_tokenizer = Tokenizer()# 用实例化是Tokenizer训练数据 得到去重后带有编号的字典 注意:编号从1开始my_tokenizer.fit_on_texts(word_list)# 词-索引是{'我': 1, '爱': 2, '北京': 3, '天安门': 4, '中国': 5}word">print(f'词-索引是{my_tokenizer.word_index}') # 索引-词{1: '我', 2: '爱', 3: '北京', 4: '天安门', 5: '中国'}word">print(f'索引-词{my_tokenizer.index_word}') my_token_list = my_tokenizer.index_word.values() # 处理后的token列表为:dict_values(['我', '爱', '北京', '天安门', '中国'])word">print(f'处理后的token列表为:{my_token_list}')seq2id = my_tokenizer.texts_to_sequences(word_list)# 处理后的token连成句子(文本)的索引为[[1, 2, 3, 4], [1, 2, 5]]# 注意: 句子 对应分词后的 分词后的数据[['我', '爱', '北京', '天安门'], ['我', '爱', '中国']]word">print(f'处理后的token连成句子(文本)的索引为{seq2id}')# 6.获取embedding矩阵 词表矩阵(随机数 还不是词向量)my_embed = nn.Embedding(num_embeddings=len(my_token_list),embedding_dim=5)word">print(f'my_embed的维度是{my_embed.weight.shape}') # my_embed的维度是torch.Size([5, 5])word">print(f'权重列表(词表矩阵){my_embed.weight.data}')# 7.查询token的vec (词向量)word">for idx word">in range(len(my_tokenizer.word_index)):# inx转成tensor形式 放入模型中形成词向量vec = my_embed(torch.tensor(idx))# 注意:从0开始 所以索引+1 找到对应的词word = my_tokenizer.index_word[idx+1]word">print(f'{word}的词向量是{vec}')# 8.可视化词向量# 创建一个日志目录 保存词向量和词logder = r'E:\data\runs'my_summary = SummaryWriter(log_dir=logder)# 获取和词向量添加到my_summary并关联对应的token(词)my_summary.add_embedding(my_embed.weight.data,my_token_list)# 关闭my_summary.close()# 通过电脑终端或者Pycharmd内置的终端启动tensorboard 在浏览器查看词向量可视化结果(如下图)# tensorboard --logdir=runs --host 0.0.0.0 # 注意:logdir=runs 必须是我们创建的日志目录runs的上级目录 否则会报错
word">if __name__ == '__main__':embedding_show()
词向量空间关系图如下:
以上就是今天和大家聊的word embedding实现词向量转化和空间关系展示.在这个世界上,最美好的事情就是分享.点赞关注,让我们一起分享喜悦和成长.下期见…