本文为[365天深度学习训练营学习记录博客\n 参考文章:365天深度学习训练营\n 原作者:[K同学啊 | 接辅导、项目定制]\n 文章来源:[K同学的学习圈子](https://www.yuque.com/mingtian-fkmxf/zxwb45)
独热编码(One-Hot Encoding)是一种处理类别型数据的常用编码方式。在机器学习中,经常需要处理非数字数据,例如颜色、国家名、产品类别等。由于大多数算法都是基于数学运算的,这就需要将这些非数字的类别数据转换为数值形式。
独热编码的基本思想是将一个类别型变量转换为一个或多个二进制特征来表示。这些特征的数量通常与原始数据中的类别数量相等。每一个类别都由一个特征向量表示,这个向量中只有一个元素是1,表示当前的类别,其余元素都是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]
# 获取词汇表大小
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
# 准备打印结果
results = {
"词汇表": word_index,
"文本": texts,
"文本序列": sequences,
"One-Hot编码": one_hot_results
}
print(results)
import jieba
import torch
# 示例中文文本
texts = ['你好,最近怎么样?', '我过得很好,谢谢!', 'K同学啊']
# 使用jieba进行分词
texts_seg = [" ".join(jieba.cut(text)) for text in texts]
# 构建词汇表
word_index = {}
index_word = {}
for text in texts_seg:
for word in text.split():
if word not in word_index:
index = len(word_index)
word_index[word] = index
index_word[index] = word
# 将分词后的文本转化为整数序列
sequences = [[word_index[word] for word in text.split()] for text in texts_seg]
# 获取词汇表大小
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_seg)
print("\n文本序列:")
print(sequences)
print("\nOne-Hot编码:")
print(one_hot_results)
使用jieba
进行分词与不使用的区别在于处理的文本单元的粒度。中文文本不像英文,单词之间没有明显的空格分隔,因此需要特殊的处理来识别文本中的单词(词语)边界。
不使用jieba
分词:
使用jieba
分词:
jieba
会将文本中的句子分割成词语,这些词语通常包含更丰富的语义信息。