自然语言(Natural Language)通常是指一种自然地随文化演化的语言,例如,汉语、英语、日语都是自然语言的例子。与编程语言等为计算机而设的“人造”语言相对,自然语言无法直接被计算机等“理解”,在这个前提下,如何让计算机认识、学习乃至理解自然语言就成了一个重要的研究方向:自然语言处理( Natural Language Processing, NLP) 。

简而言之,自然语言处理旨在人与机器的直接通信,这需要一个复杂的系统做支撑,尤其是该系统必须能够正确的“表示”自然语言。以汉字为例,虽然计算机通过汉字内码扩展规范(GBK字库)可以正常地显示汉字,但对于我们要设计的通信系统而言还远远不够,因为汉字无法直接参与计算,继而无法量化文本,导致计算机无法在“数值”上认识汉字,仅仅将其当作简单的字符,失去了学习、理解汉字的基础。为了更好地发挥计算机的计算功能,用数值表示汉字就成了亟待解决的问题,这也是计算机语言学(Computational Linguistics)的由来。

对于汉字的表示,举个简单的例子,可以直接对中文字库进行id映射,例如将“我”映射为“0”,将“是”映射为“1”,这样当文本中包含“我”和“是”的时候,直接用对应的id做替换,以此类推,“我是中国人”就可以映射为“12345”,这样就绕过了对中文的处理,转变为处理相应的数字id,并且相应的数字id可直接参与相关统计量的计算,例如需要计算“我是中国人”与“我是人”的相似度,可以先将文本映射为向量“[1,2,3,4,5]”与向量“[1,2,5]”,然后再计算。显然,这种映射方式有个致命的问题:当文本长度不一致的时候,向量维度也不一致,即不同长度文本的表示向量不在一个特征空间内,无法直接参与计算。可能这时候有些人会考虑使用补位的方法来解决文本长度不一致的问题,例如将空字符id设置为0并使用空字符补位短文本:“我是人”->“我是人[空字符][空字符]”->向量“[1,2,5,0,0]”,如此就将“我是人”映射至“我是中国人”的特征空间内,以实现相关计算问题。

简单的补位粗暴地解决了计算问题,但又带来了其他隐患,还是前文的例子,计算“我是中国人”与“我是人”的相似度使用补位方法就转换为计算向量“[1,2,3,4,5]”与向量“[1,2,5,0,0]”,使用cos可得到相似度结果:0.4924(计算公式如下)

cos=\frac{1*1+2*2+3*5+4*0+5*0}{\sqrt{1^{2}+2^{2}+3^{2}+4^{2}+5^{2}}*\sqrt{1^{2}+2^{2}+5^{2}}}

上面的例子使用了词袋模型(Bag of Words)的思想:将自然语言文本的每个词作为一个特征,每个词互不相关,文本对应的特征向量即每个词的特征的组合。这种思路虽然简单,但是可以有效表示全部文本信息。本文的主角one-hot就是根据词袋模型设计而来,与前文的例子同样十分简单,但在文本表示思路上略有不同。

one-hot开始就考虑了文本特征空间一致的问题,在文本编码时首先将待处理文本中全部字/词整理为词典,随后根据某个字在词典中的位置对其进行编码,例如“我”在词典中的位置为k(词典编号从1开始),词典大小为n,则设立一个n维向量,第k维设置为1,其余维全都置0。还是前文的例子,假如词典为[我,是,中,国,人],则“我”的编码为“[1,0,0,0,0]”,以此类推:是[0,1,0,0,0]、中[0,0,1,0,0]、国[0,0,0,1,0]、人[0,0,0,0,1],如此,“我是中国人”可将每个字的编码简单组合在一起编码为“[1,1,1,1,1]”,同样“我是人”可编码为“[1,1,0,0,1]”,二者维度相同,实际维度由词典大小决定。依照one-hot编码计算相似度,其结果为0.7746(计算公式如下)

\cos = \frac{1*1+1*1+1*0+1*0+1*1}{\sqrt{1^{2}+1^{2}+1^{2}+1^{2}+1^{2}}*\sqrt{1^{2}+1^{2}+1^{2}}}

如果将两个结果0.4924与0.7746看作“我是中国人”与“我是人”相似的概率,从出现的字本身而言one-hot的结果0.7746更为合理,因为二者字的组成十分接近,但是逻辑上不如初始例子的结果,因为二者在概念上的差距使得0.4924更为合理。综上,我们可以根据不同的任务环境选择更合适的文本编码方法以取得更好的结果。

总而言之,因为词袋模型的弊端,导致one-hot编码忽略了词与词之间的关联,以至于忽视了语法和语境信息,再加上本身编码长度由词典大小决定,若词典很大,则每个词的编码极度稀疏,不利于计算,且编码文本时仅考虑出现的字,从而不同字数的同义词产生不同的编码,相近字数的反义词产生相近的编码,影响最终的计算结果。

one-hot编码作为文本表示的鼻祖,不能忽视其为文本表示带来的启发,包括目前的深度学习模型与预训练模型,都参考了one-hot编码的思想,只不过利用了一些小技巧,将one-hot编码映射为更低维度、更高质量的word-embedding,这就是另外的故事了。

自然语言处理入门指北 之 one-hot相关推荐

  1. Python 简单入门指北(二)

    Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...

  2. Flutter 入门指北(Part 9)之弹窗和提示(SnackBar、BottomSheet、Dialog)

    该文已授权公众号 「码个蛋」,转载请指明出处 前面的小节把常用的一些部件都介绍了,这节介绍下 Flutter 中的一些操作提示.Flutter 中的操作提示主要有这么几种 SnackBar.Botto ...

  3. 计算机学习入门指北——计科软工网络信安侧重图析、解读专业术语、岗位分类、未来规划

    申明:本博文偏技术向,主观性较强,其中部分理解必有偏差和误解,望指出改正! 计算机学习入门指北: 作为刚入学的计算机系学生,面对一片专业术语十分蒙.区块链?大数据?开源?数据库?嵌入式开发?前端后端? ...

  4. 【杭电数电实验】verilog入门指北

    verilog入门指北 前言 指北内容 面向人群 基础实验 1-15 代码参考 正文 ISE 的安装 实验的基本操作流程 可能出现的问题 创建工程闪退 希望删除某一文件,实际上并没有删除 如何编写测试 ...

  5. 萌妹子Python入门指北(二)

    原文来自 (ixindoo.com)[http://ixindoo.com/articles/662] 只写了第一篇就好久没更新了,为啥?因为妹子学编程的意愿不强了,我也不能逼迫她去学.不过后来收到部 ...

  6. 【Linux入门指北】第一篇 初识Linux

    目录 前言 一.Linux操作系统的发展历史 1.Linux操作系统的诞生 2.Linux操作系统的发展 1.自由软件基金会(FSF) 2.GPL协议 3.GUN工程 二.Linux的不同发行版本 1 ...

  7. Python 简单入门指北(试读版)

    本文是我小专栏中 Python 简单入门指北 一文的前半部分,如果你能坚持读完并且觉得有一定收获,建议阅读原文,只需一杯咖啡钱就可以阅读更精彩的部分,也可以订阅小专栏或者加入我的知识星球,价格都是 6 ...

  8. Android环信3.0即时通讯云入门指北

    Android环信3.0即时通讯云入门指北 官方文档 http://docs-im.easemob.com/im/android/sdk/import 基础集成 http://docs-im.ease ...

  9. unity hub版本管理工具 中文包 及入门指北

    2021/12/19更新 目录 一.环境 二.hub装unity 三.中文包 四.一些事情 五.意外情况 六.hub和unity下载的一些坑 七.入门指北 一.环境 内网环境 win (其它不管) 二 ...

最新文章

  1. 阿里巴巴是如何招人的,如何招到合适的人?
  2. linux下的拷贝(cp)、删除(rm)、剪切(mv)命令
  3. Linux 下五款出色的流媒体客户端
  4. loadrunner脚本录制为空的解决方法
  5. 解决Nacos无法连接Mysql8.0+的问题(坑爹的阿里官方文档,已无力吐槽)
  6. 【flink】Flink 1.12.2 源码浅析 : StreamTask 浅析
  7. MBA 案例:一个叫花子做的策划
  8. mysql中的join问题:mysql不支持full join
  9. mysql主库、从库和备库
  10. 商务个人邮箱、VIP邮箱哪个最好用?外贸安全邮箱又怎么选?
  11. [1] Word样式/主题/模板
  12. 请用python3编写一个计算器的控制台程序_二、软件工程慕课第一章作业题——编写一个计算器...
  13. Linux设备模型剖析系列一(基本概念、kobject、kset、kobj_type)
  14. 入门避雷需知:如何选择关于Python机器学习的书
  15. STM32F4 FPU浮点运算单元
  16. 该如何提升自己的编程能力?
  17. 大数据可视化设计开发方案调研
  18. pythonista是干什么_说一说,我到底是做什么的?
  19. 2020年下半年网络规划设计师上午真题及答案解析
  20. stlink/Jlink在线调试仿真

热门文章

  1. 找出1000以内的所有完数。
  2. Neo4j实战 (数据库技术丛书)pdf
  3. SQL 数据库 连接查询 变量、if else、while
  4. 常见浏览器兼容性问题与解决方式
  5. C#控制管理VisualSVN Server
  6. 接口也可以创建对象吗_面试时,一个小小的设计模式可以把你虐成渣
  7. 第二天学习Java的笔记
  8. Git错误non-fast-forward的解决方法
  9. C语言 | 使用牛顿法求非线性方程的一个实根(附代码)
  10. IP、MAC和端口号——网络通信中确认身份信息的三要素