第N1周:one-hot编码案例

本周任务

  • 加载一份txt文件,使用字典序列方法与one-hot编码进行数字化处理。

One-hot编码概念

  • 对于一个三类别问题,普通的编码可以将其编码为1、2、3,但这很可能误认为三者间存在顺序关系
  • One-hot编码方式是将每个变量编码为只有0或1两个值,最后将其变为一个向量
  • 表现为[001]、[010]、[100]这种形式
  • 优点是能更好地处理离散数据、非连续型数值特征
  • 缺点是在处理文本时无法保留词与词的关联
  • 也会使计算代价变大

英文文本案例

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_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)

1. set(‘’.join(texts).split()): 将所有文本连接成一个字符串,然后按空格分割成单词列表。使用set去除重复的单词。
2. enumerate(…): 对去重后的单词列表进行枚举,为每个单词分配一个唯一的索引。
3. word_index: 存储单词到索引的映射。
4. index_word: 存储索引到单词的映射。
5. text.split(): 将每个句子按空格分割成单词列表。
6. word_index[word]: 查找每个单词在词汇表中的索引。
7. sequences: 存储每个句子对应的索引序列。
8. len(word_index)计算词汇表中的词汇数量。
9. torch.zeros(len(texts), vocab_size): 创建一个形状为 (文本数量, 词汇表大小) 的全零张量。
10. one_hot_results[i, seq] = 1: 遍历每个句子对应的索引序列,并将对应位置设置为1,从而实现One-Hot编码。

词汇表
{'I': 0, 'well,': 1, 'you!': 2, 'thank': 3, 'Goodbye.': 4, 'how': 5, 'Hello,': 6, 'you?': 7, 'are': 8, 'doing': 9, 'am': 10}

文本:
['Hello, how are you? ', 'I am doing well, thank you! ', 'Goodbye.']

序列:
[[6, 5, 8, 7], [0, 10, 9, 1, 3, 2], [4]]

one-hot编码:
tensor([[0., 0., 0., 0., 0., 1., 1., 1., 1., 0., 0.],
        [1., 1., 1., 1., 0., 0., 0., 0., 0., 1., 1.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.]])

中文文本案例

import torch
import torch.nn.functional as F

texts = ['你好,最近怎么样?', '我过的很好,谢谢!', 'K同学啊']

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] #不需要text.split(),因为中文没有空格

vocab_size = len(word_index)

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)
词汇表
{'?': 0, 'K': 1, '你': 2, '最': 3, '过': 4, '很': 5, '么': 6, '好': 7, '我': 8, ',': 9, '谢': 10, '的': 11, '近': 12, '同': 13, '怎': 14, '啊': 15, '样': 16, '!': 17, '学': 18}

文本:
['你好,最近怎么样?', '我过的很好,谢谢!', 'K同学啊']

序列:
[[2, 7, 9, 3, 12, 14, 6, 16, 0], [8, 4, 11, 5, 7, 9, 10, 10, 17], [1, 13, 18, 15]]

one-hot编码:
tensor([[1., 0., 1., 1., 0., 0., 1., 1., 0., 1., 0., 0., 1., 0., 1., 0., 1., 0.,
         0.],
        [0., 0., 0., 0., 1., 1., 0., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 1.,
         0.],
        [0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 1., 0., 0.,
         1.]])

结巴分词法

由于中文以词为主,单个字表达的含义很少,因此需要使用jieba库对一句话分词

import torch
import torch.nn.functional as F
import jieba

texts = ['你好,最近怎么样?', '我过的很好,谢谢!', '再见。']

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_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)
Building prefix dict from the default dictionary ...
Dumping model to file cache C:\Users\admin\AppData\Local\Temp\jieba.cache
Loading model cost 0.603 seconds.
Prefix dict has been built successfully.
词汇表
{'最近': 0, '很': 1, '怎么样': 2, '你好': 3, '我过': 4, '!': 5, '再见': 6, '?': 7, '谢谢': 8, '好': 9, ',': 10, '。': 11, '的': 12}

文本:
['你好,最近怎么样?', '我过的很好,谢谢!', '再见。']

序列:
[[3, 10, 0, 2, 7], [4, 12, 1, 9, 10, 8, 5], [6, 11]]

one-hot编码:
tensor([[1., 0., 1., 1., 0., 0., 0., 1., 0., 0., 1., 0., 0.],
        [0., 1., 0., 0., 1., 1., 0., 0., 1., 1., 1., 0., 1.],
        [0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 1., 0.]])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值