- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊
热独编码
独热编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。
例如:
对于性别,只有男和女,使用one-hot来进行表示,有2个不同的选择,长度为2位,表示为:
男:10
女:01
对英文文本进行热独编码
import torch
import torch.nn.functional as F
texts = ['Hello, how are you?', 'I am doing well, thank you!', 'Goodbye.']
# 词汇表
word_index = {}
index_word = {}
for i, word in enumerate(set(" ".join(texts).split())):
word_index[word] = i
index_word[i] = word
# 将文本转化为整数序列
sequences = [[word_index[word]for word in text.split()] for text in texts]
# 获取词汇表大小
vocab_size = len(word_index)
# 将整数序列转化为one-hot编码
one_hot_results = torch.zeros(len(texts), vocab_size)
for i, seq in enumerate(sequences):
one_hot_results[i, seq] = 1
# 打印结果
print("词汇表:")
print(word_index)
print("\n文本:")
print(texts)
print("\n文本序列:")
print(sequences)
print("\nOne-Hot编码:")
print(one_hot_results)
词汇表:
{'am': 0, 'doing': 1, 'thank': 2, 'how': 3, 'I': 4, 'Hello,': 5, 'Goodbye.': 6, 'you!': 7, 'well,': 8, 'you?': 9, 'are': 10}
文本:
['Hello, how are you?', 'I am doing well, thank you!', 'Goodbye.']
文本序列:
[[5, 3, 10, 9], [4, 0, 1, 8, 2, 7], [6]]
One-Hot编码:
tensor([[0., 0., 0., 1., 0., 1., 0., 0., 0., 1., 1.],
[1., 1., 1., 0., 1., 0., 0., 1., 1., 0., 0.],
[0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.]])
对中文文本进行热独编码
import torch
import torch.nn.functional as F
# 文本
texts = ['你好,最近怎么样? ', '我过得很好,谢谢!', '今天很高兴。']
# 词汇表
word_index = {}
index_word = {}
for i, word in enumerate(set(" ".join(texts))):
word_index[word] = i
index_word[i] = word
# 将文本转化为整数序列
sequences = [[word_index[word] for word in text] for text in texts]
vocab_size = len(word_index)
texts_len = len(texts)
# 将整数序列转化为one-hot编码
one_hot_results = torch.zeros(texts_len, vocab_size)
for i, seq in enumerate(sequences):
one_hot_results[i, seq] = 1
# 打印结果
print("词汇表:")
print(word_index)
print("\n文本:")
print(texts)
print("\n文本序列:")
print(sequences)
print("\nOne-Hot编码:")
print(one_hot_results)
词汇表:
{'好': 0, '我': 1, '样': 2, '?': 3, '过': 4, '兴': 5, '你': 6, '近': 7, ' ': 8, '么': 9, ',': 10, '怎': 11, '天': 12, '。': 13, '谢': 14, '最': 15, '!': 16, '高': 17, '今': 18, '很': 19, '得': 20}
文本:
['你好,最近怎么样? ', '我过得很好,谢谢!', '今天很高兴。']
文本序列:
[[6, 0, 10, 15, 7, 11, 9, 2, 3, 8], [1, 4, 20, 19, 0, 10, 14, 14, 16], [18, 12, 19, 17, 5, 13]]
One-Hot编码:
tensor([[1., 0., 1., 1., 0., 0., 1., 1., 1., 1., 1., 1., 0., 0., 0., 1., 0., 0.,
0., 0., 0.],
[1., 1., 0., 0., 1., 0., 0., 0., 0., 0., 1., 0., 0., 0., 1., 0., 1., 0.,
0., 1., 1.],
[0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 1., 1., 0., 0., 0., 1.,
1., 1., 0.]])
读取文件进行识别
任务文件.txt
比较直观的编码方式是采用上面提到的字典序列。 例如,对于一个有三个类别的问题,可以用1、2和3分别表示这三个类别。 但是,这种编码方式存在一个问题,就是模型可能会错误地认为不同类别之间存在一些顺序或距离关系,而实际上这些关系可能是不存在的或者不具有实际意义的。 为了避免这种问题,引入了one-hot编码(也称独热编码)。 one-hot编码的基本思想是将每个类别映射到一个向量,其中只有一个元素的值为1,其余元素的值为0。 这样,每个类别之间就是相互独立的,不存在顺序或距离关系。
import torch
import torch.nn.functional as F
import jieba
# 文本
with open('./data/任务文件.txt', "r", encoding="utf-8") as file:
content = file.read()
texts = content.split(' ')
# 使用结巴分词进行分词
tokenized_texts = [list(jieba.cut(text)) for text in texts]
# 构建词汇表
word_index = {}
index_word = {}
for i, word in enumerate(set([word for text in tokenized_texts for word in text])):
word_index[word] = i
index_word[i] = word
# 将文本转化为整数序列
sequences = [[word_index[word] for word in text] for text in tokenized_texts]
# 获取词汇表大小
vocab_size = len(word_index)
# 将整数序列转化为one-hot编码
one_hot_results = torch.zeros(len(texts), vocab_size)
for i, seq in enumerate(sequences):
one_hot_results[i, seq] = 1
# 打印结果
print("词汇表:")
print(word_index)
print("\n文本:")
print(texts)
print("\n分词结果")
print(tokenized_texts)
print("\n文本序列:")
print(sequences)
print("\nOne-Hot编码:")
print(one_hot_results)
词汇表:
{'而': 0, ')': 1, '但是': 2, '三个': 3, '3': 4, '2': 5, '序列': 6, 'hot': 7, '可以': 8, '思想': 9, '对于': 10, '采用': 11, '距离': 12, '这些': 13, '不同': 14, '相互': 15, '引入': 16, '直观': 17, '独立': 18, '实际上': 19, '提到': 20, '类别': 21, '一些': 22, '避免': 23, '基本': 24, '独热': 25, '编码方式': 26, '顺序': 27, '向量': 28, '可能': 29, '之间': 30, '其中': 31, '实际意义': 32, '也': 33, '这': 34, '有': 35, '-': 36, '映射': 37, '存在': 38, '元素': 39, '就是': 40, '只有': 41, '问题': 42, '具有': 43, '字典': 44, '和': 45, '不': 46, '这样': 47, '这种': 48, '错误': 49, '用': 50, '的': 51, '模型': 52, '每个': 53, '比较': 54, '(': 55, '地': 56, '为了': 57, ',': 58, '。': 59, '分别': 60, '是': 61, '其余': 62, 'one': 63, '了': 64, '到': 65, '或': 66, '值': 67, '一个': 68, '表示': 69, '或者': 70, '将': 71, '0': 72, '、': 73, '例如': 74, '1': 75, '认为': 76, '称': 77, '上面': 78, '为': 79, '会': 80, '关系': 81, '编码': 82}
文本:
['比较直观的编码方式是采用上面提到的字典序列。', '例如,对于一个有三个类别的问题,可以用1、2和3分别表示这三个类别。', '但是,这种编码方式存在一个问题,就是模型可能会错误地认为不同类别之间存在一些顺序或距离关系,而实际上这些关系可能是不存在的或者不具有实际意义的。', '为了避免这种问题,引入了one-hot编码(也称独热编码)。', 'one-hot编码的基本思想是将每个类别映射到一个向量,其中只有一个元素的值为1,其余元素的值为0。', '这样,每个类别之间就是相互独立的,不存在顺序或距离关系。']
分词结果
[['比较', '直观', '的', '编码方式', '是', '采用', '上面', '提到', '的', '字典', '序列', '。'], ['例如', ',', '对于', '一个', '有', '三个', '类别', '的', '问题', ',', '可以', '用', '1', '、', '2', '和', '3', '分别', '表示', '这', '三个', '类别', '。'], ['但是', ',', '这种', '编码方式', '存在', '一个', '问题', ',', '就是', '模型', '可能', '会', '错误', '地', '认为', '不同', '类别', '之间', '存在', '一些', '顺序', '或', '距离', '关系', ',', '而', '实际上', '这些', '关系', '可能', '是', '不', '存在', '的', '或者', '不', '具有', '实际意义', '的', '。'], ['为了', '避免', '这种', '问题', ',', '引入', '了', 'one', '-', 'hot', '编码', '(', '也', '称', '独热', '编码', ')', '。'], ['one', '-', 'hot', '编码', '的', '基本', '思想', '是', '将', '每个', '类别', '映射', '到', '一个', '向量', ',', '其中', '只有', '一个', '元素', '的', '值', '为', '1', ',', '其余', '元素', '的', '值', '为', '0', '。'], ['这样', ',', '每个', '类别', '之间', '就是', '相互', '独立', '的', ',', '不', '存在', '顺序', '或', '距离', '关系', '。']]
文本序列:
[[54, 17, 51, 26, 61, 11, 78, 20, 51, 44, 6, 59], [74, 58, 10, 68, 35, 3, 21, 51, 42, 58, 8, 50, 75, 73, 5, 45, 4, 60, 69, 34, 3, 21, 59], [2, 58, 48, 26, 38, 68, 42, 58, 40, 52, 29, 80, 49, 56, 76, 14, 21, 30, 38, 22, 27, 66, 12, 81, 58, 0, 19, 13, 81, 29, 61, 46, 38, 51, 70, 46, 43, 32, 51, 59], [57, 23, 48, 42, 58, 16, 64, 63, 36, 7, 82, 55, 33, 77, 25, 82, 1, 59], [63, 36, 7, 82, 51, 24, 9, 61, 71, 53, 21, 37, 65, 68, 28, 58, 31, 41, 68, 39, 51, 67, 79, 75, 58, 62, 39, 51, 67, 79, 72, 59], [47, 58, 53, 21, 30, 40, 15, 18, 51, 58, 46, 38, 27, 66, 12, 81, 59]]
One-Hot编码:
tensor([[0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 1.,
0., 0., 1., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 1., 0., 0.,
1., 0., 0., 0., 0., 1., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
[0., 0., 0., 1., 1., 1., 0., 0., 1., 0., 1., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1.,
0., 0., 0., 0., 0., 0., 1., 0., 0., 1., 0., 0., 0., 0., 1., 1., 0., 0.,
0., 0., 0., 0., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0., 0.,
0., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0.],
[1., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 0., 0., 0.,
0., 1., 0., 1., 1., 0., 0., 0., 1., 1., 0., 1., 1., 0., 1., 0., 0., 0.,
0., 0., 1., 0., 1., 0., 1., 1., 0., 0., 1., 0., 1., 1., 0., 1., 1., 0.,
0., 0., 1., 0., 1., 1., 0., 1., 0., 0., 0., 0., 1., 0., 1., 0., 1., 0.,
0., 0., 0., 0., 1., 0., 0., 0., 1., 1., 0.],
[0., 1., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.,
0., 0., 0., 0., 0., 1., 0., 1., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.,
1., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.,
0., 1., 0., 1., 1., 1., 0., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 1.],
[0., 0., 0., 0., 0., 0., 0., 1., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 1., 0., 0., 1., 0., 0., 0., 1., 0., 0., 1., 0., 0., 0., 0.,
1., 1., 0., 1., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 1.,
0., 0., 0., 0., 1., 1., 0., 1., 1., 1., 0., 1., 0., 1., 1., 0., 0., 1.,
1., 0., 0., 1., 0., 0., 0., 1., 0., 0., 1.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 1., 0., 0.,
1., 0., 0., 1., 0., 0., 0., 0., 0., 1., 0., 0., 1., 0., 0., 0., 0., 0.,
0., 0., 1., 0., 1., 0., 0., 0., 0., 0., 1., 1., 0., 0., 0., 1., 0., 1.,
0., 0., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.]])