第N1周:one-hot独热编码

一、OneHot独热编码原理

独热编码(One-Hot Encoding)是一种将分类数据转换为二进制向量的方法,其中每个类别对应一个唯一的二进制向量。在独热编码中,每个类别都由一个长度为n的向量表示,其中n是所有可能类别的数量。向量中的每个位置对应一个可能的类别,该位置上的值是1或0,表示该实例是否属于该类别。
例如,假设我们有四个类别:A、B、C和D。使用独热编码,我们可以将它们表示为:

  • A: [1, 0, 0, 0]
  • B: [0, 1, 0, 0]
  • C: [0, 0, 1, 0]
  • D: [0, 0, 0, 1]
    独热编码的优点包括:
  1. 处理分类数据:独热编码允许分类数据被模型处理,因为许多机器学习算法和神经网络都要求输入是数字。
  2. 无序性:独热编码假设类别之间没有顺序关系,每个类别都是相互独立的。
  3. 稀疏性:独热编码产生的向量通常是稀疏的,这意味着大多数位置的值都是0,只有少数几个位置的值是1。这种稀疏性在某些情况下可以减少模型复杂性。
  4. 兼容性:独热编码可以与多种机器学习算法兼容,包括逻辑回归、支持向量机、决策树、随机森林、神经网络等。
    在Python中,可以使用多种库来实现独热编码,例如pandasget_dummies函数或scikit-learnOneHotEncoder类。以下是使用scikit-learn进行独热编码的一个简单例子:
from sklearn.preprocessing import OneHotEncoder
# 创建一个独热编码器实例
encoder = OneHotEncoder()
# 假设我们有以下类别数据
data = [['A'], ['B'], ['C'], ['A'], ['B'], ['C'], ['D']]
# 对数据进行拟合和变换
encoded_data = encoder.fit_transform(data)
# 打印编码后的数据
print(encoded_data.toarray())

在这个例子中,encoded_data将是一个稀疏矩阵,如果想要查看完整的矩阵,可以使用toarray()方法将其转换为密集数组。

二、jieba库对中文句子的划分

jieba库是一个流行的中文分词工具,它使用了一种基于前缀词典的分词算法。以下是jieba进行句子划分的基本步骤:

  1. 词典匹配jieba首先使用一个预先构建的词典来查找句子中的词语。这个词典包含了大量的中文词语和它们的频率信息。jieba会尝试在句子中找到所有可能的词语匹配。
  2. 动态规划:对于句子中词典中没有的词语,jieba使用基于动态规划的最大概率分词算法来划分。这种方法考虑了词语的相邻关系,以及每个词语出现的概率,以找到最可能的分词结果。
  3. HMM模型:对于一些歧义较大的句子,jieba还会使用一个隐马尔可夫模型(HMM)来进一步确定分词。HMM模型可以帮助识别一些未知词语,并处理一些特殊情况,如中文中的姓氏和双音节词语。
  4. 双向扫描jieba还会进行双向扫描,即从前往后和从后往前分别进行分词,然后结合两者的结果,以得到最佳的划分。
  5. 用户词典jieba允许用户添加自定义的词典,这样可以在分词时考虑到特定领域的词汇或者新词。
  6. 分词模式jieba提供了几种不同的分词模式,包括精确模式(尝试将句子最精确地切开,适合文本分析)、全模式(把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义)和搜索引擎模式(在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎构建索引的分词)。
    通过这些步骤,jieba能够高效地对中文句子进行准确的分词,适用于各种自然语言处理任务。

三、案例

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

texts=['比较直观的编码方式是采用上面提到的字典序列。例如,对于一个有三个类别的问题,可以用1、2和3分别表示这三个类别。但是,这种编码方式存在一个问题,就是模型可能会错误地认为不同类别之间存在一些顺序或距离关系,而实际上这些关系可能是不存在的或者不具有实际意义的。',
'为了避免这种问题,引入了one-hot编码(也称独热编码)。one-hot编码的基本思想是将每个类别映射到一个向量,其中只有一个元素的值为1,其余元素的值为0。这样,每个类别之间就是相互独立的,不存在顺序或距离关系。例如,对于三个类别的情况,可以使用如下的one-hot编码:']

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)

在这里插入图片描述

这段代码的目的是将给定的文本数据集转换为独热编码(One-Hot Encoding)。下面是这段代码的内部运行逻辑的逐步解释:

  1. 构建词汇表
    • texts 是一个包含多个句子的列表。
    • 使用 set("".join(texts)) 将所有句子连接成一个长字符串,并去重得到所有独特的字符。
    • word_indexindex_word 是两个空字典,用于存储字符到整数的映射和整数到字符的映射。
    • 使用 enumerate 遍历所有独特的字符,为每个字符分配一个唯一的整数索引。
  2. 将文本转化为整数序列
    • sequences 是一个空列表,用于存储每个句子转换成的整数序列。
    • 遍历 texts 中的每个句子,对于句子中的每个字符,使用 word_index 字典找到对应的整数索引,并将这些索引组成一个列表,作为句子的整数序列。
  3. 获取词汇表大小
    • vocab_size 存储了词汇表的大小,即独特字符的数量。
  4. 将整数序列转化为独热编码
    • one_hot_results 是一个初始化为0的二维张量(Tensor),大小为 len(texts) 行(每个句子一行)和 vocab_size 列(每个字符一列)。
    • 遍历 sequences 中的每个整数序列,对于序列中的每个整数(代表一个字符),在 one_hot_results 的对应行和列的位置上标记为1。这样,每个句子的独热编码就形成了,其中每行只有一个1,其他都是0,1的位置对应于句子中字符的索引。
      最终,one_hot_results 包含了所有句子的独热编码。每个句子的独热编码是一个稀疏的向量,其中只有字符实际出现的位置被标记为1,其余位置都是0。这种表示方法使得每个字符都是相互独立的,没有任何顺序或距离关系,这正是独热编码的目的。

四、个人笔记

这次在导入库时候遇到了一些小问题.
在这里插入图片描述
在这里插入图片描述
这种情况下我选择cmd下安装然后把jupyter运行目录改到安装目录下就可以了
在这里插入图片描述
在jupyter中改一下这个路径就可以完美使用了。(注意斜杠的方向,如果安装了代码自动补全的会自动把斜杠补对,这个还挺好的)
在这里插入图片描述

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值