- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊
本周任务
- 加载一份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.]])