词嵌入是所有自然语言处理任务所必须要经历的步骤,非常的重要。词向量在网络上已经有了大量的文章,但是,出于我们专栏的完整性系统性的考虑,笔者还是决定加上这样一个专题。
计划用3-4次,彻底说清楚在自然语言处理中,词向量的由来,本质和训练。公众号专栏主要讲基本原理,知识星球讲实际的操作。
本篇主要讲述词向量的由来及本质。
作者&编辑 | 小Dream哥
1 词的向量化
首先,我们提出这样一个问题,一个文本,经过分词之后,送入某一个自然语言处理模型之前该如何表示?
例如,“人/如果/没用/梦想/,/跟/咸鱼/还有/什么/差别”,向机器学习模型直接输入字符串显然是不明智的,不便于模型进行计算和文本之间的比较。那么,我们需要一种方式来表示一个文本,这种文本表示方式要能够便于进行文本之间的比较,计算等。最容易想到的,就是对文本进行向量化的表示。例如,根据语料库的分词结果,建立一个词典,每个词用一个向量来表示,这样就可以将文本向量化了。
最早的文本向量化方法是词袋模型,我们先来看看词袋模型。
2 词袋模型
要讲词向量,我们首先不得不说的就是词袋模型。词袋模型是把文本看成是由一袋一袋的词构成的。例如,有这样两个文本:
1) “人/如果/没有/梦想/,/跟/咸鱼/还有/什么/差别”
2) “人生/短短/几十/年/,差别/不大/,/开心/最/重要”
这两个文本,可以构成这样一个词典:
{“人”,“如果”,“没有”, “梦想”, “,”,“跟”, “咸鱼” , “还有”,“什么”, “差别”, “人生”, “短短”, “几十”,“年”, “不大”, “开心”, “最”, “重要”}
字典的长度为18,每个词对应有一个index,所以词“人”可以用一个18维的向量表示表示:
{1,0,0,0,····,0}
词“重要”可以用一个18维的向量表示表示:
{0,0,0,0,····,1},
那么,文本该怎么表示呢?词袋模型把文本当成一个由词组成的袋子,记录句子中包含各个词的个数:
文本1:
{1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0}
文本2:
{0,0,0,0,2,0,0,0,0,1,1,1,1,1,1,1,1,1}
我们大概总结一下,词袋模型把文本看成是一个装着词的袋子,以文本2为例,用词袋模型可以这样描述它。文本2里有0个“人”,2个“,”, 1个“差别” 等等。所以词袋模型有以下特点:
1) 文本向量化之后的维度与词典的大小相关;
2) 词袋模型没有考虑词语之间的顺序关系。
这只是两个句子,所以词典的大小是18。当语料库很大时,词典的大小可以是几千甚至几万,这样大维度的向量,计算机很难去计算。
而且就算是只有一个词的句子,它的维度仍然是几千维,存在很大的浪费。
此外,词袋模型忽略了词序信息,对语义理解来讲是一个极大的信息浪费。最后,词袋模型会造成语义鸿沟现象,即两个表达意思很接近的文本,可能其文本向量差距很大。
所以,词袋模型并不是一个好的解决方案。接下来,词向量就“粉墨登场”了。
3 词向量
相比于词袋模型,词向量是一种更为有效的表征方式。怎么理解呢?词向量其实就是用一个一定维度(例如128,256维)的向量来表示词典里的词。
经过训练之后的词向量,能够表征词语之间的关系。例如,“香蕉”和“苹果”之间的距离,会比“香蕉”和“茄子”之间的距离要近。
通过多维向量表示,也能更为方便的进行计算。例如,“女人”+“漂亮” =“女神”。
那么,该如何获取词向量呢?我们先来看看神经概率语言模型。
4 神经概率语言模型
一个语言模型通常构建为一句话的概率分布p(W),这里的p(W)实际上反映的是W作为一个句子出现的概率。 说成大白话,语言模型就是计算某个句子出现的概率。
对于一个由T个词按顺序构成的句子,P(W)实际上求解的是字符串的联合概率,利用贝叶斯公式,链式分解如下:
从上面可以看到,一个统计语言模型可以表示成,给定前面的的词,求后面一个词出现的条件概率。
我们在求P(W)时实际上就已经建立了一个模型,这里的诸多条件概率就是模型的参数。如果能够通过语料,将这些参数已学习到,就能够计算出一个句子出现的概率。
那么该如何学习这些条件概率呢?Yoshua Bengio在2003年《A Neural Probabilistic Language Model》一文中提出了一种神经网络的方法,用于语言模型的计算。
如上图所示,是一个简单的神经网络。首先,将输入语料进行分词,并向量化(随机初始化成为一个N维的向量),然后将他们拼接起来,用如下的公式表示:
随后,将上述的拼接结果分别经过一个激活函数和线性连接,并将二者的结果直接相加。此时,y的维度是(|V|, 1),|V|表示语料词表的大小。
最后,接一个softmax函数,预测出下一个词是目标词的概率。
训练时,会设计损失函数,用梯度下降的方法,优化参数。
在训练过程中,我们优化了如下的参数:
其中C为我们之前随机初始化的向量,但是在训练过程中,得到了不断的优化。
因此,在神经网络训练完成之后,我们不但得到了一个能够预测句子出现概率的模型,也得到了一份词向量,它能够表示词语之间的关系。
5 总结
上面详细介绍了词向量的来历和作用,并介绍了一种词向量的训练方法。
在实际过程中,并不是用上述神经网络来训练词向量的因为词向量是如此的重要,NLP工作者们设计了专门的网络来训练词向量。目前用的最多的有word2vec和GLove。这里出于篇幅,先不介绍,后面的文章来介绍。
总结
词向量是NLP开始迈进“现代化”的关键,是各种面试必问的基础,需重视。
原文发布于微信公众号 - 有三AI(yanyousan_ai)
原文发表时间:2019-09-03
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
发表于 2019-09-032019-09-03 18:50:40
扫描二维码
扫码关注云+社区
领取腾讯云代金券
Original url: Access
Created at: 2019-10-07 12:46:43
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论