如何在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确实只接受整数输入,但我们可以先把字符转换成对应的整数索引,再喂给它生成独热向量,步骤很清晰:
- 提取文本里的所有唯一字符,创建字符到整数的映射表
- 把原文本转换成整数序列
- 用
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
相关产品推荐
相关产品推荐

