Word Embedding

Word Embedding

    • [一 基本概述](#一 基本概述)
    • [二 word embedding可视化](#二 word embedding可视化)

哈喽,小伙伴们!今天聊一聊自然语言处理(NLP)中的一个小概念.语料的数值化转化.因为有一定了解的小伙伴应该都知道在NLP中,汉字是没办法直接送到模型训练的,因为计算机只能识别二进制的数据.所以我们需要把汉字转成张量的形式,这样变成二进制数据后就可以放入模型中训练.那有哪些常用方式呢?我们接着往下聊.

一 基本概述

自然语言中词向量的转化方式很多,比如one-hot编码,这中方式操作简单,易于理解.但是有一个很大不足就是如果遇到大语料集时会非常占用内存.由此我们常用的是word2vec和word embedding两种方式.今天主要介绍后者.

python 复制代码
# 广义的word embedding包括所有密集词汇向量的表示方法,如word2vec, 即可认为是word embedding的一种.
# 狭义的word embedding是指在神经网络中加入的embedding层, 对整个网络进行训练的同时产生的embedding矩阵(embedding层的参数), 这个embedding矩阵就是训练过程中所有输入词汇的向量表示组成的矩阵.

二者又有区别,word2vec是先通过训练得到词向量矩阵让后放到项目下游使用;word embedding是先生成一个随机的词向量矩阵,随着项目一起更新这个矩阵.所以使用时需要注意这个点.

二 word embedding可视化

python 复制代码
# 导包
import jieba
import torch
import torch.nn as nn
from tensorflow.keras.preprocessing.text import Tokenizer
from torch.utils.tensorboard import SummaryWriter
# 定义函数
def embedding_show():
    # 准备语料
    sent1 = '我爱北京天安门'
    sent2 = '我爱中国'
    # 合并语料
    sents = [sent1, sent2]
    # 创建空列表储存分词后的数据
    word_list = []
    # 遍历 语料库中的文本 分词 加到 word_list中
    for s in sents:
        word_list.append(jieba.lcut(s))
    # 打印分词后的数据
    print(f'分词后的数据{word_list}') # 分词后的数据[['我', '爱', '北京', '天安门'], ['我', '爱', '中国']]
    # 实例化
    my_tokenizer = Tokenizer()
    # 用实例化是Tokenizer训练数据 得到去重后带有编号的字典 注意:编号从1开始
    my_tokenizer.fit_on_texts(word_list)
    # 词-索引是{'我': 1, '爱': 2, '北京': 3, '天安门': 4, '中国': 5}
    print(f'词-索引是{my_tokenizer.word_index}') 
    # 索引-词{1: '我', 2: '爱', 3: '北京', 4: '天安门', 5: '中国'}
    print(f'索引-词{my_tokenizer.index_word}') 
    my_token_list = my_tokenizer.index_word.values() 
    
    # 处理后的token列表为:dict_values(['我', '爱', '北京', '天安门', '中国'])
    print(f'处理后的token列表为:{my_token_list}')
    seq2id = my_tokenizer.texts_to_sequences(word_list)
    # 处理后的token连成句子(文本)的索引为[[1, 2, 3, 4], [1, 2, 5]]
    # 注意: 句子 对应分词后的 分词后的数据[['我', '爱', '北京', '天安门'], ['我', '爱', '中国']]
    print(f'处理后的token连成句子(文本)的索引为{seq2id}')

    # 6.获取embedding矩阵 词表矩阵(随机数 还不是词向量)
    my_embed = nn.Embedding(num_embeddings=len(my_token_list),embedding_dim=5)
    print(f'my_embed的维度是{my_embed.weight.shape}') # my_embed的维度是torch.Size([5, 5])
    print(f'权重列表(词表矩阵){my_embed.weight.data}')
    # 7.查询token的vec (词向量)
    for idx in range(len(my_tokenizer.word_index)):
        # inx转成tensor形式 放入模型中形成词向量
        vec = my_embed(torch.tensor(idx))
        # 注意:从0开始 所以索引+1 找到对应的词
        word = my_tokenizer.index_word[idx+1]
        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的上级目录 否则会报错
if __name__ == '__main__':
    embedding_show()

词向量空间关系图如下:

以上就是今天和大家聊的word embedding实现词向量转化和空间关系展示.在这个世界上,最美好的事情就是分享.点赞关注,让我们一起分享喜悦和成长.下期见...

相关推荐
陈苏同学2 小时前
机器翻译 & 数据集 (NLP基础 - 预处理 → tokenize → 词表 → 截断/填充 → 迭代器) + 代码实现 —— 笔记3.9《动手学深度学习》
人工智能·pytorch·笔记·python·深度学习·自然语言处理·机器翻译
狂放不羁霸2 小时前
组会 | 大语言模型 + LoRA
人工智能·语言模型·自然语言处理
sp_fyf_20242 小时前
【大语言模型】ACL2024论文-20 SCIMON:面向新颖性的科学启示机器优化
人工智能·深度学习·机器学习·语言模型·自然语言处理·数据挖掘
宋138102797202 小时前
SouVR Feedback force7 力反馈设备
人工智能·机器人·vr
我叫白小猿2 小时前
【大模型-智能体】AutoGen Studio测试和导出工作流程
人工智能·python·workflow·工作流·智能体·autogen
CopyLower2 小时前
AI赋能电商:智能购物推荐、会员分类与商品定价的创新探索
人工智能·分类·数据挖掘
界面开发小八哥2 小时前
界面控件DevExpress WinForms v24.2新功能预览 - 人工智能(AI)
人工智能·.net·界面控件·devexpress·ui开发
2zcode2 小时前
基于YOLOv8深度学习的独居老人情感状态监护系统(PyQt5界面+数据集+训练代码)
人工智能·深度学习·yolo
藓类少女3 小时前
【深度学习】模型训练时减少GPU显存占用
人工智能·深度学习
苏涵.3 小时前
深度学习实验十二 卷积神经网络(3)——基于残差网络实现手写体数字识别实验
人工智能·深度学习·神经网络·cnn