【NLP学习记录】One-Hot编码

1. One-Hot编码概念

one-hot编码的基本思想是将每个类别映射到一个向量,其中只有一个元素的值为1,其余元素的值为0。这样,每个类别之间相互独立,不存在顺序或距离关系。

举例:对于三个类别的情况,可以使用如下的one-hot编码:

  • 类别1:[1,0,0]
  • 类别2:[0,1,0]
  • 类别3:[0,0,1]

在深度学习中,神经网络的输入层通常使用one-hot编码来表示分类变量。这种编码方式可避免不必要的关系假设,还能清晰的输入表示,有助于模型的学习和泛化。

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())):word_index[word] = iindex_word[i] = word#将文本转化为整数序列
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#打印结果
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 = ['你好,最近怎么样? ', '我过得很好,谢谢!', 'K同学啊']#构建词汇表
word_index = {}
index_word = {}
for i, word in enumerate(set("".join(texts))):word_index[word] = iindex_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分词工具对句子进行划分。

使用结巴分词(jieba)进行中文文本的分词处理,然后将分词后的结果转化为one-hot编码。首先,确保你已经安装了结巴分词库:pip install 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] = iindex_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(sequences)
print("\nOne-Hot编码:")
print(one_hot_results)    

运行结果:
在这里插入图片描述

4. 任务

  • 任务要求:加载one-hot task.txt文件,并使用one-hot编码进行处理
import torch
import jieba
#获取文件路径
file_name = "D:\\Personal Data\\Learning Data\\DL Learning Data\\one-hot task.txt"
# 从文本中读取文本行
with open(file_name,"r",encoding = "utf-8") as file:context = file.read()sentences = context.split()
# 使用jieba逐句分词
tokenized_texts = [list(jieba.lcut(sentence)) for sentence in sentences]
#构建词汇表
word_index = {}
index_word = {}
for i, word in enumerate(set([word for text in tokenized_texts for word in text])):word_index[word] = iindex_word[i] = wordsequences = [[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(sentences), vocab_size)
for i,seq in enumerate(sequences):one_hot_results[i,seq] = 1#打印核对结果
print("====词汇表:====\n", word_index)
print("====文本:====\n", sentences)
print("====分词结果:====\n", tokenized_texts)
print("====文本序列:====\n",sequences)
print("====One-Hot编码:====\n", one_hot_results)

运行结果:

====词汇表:===={'到': 0, '是': 1, 'hot': 2, '三个': 3, '情况': 4, '为': 5, '这些': 6, '不': 7, '值': 8, ':': 9, '可能': 10, '对于': 11, ')': 12, '独立': 13, '具有': 14, '独热': 15, '将': 16, '称': 17, '距离': 18, '和': 19, '编码方式': 20, '可以': 21, '-': 22, '一个': 23, '错误': 24, '思想': 25, '只有': 26, '3': 27, '地': 28, '例如': 29, '使用': 30, '提到': 31, '这': 32, '用': 33, '1': 34, '分别': 35, '为了': 36, '其余': 37, '一些': 38, '避免': 39, '基本': 40, '有': 41, '这种': 42, '关系': 43, '问题': 44, '也': 45, '之间': 46, ',': 47, '每个': 48, '序列': 49, '元素': 50, '(': 51, '采用': 52, '。': 53, '或': 54, '2': 55, '上面': 56, '模型': 57, '的': 58, 'one': 59, '相互': 60, '字典': 61, '顺序': 62, '而': 63, '实际上': 64, '了': 65, '表示': 66, '存在': 67, '、': 68, '或者': 69, '会': 70, '但是': 71, '引入': 72, '比较': 73, '其中': 74, '实际意义': 75, '就是': 76, '认为': 77, '不同': 78, '向量': 79, '编码': 80, '直观': 81, '类别': 82, '这样': 83, '如下': 84, '映射': 85, '0': 86}
====文本:====['比较直观的编码方式是采用上面提到的字典序列。例如,对于一个有三个类别的问题,可以用1、2和3分别表示这三个类别。但是,这种编码方式存在一个问题,就是模型可能会错误地认为不同类别之间存在一些顺序或距离关系,而实际上这些关系可能是不存在的或者不具有实际意义的。', '为了避免这种问题,引入了one-hot编码(也称独热编码)。one-hot编码的基本思想是将每个类别映射到一个向量,其中只有一个元素的值为1,其余元素的值为0。这样,每个类别之间就是相互独立的,不存在顺序或距离关系。例如,对于三个类别的情况,可以使用如下的one-hot编码:']
====分词结果:====[['比较', '直观', '的', '编码方式', '是', '采用', '上面', '提到', '的', '字典', '序列', '。', '例如', ',', '对于', '一个', '有', '三个', '类别', '的', '问题', ',', '可以', '用', '1', '、', '2', '和', '3', '分别', '表示', '这', '三个', '类别', '。', '但是', ',', '这种', '编码方式', '存在', '一个', '问题', ',', '就是', '模型', '可能', '会', '错误', '地', '认为', '不同', '类别', '之间', '存在', '一些', '顺序', '或', '距离', '关系', ',', '而', '实际上', '这些', '关系', '可能', '是', '不', '存在', '的', '或者', '不', '具有', '实际意义', '的', '。'], ['为了', '避免', '这种', '问题', ',', '引入', '了', 'one', '-', 'hot', '编码', '(', '也', '称', '独热', '编码', ')', '。', 'one', '-', 'hot', '编码', '的', '基本', '思想', '是', '将', '每个', '类别', '映射', '到', '一个', '向量', ',', '其中', '只有', '一个', '元素', '的', '值', '为', '1', ',', '其余', '元素', '的', '值', '为', '0', '。', '这样', ',', '每个', '类别', '之间', '就是', '相互', '独立', '的', ',', '不', '存在', '顺序', '或', '距离', '关系', '。', '例如', ',', '对于', '三个', '类别', '的', '情况', ',', '可以', '使用', '如下', '的', 'one', '-', 'hot', '编码', ':']]
====文本序列:====[[73, 81, 58, 20, 1, 52, 56, 31, 58, 61, 49, 53, 29, 47, 11, 23, 41, 3, 82, 58, 44, 47, 21, 33, 34, 68, 55, 19, 27, 35, 66, 32, 3, 82, 53, 71, 47, 42, 20, 67, 23, 44, 47, 76, 57, 10, 70, 24, 28, 77, 78, 82, 46, 67, 38, 62, 54, 18, 43, 47, 63, 64, 6, 43, 10, 1, 7, 67, 58, 69, 7, 14, 75, 58, 53], [36, 39, 42, 44, 47, 72, 65, 59, 22, 2, 80, 51, 45, 17, 15, 80, 12, 53, 59, 22, 2, 80, 58, 40, 25, 1, 16, 48, 82, 85, 0, 23, 79, 47, 74, 26, 23, 50, 58, 8, 5, 34, 47, 37, 50, 58, 8, 5, 86, 53, 83, 47, 48, 82, 46, 76, 60, 13, 58, 47, 7, 67, 62, 54, 18, 43, 53, 29, 47, 11, 3, 82, 58, 4, 47, 21, 30, 84, 58, 59, 22, 2, 80, 9]]
====One-Hot编码:====tensor([[0., 1., 0., 1., 0., 0., 1., 1., 0., 0., 1., 1., 0., 0., 1., 0., 0., 0.,1., 1., 1., 1., 0., 1., 1., 0., 0., 1., 1., 1., 0., 1., 1., 1., 1., 1.,0., 0., 1., 0., 0., 1., 1., 1., 1., 0., 1., 1., 0., 1., 0., 0., 1., 1.,1., 1., 1., 1., 1., 0., 0., 1., 1., 1., 1., 0., 1., 1., 1., 1., 1., 1.,0., 1., 0., 1., 1., 1., 1., 0., 0., 1., 1., 0., 0., 0., 0.],[1., 1., 1., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1., 1.,1., 0., 0., 1., 1., 1., 0., 1., 1., 0., 0., 1., 1., 0., 0., 0., 1., 0.,1., 1., 0., 1., 1., 0., 1., 1., 1., 1., 1., 1., 1., 0., 1., 1., 0., 1.,1., 0., 0., 0., 1., 1., 1., 0., 1., 0., 0., 1., 0., 1., 0., 0., 0., 0.,1., 0., 1., 0., 1., 0., 0., 1., 1., 0., 1., 1., 1., 1., 1.]])

5. 总结

  • 文本的基本处理流程:1. 将文本分割为句子 2. 将句子分割为词 3. 对词进行编码
  • one-hot编码的适用场景:特征之间相互独立,且特征数量较少

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/755166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于协同过滤的毕业生就业推荐系统python+django+flask

功能: 管理员:主页、个人中心、求职者管理、企业管理、招聘信息管理、就业信息管理、面试邀请管理、就业签约管理、投递的简历管理、系统管理 企业:主页、个人中心、求职者管理、招聘信息管理(可看见所有的招聘信息。发布招聘信息…

三 C#插入排序算法

简介 插入排序算法是一种简单、直观的排序算法,其原理是将一个待排序的元素逐个地插入到已经排好序的部分中。 插入排序实现原理 插入排序算法是一种简单、直观的排序算法,其原理是将一个待排序的元素逐个地插入到已经排好序的部分中。 具体实现步骤…

【iOS】Blocks

文章目录 前言一、什么是Blocks二、Blocks模式1.Block语法2.Block类型变量3.截获自动变量值4.__block说明符5.截获的自动变量 三、Blocks的实现1.Block的实质__main_block_impl_0Block对象的实现结构体初始化 2.截获自动变量值3.__block说明符4.Block存储域5.__block变量存储域…

数据结构——lesson10排序之插入排序

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

python之数据类型转换

基本数据类型转换 Python 中基本数据类型转换的方法有下面几个。 方法说明int(x [,base ])将x转换为一个整数float(x )将x转换到一个浮点数complex(real [,imag ])创建一个复数str(x )将对象 x 转换为字符串repr(x )将对象 x 转换为表达式字符串eval(str )用来计算在字符串中…

Linux的背景介绍

1.Linux的发展史 Linux,一般指GNU/Linux(单独的Linux内核并不可直接使用,一般搭配GNU套件,故得此称呼),是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯本纳第克特托瓦兹&#xff08…

【源码阅读】evmⅠ

代码位置如下: 参考link 以太坊中有一个很重要的用途是智能合约,而其中evm模块是实现了执行智能合约的虚拟机。evm可以逐条解析执行智能合约的指令。 evm中的核心对象是EVM,代表一个以太坊虚拟机。其内部主要依赖:解释器Interore…

蓝桥杯历年真题Java b组 省赛 2018年第九届 第几天

一、题目一 第几天 2000年的1月1日,是那一年的第1天。 那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数,不要填写任何多余内容。 分析: 将每个月的天数加起来&#xff0c…

2024年敏捷产品负责人CSPO认证培训

课程名称:Scrum Product Owner CSPO产品负责人认证 课程类型:经理级 课程简介: Scrum Product Owner产品负责人在Scrum产品开发当中扮演“舵手”的角色,他决定产品的愿景、路线图以及投资回报,他需要回答为什么做&am…

Python——字典

一、字典特性介绍 字典在 Python 中极为重要,是属于映射类型的数据结构。 字典有⼀对⼉⼤括号组成 {} , 字典内的元素都是成对⼉出现的 {"a":1} , 他们⽤英⽂的冒号( : )隔开, 左边叫做键(key),右边的叫值(value), 通常叫做键值对⼉。 每个元素⽤英⽂的逗…

【Python循环4/5】跳出循环的办法

目录 导入 break 具体用法 在for循环中的运用 在while循环中的运用 continue 具体用法 区别 总结 导入 前几天的博文里,我们学习了for循环和while循环。 无论是for循环还是while循环,默认的终止条件都是边界条件。在触发边界条件之前&am…

生成微信小程序二维码

首页 -> 统计 可以通过上面二个地方配置,生成小程序的二维码,并且在推广分析里,有详细的分析数据,

国务院大动作!2024年深入推广「项目管理国标」,行业将迎新风向!

职场竞争激烈,项目管理专业人才在各个行业中的作用越来越凸显出来。在23年之前,我国关于通用项目管理人才的培养更多依赖于国外的PMP认证,缺少自主的认证评价标准和体系。 为了弥补这一空缺,基于国内的项目管理发展需求&#xff…

基于单片机的智能台灯设计1.42

摘 要 社会在发展,时代在进步,人们对生活质量需求更加膨胀,是否拥有高科技技术也最终决定着产品是否可以满足人们的欲望,只有性价比更高,才可以得到更好的青睐。现在的电子产品愈来愈多,龙蛇混杂&#xff…

2.1(TCP)

TCP—传输控制协议 是一种面向连接的可靠传输协议。可靠、有序、无丢弃和不重复。 特点: TCP是面向连接(虚连接)的传输层协议每一条TCP连接有且只能有两个端点。可靠、有序、无丢弃和不重复。TCP协议提供全双工通讯。 发送缓存 存放发送方…

达科为生物领航,国产高端试剂“达优®”蓄势待发

在生物科技领域,每一次技术的突破都意味着行业前进的一大步。在即将盛大开幕的双博会上,深圳市达科为生物工程有限公司将携其国产高端试剂品牌“达优”闪亮登场,向世界展示中国生物科技的最新成果。而在这背后,是达科为生物多年来…

Docker【docker使用】

文章目录 前言一、概念二、常用方法1.镜像2.容器 三、镜像与镜像的关系,以及镜像构建和管理 前言 上一篇文章讲了docker的安装,本片文章我们来聊聊docker的一些常用操作。以及镜像、容器之间的关系 一、概念 docker三大核心概念:镜像 Imag…

力扣大厂热门面试算法题 43-45

43. 字符串相乘,44. 通配符匹配,45. 跳跃游戏 II,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.18 可通过leetcode所有测试用例。 目录 43. 字符串相乘 解题思路 完整代码 Python Java 44. 通配符…

基于Spring Boot的中医学习服务管理系统

摘 要 随着世界经济信息化、全球化的到来和互联网的飞速发展,推动了各行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、动态的、交互友好的、高效的中医学习服务管理系统。当前的信息管理存…

汽车制造业供应商管理会面临哪些问题?要如何解决?

汽车行业的供应链是及其复杂的,并且呈全球化分布,企业在知识产权方面的优势很可能是阶段性的。企业需要持续保持领先,将面临巨大的挑战,尽快地将产品推向市场是保持领先的唯一途径。然而,如果没有正确的方式去实现安全…