【nlp入门实战】one-hot热独编码实现

热独编码

独热编码,又称一位有效编码,其方法是使用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.]])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值