word_embedding

"""
案例:
演示文件张量实现方式之 word Embedding

大白话解释下:word2vec 和 word Embedding的区别
word2vec:
先办证,后干活,会预先训练词向量模型,后续再代入模型做其他操作
word Embedding:
边办证,边干活,训练过程中
细节:如果你要看TensorBoard的可视化界面(本质上是一个PCA主成分分析图),代码写完后,按照如下操作即可
step1:切换到nlpbase沙箱
step2:切换到当前项目(这里是day02)的路径下

"""

导包

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '0' # 禁用oneDNN优化包

import torch
from tensorflow.keras.preprocessing.text import Tokenizer # 词汇映射器
from torch.utils.tensorboard import SummaryWriter # 可视化 词向量
import jieba    # 分词器
import torch.nn as nn # 神经网络模块

1. 定义函数,演示:word Embedding将文本转成词向量,并可视化

def dm01_embedding_show():
    # 1. 定义变量,记录:待处理文本
    sentence1 = '传智教育是一家上市公司,旗下有黑马程序员品牌。我是在黑马这里学习人工智能'
    sentence2 = "我爱自然语言处理"

    # 2. 把上述的两句话封装成列表
    sentences = [sentence1, sentence2]

    # 3. 使用jieba分词处理
    # 3.1 定义变量,记录:分此后的数据——>即:词语列表
    word_list = []
    # 3.2 遍历上述的句子列表,获取到每个句子
    for sentence in sentences:
        # 3.3 使用jieba分词器进行分词处理,并将分词结果添加到word_list中
        word_list.append(jieba.lcut(sentence))

    # 3.4 打印分词结果
    """
[
    ['传智', '教育', '是', '一家', '上市公司', ',', '旗下', '有', '黑马', '程序员', '品牌', '。', '我', '是', '在', '黑马', '这里', '学习', '人工智能'],
    ['我', '爱', '自然语言', '处理']
]

    """
    print(f'分词结果:{word_list}')

    # 4. 构建词汇表,进行 文本数值化(词向量)
    # 4.1 初始化词汇映射器
    my_tokenizer = Tokenizer()
    # 4.2 拟合训练数据,统计词频,并构建:词汇表
    my_tokenizer.fit_on_texts(word_list)
    # 4.3 查看 词 和 索引 的映射关系
    print(f'词和索引的映射关系:{my_tokenizer.word_index}')
    # 4.4 获取去重后的 所有词汇列表
    my_token_list = my_tokenizer.word_index.values()   # [1,2,3,...,20]
    # print(my_token_list)  #dict_values([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])

    # 4.5 将分词后的文本——>转成 数字序列
    seq2id = my_tokenizer.texts_to_sequences(word_list)
    print(f'文本转成数字序列{seq2id}')  # [[4, 5, 1, 6, 7, 8, 9, 10, 2, 11, 12, 13, 3, 1, 14, 2, 15, 16, 17], [3, 18, 19, 20]]

    # 5. 创建 词嵌入层,把文本(即:词对应的编号) 转成词向量
    # 5.1 初始化,创建词嵌入层对象
    # 参1:词汇表大小,即:唯一的词的个数    参2:词向量的维度
    embed = nn.Embedding(num_embeddings=len(my_token_list),embedding_dim=8)
    # 5.2 查看词嵌入层的 权重参数(即:词向量)
    print(f'embed:{embed.weight.data}')
    print(f'embed.shape:{embed.weight.shape}')
    print('=.='*10)

    # # 6. 词向量可视化
    # # 6.1 创建TensorBoard写入器,将数据写入到 Runs 目录
    # my_summary = SummaryWriter(log_dir='./runs')
    #
    # # 6.2 将词向量 和 对应的词语 添加到 TensorBoard中
    # # 参1:词向量句子,形状是(20,8),20个词,每个词用8个数字表示(8维)
    # # 参2:对应的词语列表,用来标注每个点
    # my_summary.add_embedding(embed.weight.data,my_token_list)
    #
    # # 6.3 关闭写入器
    # my_summary.close()

    # 7.查看每个单词对应的词向量
    for idx in range(len(my_tokenizer.word_index)): # idx的范围[0,20)
        # 7.1 获取当前单词对应的词向量.
        temp_vector = embed(torch.tensor(idx))  #embed(张量):Embedding 层本质就是一张大表格,根据下标查表,返回一行向量(你设置的维度是 8,所以输出 8 个浮点数)
        # print(f'词向量:{temp_vector}') #tensor([ 1.1217,  0.7850, -1.3456,  0.1300, -1.0892,  1.1005, -0.0747, -1.5127],       grad_fn=<EmbeddingBackward0>)
        # 7.2 获取当前索引对应的单词   my_tokenizer.index_word的索引是从1开始的
        word = my_tokenizer.index_word[idx+1]
        print(f'单词:{word},词向量:{temp_vector.detach().numpy()}')
posted @ 2026-07-30 16:44  王新文  阅读(11)  评论(0)    收藏  举报