当前位置: 首页 > article >正文

365天深度学习训练营:第N1周:one-hot编码案例

  • 🍨 本文为🔗365天深度学习训练营中的学习记录博客
  • 🍖 原作者:K同学啊

1. one-hot编码概念

自然语言处理,词向量是什么

文字对于计算机知识一个个符号,计算机无法理解含义,所以需要将文本数字化

最早期的文本数字化方法是采用字典序列法,例如对于一个三个类别的问题,可以用123来表示。但存在问题即模型会错误认为不同类别间存在一些顺序或距离关系,但实际上这些关系是不存在或无意义的。

为了避免这个问题进而引入one-hot编码。原理是把每个类别映射到一个向量,其中只有一个元素的值为1,其余的值为0。进而使得类别之间是互相独立而不存在顺序或距离关系:例如类别1是[1,0,0],类别2是[0,1,0],类别3是[0,0,1]。

例如:

 1 John likes to watch movies. Mary likes too
 2 John also likes to watch football games.


以上两句可以构造一个词典:

["John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also": 6, "football": 7, "games": 8, "Mary": 9, "too": 10]


one-hot可表示为:

 1 John: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
 2 likes: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
 3 . . . . . . .等等,以此类推。

优点

One-hot编码可以同时处理分类数据和数值型数据 - 比如在预测房价时,既能处理"区域"(东区/西区)这样的分类变量,也能处理"面积"(89㎡)这样的连续数值。

缺点

1. 文本表征有缺陷:它是一个词袋模型,即不考虑词与词之间的顺序问题,假设互相独立,但是现实中词与词之间是有关联的

2. 因为one-hot表示是维度是整个词汇表,只有一个元素为1,其他元素都为0。因此特征是离散稀疏的,导致计算量巨大

2. 英文文本案例

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())): # 将所有元素按空格拼接,然后分割成单词列表,再去重 ['Hello,', 'how', 'are', 'you?']
    word_index[word] = i
    index_word[i] = word

# word_index: {'Hello,': 0, 'how': 1, 'are': 2, 'you?': 3, ...}
# index_word: {0: 'Hello,', 1: 'how', 2: 'are', 3: 'you?', ...}

# 将文本转化为整数序列
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 # 将文本序列sequence中每个元素的值作为列索引,将对应位置设为1

# 打印结果
print("词汇表:")
print(word_index)
print("\n文本:")
print(texts)
print("\n文本序列:")
print(sequences)
print("\nOne-Hot编码:")
print(one_hot_results)

3. 中文文本案例

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)

# 将整数序列转化为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)

 

这样划分是以字为基本单位,但是词语被拆开会失去原有的意思,因此用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编码
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)

 

4. 学习个人总结 

在这次学习one-hot编码的过程中,我获得了非常宝贵的经验和见解。通过实践,我深刻理解了为什么在深度学习中文本数字化如此重要,以及one-hot编码的核心原理和应用场景。

最初接触文本数字化时,我曾天真地认为直接用123这样的数字序列来表示不同类别就足够了。但通过实践,我意识到这种简单的数字化方式会让模型产生错误的理解,因为它会认为不同类别之间存在某种数值上的关系。比如,模型可能会误以为类别2比类别1"大"或"重要"。这让我明白了为什么要使用one-hot编码这种看似"浪费"空间的表示方法。

在实现英文和中文文本的one-hot编码过程中,我遇到了一个重要的思考点:中文文本是否应该以字为基本单位进行编码。通过实验,我发现直接以字为单位进行编码会导致词语的语义信息丢失。这促使我思考使用结巴分词这样的工具来保持词语的完整性。这个经验让我明白,在处理不同语言时,需要考虑其独特的语言特点,选择合适的预处理方法。

虽然one-hot编码有其局限性,比如不能表达词序关系,而且在大规模词汇表情况下会产生稀疏向量,但这些"缺点"反而加深了我对后续更先进的词向量表示方法(如word2vec, BERT)的理解。我认识到,正是因为认识到了one-hot编码的这些限制,才推动了更先进表示方法的发展。


http://www.kler.cn/a/466381.html

相关文章:

  • 小结:DNS,HTTP,SMTP,IMAP,FTP,Telnet,TCP,ARP,ICMP
  • Unity热更文件比较工具类
  • 2025年Stable Diffusion安装教程(超详细)
  • Redis数据库笔记—— Hash(哈希)的扩容机制(rehash)
  • Flutter 实现 列表滑动过程控件停靠效果 学习
  • python对mongodb的增删查改
  • 【Unity3D】LOD Group 多细节层次(CrossFade淡出淡入效果)
  • java: JDK isn‘t specified for module ‘product-service‘问题解决
  • 大数据-269 实时数仓 - DIM DW ADS 层处理 Scala实现将数据写出HBase等
  • 阅读线程池源码中遇到的retry:
  • 密码学精简版
  • 打靶记录24——Presidential
  • 【JavaScript】变量-常量-数据类型-类型转换
  • 如何使用axios实现并发请求
  • 【漫话机器学习系列】033.决策树回归(Decision Tree Regression)
  • 移动构造函数详解
  • MySQL使用通用二进制文件安装到Unix/Linux
  • 32单片机从入门到精通之开发环境——调试工具(七)
  • nodeJS下npm和yarn的关系和区别详解
  • 嵌入式应用软件开发中C语言方向面试题
  • ClickHouse副本搭建
  • 关于AI面试系统2025年趋势评估!
  • 【Multisim用74ls92和90做六十进制】2022-6-12
  • dns网址和ip是一一对应的吗?
  • AMP 混合精度训练中的动态缩放机制: grad_scaler.py函数解析( torch._amp_update_scale_)
  • Android 网络判断