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

相关推荐
frankz6122 分钟前
word无法创建工作文件,检查临时环境变量。
word
Captain823Jack25 分钟前
nlp新词发现——浅析 TF·IDF
人工智能·python·深度学习·神经网络·算法·自然语言处理
被制作时长两年半的个人练习生25 分钟前
【AscendC】ReduceSum中指定workLocal大小时如何计算
人工智能·算子开发·ascendc
Captain823Jack1 小时前
w04_nlp大模型训练·中文分词
人工智能·python·深度学习·神经网络·算法·自然语言处理·中文分词
Black_mario1 小时前
链原生 Web3 AI 网络 Chainbase 推出 AVS 主网, 拓展 EigenLayer AVS 应用场景
网络·人工智能·web3
Aileen_0v02 小时前
【AI驱动的数据结构:包装类的艺术与科学】
linux·数据结构·人工智能·笔记·网络协议·tcp/ip·whisper
数信云 DCloud2 小时前
实力认可 | 通付盾入选《ISC.AI 2024创新能力全景图谱》五项领域
人工智能
itwangyang5202 小时前
AIDD - 从机器学习到深度学习:蛋白质-配体对接评分函数的进展
人工智能·深度学习·机器学习
jerry2011082 小时前
机器学习常用术语
人工智能·机器学习
电报号dapp1192 小时前
比特币市场震荡:回调背后的机遇与挑战
人工智能·去中心化·区块链·智能合约