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实现词向量转化和空间关系展示.在这个世界上,最美好的事情就是分享.点赞关注,让我们一起分享喜悦和成长.下期见...

相关推荐
极智-9967 分钟前
GitHub 热榜项目-日榜精选(2026-02-02)| AI智能体、终端工具、视频生成等 | openclaw、99、Maestro等
人工智能·github·视频生成·终端工具·ai智能体·电子书管理·rust工具
悟纤19 分钟前
AI 音乐创作中的音乐织体(Texture)完整指南 | Suno高级篇 | 第30篇
人工智能·suno·suno ai·suno api·ai music
可触的未来,发芽的智生25 分钟前
狂想:为AGI代称造字ta,《第三类智慧存在,神的赐名》
javascript·人工智能·python·神经网络·程序人生
莱茶荼菜28 分钟前
yolo26 阅读笔记
人工智能·笔记·深度学习·ai·yolo26
Dingdangcat861 小时前
【YOLOv8改进实战】使用Ghost模块优化P2结构提升涂胶缺陷检测精度_1
人工智能·yolo·目标跟踪
希艾席帝恩1 小时前
智慧城市建设中,数字孪生的价值在哪里?
人工智能·低代码·私有化部署·数字孪生·数字化转型
我的offer在哪里2 小时前
开源 AI 生成游戏平台:原理、开源项目与落地实战指南
人工智能·游戏·开源
qidun2102 小时前
埃夫特机器人防护服使用范围详解-避免十大应用误区
网络·人工智能
Σίσυφος19002 小时前
PCL Point-to-Point ICP详解
人工智能·算法
PaperRed ai写作降重助手2 小时前
AI 论文写作工具排名(实测不踩坑)
人工智能·aigc·ai写作·论文写作·智能降重·辅助写作·降重复率