You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TensorFlow或Keras中对文本字符进行独热编码?

字符级独热编码在TensorFlow/Keras中的实现

当然可以在TensorFlow/Keras里实现文本字符的独热编码,咱们先把你遇到的几个疑问拆解清楚,再一步步给出解决方案:

先澄清你遇到的tf.keras.preprocessing.text.one_hot问题

你说得没错,这个函数确实是针对词级别的编码,不是字符级的。它的作用是把每个单词映射成一个整数索引(注意:不是直接输出独热向量),而且因为它用哈希映射来生成索引,当你设置的n(即最大索引值)太小的时候,很容易出现哈希冲突——比如你测试的text = "ab bba bbd",三个词分别是ab、bba、bbd,当n=3时,bba和bbd被哈希到了同一个索引2,所以输出[1,2,2]。这个函数从设计上就不是用来做字符独热编码的,所以你觉得它“表现异常”是因为用错了场景~

实现字符级独热编码的两种方法

方法1:手动映射字符到整数 + tf.one_hot

tf.one_hot确实只接受整数输入,但我们可以先把字符转换成对应的整数索引,再喂给它生成独热向量,步骤很清晰:

  1. 提取文本里的所有唯一字符,创建字符到整数的映射表
  2. 把原文本转换成整数序列
  3. 用tf.one_hot生成独热向量

示例代码:

import tensorflow as tf

text = "ab bba bbd"
# 提取所有唯一字符(别忘了空格)并排序
unique_chars = sorted(list(set(text)))
# 创建字符到整数的映射
char_to_idx = {char: idx for idx, char in enumerate(unique_chars)}
# 将文本转为整数序列
int_sequence = [char_to_idx[char] for char in text]
# 生成独热编码,depth是唯一字符的总数
one_hot_result = tf.one_hot(int_sequence, depth=len(unique_chars))

# 打印结果
print(one_hot_result.numpy())

比如这里unique_chars是[' ', 'a', 'b', 'd'],每个字符对应0-3的索引,'a'就会被转成[0, 1, 0, 0]这样的独热向量。

方法2:用Keras Tokenizer做字符级编码

Keras的Tokenizer有个char_level参数,设为True就能切换到字符级模式,之后我们可以先转成整数序列,再用to_categorical生成独热向量:

from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.utils import to_categorical

text = "ab bba bbd"
# 初始化字符级Tokenizer
tokenizer = Tokenizer(char_level=True)
# 用目标文本训练Tokenizer,建立字符映射
tokenizer.fit_on_texts([text])
# 将文本转为整数序列
int_sequence = tokenizer.texts_to_sequences([text])[0]
# 生成独热编码,注意Tokenizer从1开始索引,所以num_classes要+1
one_hot_result = to_categorical(int_sequence, num_classes=len(tokenizer.word_index)+1)

print(one_hot_result)

总结一下

  • tf.one_hot是整数转独热的工具函数,需要先把字符转成整数索引才能用;
  • tf.keras.preprocessing.text.one_hot是词级整数编码工具,不是用来生成独热向量的,也不适合字符级任务;
  • 上面两种方法都能轻松实现字符级的独热编码,根据你的习惯选就行~

内容的提问来源于stack exchange,提问作者user3921232

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:25:30