字符级单词编码函数实现:编写接收单词列表并返回张量的函数
字符级单词独热编码实现方案
嘿,这就给你搞定这个字符级独热编码的函数!我用PyTorch来实现,完全符合你的需求:每个单词对应一个独立张量,张量里每一行是对应字符的独热向量——整行0填充,仅目标字母位置为1。
实现思路
- 先建立小写英文字母到索引的映射(a→0,b→1…z→25),如果需要支持大写、数字或特殊字符,直接扩展这个映射表就行。
- 遍历输入的每个单词,把每个字符转换成对应的索引。
- 用PyTorch生成全0张量,再把对应索引的位置设为1,得到独热编码张量。
- 把每个单词的张量收集起来返回。
完整代码
import torch def char_level_one_hot(word_list): # 构建小写英文字母到索引的映射表 char_to_idx = {chr(ord('a') + i): i for i in range(26)} vocab_size = len(char_to_idx) word_tensors = [] for word in word_list: # 统一转小写(如果需要区分大小写,去掉这行并扩展映射表) word_lower = word.lower() # 过滤掉不在字母表中的字符(比如标点、空格,需要的话可以加入映射) valid_indices = [char_to_idx[char] for char in word_lower if char in char_to_idx] # 初始化全0张量,形状为 (字符数, 词汇表大小) one_hot_tensor = torch.zeros(len(valid_indices), vocab_size) # 给对应字符的位置赋值为1 one_hot_tensor[torch.arange(len(valid_indices)), valid_indices] = 1 word_tensors.append(one_hot_tensor) return word_tensors
测试示例
比如你输入单词"abc",调用函数后就能得到你想要的结果:
# 测试代码 output_tensors = char_level_one_hot(["abc"]) print(output_tensors[0])
输出结果和你给出的完全一致:
tensor([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
扩展说明
- 支持大小写区分:如果需要区分大小写,去掉
word.lower(),并扩展映射表:char_to_idx = {chr(ord('a') + i): i for i in range(26)} | {chr(ord('A') + i): 26 + i for i in range(26)} - 批量统一长度:如果需要让所有单词的张量长度一致(比如补全到最长单词的长度),可以在函数开头计算最长单词长度,然后对短单词的张量进行padding:
max_len = max(len(word.lower()) for word in word_list) # 生成张量后添加padding padded_tensor = torch.cat([one_hot_tensor, torch.zeros(max_len - len(valid_indices), vocab_size)])
内容的提问来源于stack exchange,提问作者Mirs405
相关产品推荐
相关产品推荐

