自然语言处理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)

输出结果:

相关推荐
Codebee6 小时前
能力中心 (Agent SkillCenter):开启AI技能管理新时代
人工智能
聆风吟º6 小时前
CANN runtime 全链路拆解:AI 异构计算运行时的任务管理与功能适配技术路径
人工智能·深度学习·神经网络·cann
uesowys7 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
AI_56787 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
User_芊芊君子7 小时前
CANN大模型推理加速引擎ascend-transformer-boost深度解析:毫秒级响应的Transformer优化方案
人工智能·深度学习·transformer
智驱力人工智能7 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
qq_160144877 小时前
亲测!2026年零基础学AI的入门干货,新手照做就能上手
人工智能
Howie Zphile7 小时前
全面预算管理难以落地的核心真相:“完美模型幻觉”的认知误区
人工智能·全面预算
人工不智能5777 小时前
拆解 BERT:Output 中的 Hidden States 到底藏了什么秘密?
人工智能·深度学习·bert
盟接之桥7 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造