N1 - OneHot编码

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

目录

  • one-hot编码
    • 优点
    • 缺点
  • 英文文本案例
  • 中文文本案例
  • 中文结巴分词示例
  • 作业
  • 心得体会


one-hot编码

自然语言处理(NLP)入门,绕不开的第一个概念就是词向量

文字对于计算机来说仅仅只是一个一个的符号,计算机是没有办法理解其中的含义的,计算也没有办法直接处理字符,因此,NLP任务的第一步就是:将文本数字化

最早期的文本数字化方法,就是将文本转换为字典序列。如:阿 在新华字典中排第一,所以它的字典序列就是1。

但是使用字典序列有缺点,就是模型可能会错误地认为不同类型之间存在一些顺序或距离关系,而实际上这些关系可能是不存在或者不具有实际意义的。

为了避免这种问题,引入了one-hot编码(也称为独热编码)。

one-hot编码的基本思想是将每个类别映射到一个向量,其中只有一个元素的值为1,剩下的全部为0。这样,每个类别之间是相互独立的,不存在顺序或者距离关系。例如:三个不同的类别被标记为

  • [1, 0, 0]
  • [0, 1, 0]
  • [0, 0, 1]

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

优点

  • 解决了分类器不好处理离散数据的问题,能够处理非连续型数值特征

缺点

  • 在文本表征表示上有些缺点非常突出,首先one-hot编码是一个词袋模型,是不考虑词和词之间的顺序问题,它是假设词和词之间是相互独立的,但是大部分情况下词和词之间是相互影响的
  • one-hot编码得到的特征是离散稀疏的,每个单词的one-hot编码维度是整个词汇表的大小,维度非常巨大,编码稀疏,会使计算代价变大。

英文文本案例

import torch
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编码
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)

执行结果

中文文本案例

import torch
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]

# 获取词汇表大小x
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)

输出结果

中文结巴分词示例

import torch
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(sequences)
print('\none-hot编码')
print(one_hot_results)

结果

作业

import torch
import jieba

# 读取文本
texts = open('任务文件.txt', 'r').read().split('\n')

# 使用结巴分词
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(sequences)
print('\none-hot编码')
print(one_hot_results)

执行结果

心得体会

通过本节的学习学会了如何将文本转换为one-hot编码,但是也发现在中文自然语言处理中,使用one-hot编码是有局限性的,通过使用结巴分词来进行分词处理,然后再转换为one-hot编码,可以获得比较简短的词向量。不过结巴分词好像不是基于人工智能的理解来分词,感觉他的准确度应该不是很稳定,也许使用AI模型来进行分词也是一种解决方案。

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

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

相关文章

Go: IM系统技术架构梳理

概述 整个IM系统的一般架构如下 我们这张图展示了整个IM系统的一般架构可见分为四层那最上面这一层是前端,包括哪些东西呢? 它包括两部分,第一部分是跟用户直接交互的比如说各种IOS APP, 各种安卓 APP还有各种 web APP 在浏览器里面打开的以…

【爬虫】爬虫基础

目录 一、Http响应与请求1、Http请求2、Http响应3、状态码 二、Requests库1、发起GET请求2、发起POST请求3、处理请求头 三、BeautifulSoup库1、解析HTML文档2、查找和提取数据Ⅰ、查找单个元素Ⅱ、查找所有元素Ⅲ、使用CSS选择器Ⅳ、获取元素属性 四、爬取豆瓣电影榜 一、Http…

PBE注册/PBE汉化/美测服汉化/美测服下载/美测服注册教程

英雄联盟PBE美测服是一个可以提前参与游戏测试,提前享受英雄联盟或者云顶之弈新版本的服务器,我们可以更快的了解到游戏的更新内容,很多玩家都想要游玩pbe美测服,下面我就个idaj带来美测服汉化/美测服下载/美测服注册教程&#xf…

【动态规划Ⅰ】斐波那契、爬楼梯、杨辉三角

动态规划—斐波那契系列 什么是动态规划斐波那契数组相关题目509. 斐波那契数 Easy1137. 第 N 个泰波那契数 Easy 杨辉三角118. 杨辉三角 Easy 爬楼梯相关题目70. 爬楼梯 Easy746. 使用最小花费爬楼梯 Easy 什么是动态规划 动态规划是一种通过将原问题分解为相对简单的子问题来…

【代码规范】.train(False)和.eval()的相似性和区别

【代码规范】.train(False)和.eval()的相似性和区别 文章目录 一、.train(False) 和 .eval() 的功能二、.train(False) 和 .eval() 的区别2.1 .eval()2.2 .train(False)2.3 总结 三、.eval()更加规范 一、.train(False) 和 .eval() 的功能 .train(False) 和 .eval() 在功能上非…

STM32CubeMX配置STM32G071输入捕获(HAL库开发)

1.时钟配置HSI主频配置64M 2.配置好串口,选择异步模式 3.配置TIM1_CH1产生1KHz的信号,主频64MHz,分频(64-1),计数周期(1000-1),这样即可生成1KHz信号。 4.配置TIM3_CH1和…

Linux 07:基础IO

stdin & stdout & stderr C默认会打开三个输入输出流,分别是stdin, stdout, stderr。仔细观察发现,这三个流的类型都是FILE*, fopen返回值类型,文件指针。 文件读取函数(库函数): fopen、fread、…

2024 年你需要知道的免费 API-独立产品灵感周刊 DecoHack #061

本周刊记录有趣好玩的独立产品设计开发相关内容,每周发布,往期内容同样精彩,感兴趣的伙伴可以 点击订阅我的周刊。为保证每期都能收到,建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。 💻 产品推荐 1. Pintree 首先…

01- 收入数据集【Pytorch入门实战】

目录 一、机器学习基础 二、实战例子 1.数据集分析 2.实战训练 3.总结 三、参考资料 一、机器学习基础 为了解决这个问题,人们想到数据驱动方法,也就是让计算机从现有的大量的带标签图片电学习规律,一旦计算机学习到了其中的规律&…

【绝命Coding助力秋招】Python实现<实习僧>海投脚本

hello hello~ ,这里是绝命Coding——老白~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页:绝命Coding-CSDN博客 &a…

异常、File

异常、File 异常 异常就是代表程序出现的问题 Error:代表的系统级别错误(属于严重问题)。系统一旦出现问题,sun公司会把这些错误封装成Error对象。Error是给sun公司自己用,不是给我们程序员用的。因此我们开发人员不…

SpringCloud--常用组件和服务中心

常用组件 Euroke和nacos 区别 负载均衡 负载均衡策略有哪些 自定义负载均衡策略

AV1 编码标准中帧内预测技术概述

AV1 编码标准帧内预测 AV1(AOMedia Video 1)是一种开源的视频编码格式,旨在提供比现有标准更高的压缩效率和更好的视频质量。在帧内预测方面,AV1相较于其前身VP9和其他编解码标准,如H.264/AVC和H.265/HEVC,…

自建文件分享平台Pingvin Share系统

Pingvin Share可以用来代替 WeTransfer 等的分享网站,如果你有自己的服务器,可以支持通过 Docker 部署或者 Stand-alone 部署。 功能介绍 完全自建:轻松使用私有服务器搭建文件共享平台 完全隐私:你的文件只属于你!不…

相交链表+判断环型链表+求环型链表的入口节点

链表OJ题 一.相交链表二.判断环型链表三.求环型链表的入口节点 一.相交链表 相交链表 相交:两个链表从头开始遍历,尾节点一定是同一个节点。 情况一:当两个链表长度相同时: 情况二:当两个链表长度不同时&#xff1…

【详解】Spring Cloud概述

🎥 个人主页:Dikz12🔥个人专栏:Spring学习之路📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 1. 认识微服务 1.1 单体架构 1.2 集群和分布式架构 1.3 集群和分布式…

如何利用windows本机调用Linux服务器,以及如何调用jupyter界面远程操控

其实这篇文章没必要存在,教程太多了 参考博客(1 2 3),如侵删 奈何网上的大神总是会漏掉一些凡人遇到的小问题 (1) 建议下载PuTTy for windows,从而建立与远程服务器的SSH连接 需要确认目标服…

nodejs安装部署运行vue前端项目

文章目录 1.安装nodejs2.安装Vue CLI1.配置npm镜像源:2.安装Vue CLI:3.创建Vue项目4.启动Vue项目5.Express 1.安装nodejs Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境,它让开发人员能够创建服务器、Web 应用、命令行工具和脚…

【C++PythonJava】字符处理详细解读_字符_ASCLL码_字母数字转换_算法竞赛_开发语言

文章目录 Beginning1)ASCLL 码2)大小比较2)判断数字字符3)字符、数字间的相互转换End Beginning 在 C 中,字符和整数有着密不可分的关系。原因就是在计算机中,字符是以一种较 ASCLL 码的整数存储的。自然&…

SpringSecurity框架【认证】

目录 一. 快速入门 二. 认证 2.1 登陆校验流程 2.2 原理初探 2.3 解决问题 2.3.1 思路分析 2.3.2 准备工作 2.3.3 实现 2.3.3.1 数据库校验用户 2.3.3.2 密码加密存储 2.3.3.3 登录接口 2.3.3.4 认证过滤器 2.3.3.5 退出登录 Spring Security是Spring家族中的一个…