自然语言处理NLP:嵌入层Embedding中input_dim的计算——Tokenizer文本分词和编码

1. 词汇表大小(input_dim)计算方法

嵌入层Embedding中的input_dim是根据数据中所有唯一词(或字)的总数来决定的。可以通过Tokenizer文本分词和编码得到。

简单说,Tokenizer 是一个文本分词和编码器,它主要做两件事:

  • 分词:将句子拆分成词或字
  • 编码:为每个词/字分配唯一的数字编号

例如:

python 复制代码
from keras.preprocessing.text import Tokenizer

# 假设这是你的训练文本数据
texts = [
    "我爱吃苹果",
    "苹果很好吃",
    "我不喜欢香蕉",
    "香蕉和苹果都是水果"
]

# 创建分词器并构建词汇表,设置 char_level=True 按字分词
# 如果想要更加合理的中文分词,比如"苹果"合并为一个词,可以使用中文分词工具(如 jieba)
# import jieba  # 需要安装: pip install jieba后  tokenized_texts = [' '.join(jieba.cut(text)) for text in texts]
tokenizer = Tokenizer(char_level=True)
tokenizer.fit_on_texts(texts)  # 学习所有文本,构建词汇表

# 查看词汇表,可以看到词或字对应的索引数字
word_index = tokenizer.word_index
print("词汇表:", word_index)
# 输出可能是: {'果': 1, '苹': 2, '我': 3, '吃': 4, '香': 5, '蕉': 6, '爱': 7, '很': 8, '好': 9, '不': 10, '喜': 11, '欢': 12, '和': 13, '都': 14, '是': 15, '水': 16}

# 词汇表大小 = 唯一词的数量 + 1(+1是为了预留索引0给填充值),这边的值就是嵌入层Embedding中input_dim的数值
vocab_size = len(word_index) + 1
print("词汇表大小:", vocab_size)  # 输出: 17

# 将文本转换为数字序列
sequences = tokenizer.texts_to_sequences(texts)
print("数字序列:", sequences)
# 输出:[[3, 7, 4, 2, 1], [2, 1, 8, 9, 4], [3, 10, 11, 12, 5, 6], [5, 6, 13, 2, 1, 14, 15, 16, 1]]

所以 input_dim=18,因为我们的词汇表有17个唯一词 + 1个填充索引

2.Tokenizer作用和简单用法

Tokenizer会自动:

  • 统计所有文本中出现的词/字
  • 按出现频率从高到低排序
  • 分配编号(频率最高的词编号为1,次高的为2,以此类推)
python 复制代码
import numpy as np
from keras.models import Sequential
from keras.layers import Embedding
from keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences

# 1. 准备数据
texts = [
    "我爱吃苹果",
    "苹果很好吃", 
    "我不喜欢香蕉",
    "香蕉和苹果都是水果"
]

# 2. 创建词汇表
tokenizer = Tokenizer(char_level=True)
tokenizer.fit_on_texts(texts)
word_index = tokenizer.word_index
vocab_size = len(word_index) + 1  # +1 为填充符0

print("词汇表:", word_index)
print("词汇表大小:", vocab_size)

# 3. 文本转数字序列
sequences = tokenizer.texts_to_sequences(texts)
print("原始序列:", sequences)

# 4. 填充序列到相同长度(input_length=5)
padded_sequences = pad_sequences(sequences, maxlen=5, padding='post')
print("填充后序列:")
print(padded_sequences)

# 5. 创建Embedding层(input_dim根据vocab_size决定)
model = Sequential()
model.add(Embedding(
    input_dim=vocab_size,  # 这里是18
    output_dim=8,          # 每个词用8维向量表示,是一个超参数,需要根据经验和实验来确定,小词汇表(<1000):4-16维,一般8
    input_length=5         # 每个序列5个词,由最大长度maxlen决定,这边是9。统计所有序列长度:取一个合适的百分位数(如95%)
))

# 查看模型摘要
model.summary()

# 测试预测
sample_input = padded_sequences[:2]  # 取前两个样本
print("\n输入数据:", sample_input)
print("输入形状:", sample_input.shape)  # (2, 5)

output = model.predict(sample_input)
print("输出形状:", output.shape)        # (2, 5, 8)

输出结果:

相关推荐
StarPrayers.11 小时前
损失函数(Loss Function)、反向传播(Backward Propagation)和优化器(Optimizer)学习笔记
人工智能·笔记·深度学习·学习
IT_陈寒12 小时前
Vite 5个隐藏技巧让你的项目构建速度提升50%,第3个太香了!
前端·人工智能·后端
孤廖12 小时前
吃透 C++ 栈和队列:stack/queue/priority_queue 用法 + 模拟 + STL 标准实现对比
java·开发语言·数据结构·c++·人工智能·深度学习·算法
麦麦麦造12 小时前
有了 MCP,为什么Claude 还要推出 Skills?
人工智能·aigc·ai编程
jerryinwuhan12 小时前
利用舵机实现机器人行走
人工智能·机器人
武子康12 小时前
AI-调查研究-107-具身智能 强化学习与机器人训练数据格式解析:从状态-动作对到多模态轨迹标准
人工智能·深度学习·机器学习·ai·系统架构·机器人·具身智能
沫儿笙12 小时前
KUKA库卡焊接机器人二氧化碳节气
人工智能·机器人
insight^tkk12 小时前
【Docker】记录一次使用docker部署dify网段冲突的问题
运维·人工智能·docker·ai·容器
攻城狮7号12 小时前
AI+大数据时代:如何从架构到生态重构时序数据库的价值?
大数据·人工智能·时序数据库·apache iotdb·sql大模型
智能化咨询12 小时前
AI+大数据时代:时序数据库的生态重构与价值跃迁——从技术整合到行业落地
人工智能