0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何搭建NLP经典模型(含代码)

深度学习自然语言处理 来源:深度学习自然语言处理 作者:云不见 2021-01-18 16:09 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

之前整理过斋藤康毅的深度学习神作《深度学习入门:基于Python的理论与实现》,对小白非常友好,它没有用任何的现成框架(比如pyTorch、tensorFlow等等),而是直接用python自带的库手把手教你,从如何实现梯度下降开始到手磕一个CNN经典网络,让你不再对深度学习框架的内部机制感到神秘。

短短几年,这位大佬再度出了“续集”—《深度学习进阶:自然语言处理》[1]!(可以说是NLP入门必读的经典著作了!)

小斋这次的写作风格和前作一样,都是手把手教你从实现词向量开始,像搭积木一样,再到如何实现经典网络NLP届的界的经典网络RNN、LSTM、seq2seq和Attention等NLP中重要的深度学习技术。

(太感人了,这次终于要搞懂词向量究竟是个什么鬼了!(逃

凡我不能创造的,我就不能理解。

— 理查德·费曼(致敬费曼)

话不多说,这次我不再整理的和上个系列一样那么详细(繁冗)了(个人觉得没必要,那样整理还不如直接看书来的直接痛快。所以这一次我会摘取基础又重要的部分,如果你想再详细深究下去,乖,去参考原书噢!

本书用到的库:

Numpy

Matplotlib

(真的是只用了这两个基本库!(强

如果要用GPU加速运算的话,再加一个CuPy库。

作者强调,自己动手的经验、花时间思考的经验,都是无法复制的。(所以,听话,要自己尝试敲1敲代码噢!

本书第一章为上一本书神经网络的复习,咱直接跳到第二章 从词向量开始

正文开始

目录

什么是自然语言处理?

同义词词典

基于计数的方法

基于计数的方法改进

0a476a96-58b3-11eb-8b86-12bb97331649.jpg

必做练习

  • 语料库的预处理。实现分词(将文本分割成单词,以单词为最小单元输入给模型)

  • 单词ID化(将单词用ID来表示,相当于给每一个单词编个代号,和我们学生编个学号一个意思,方便定位和管理呗)

  • 利用共现矩阵表示文本的词向量。

(这些练习会在后续搭建模型的时候用得到噢!相当于我们先造积木,之后搭网络就有素材啦!本章的词向量表示也就是对文本进行预处理的准备工作!)

注意全文的讲解都是以

(存在一个问题 —> 找到解决办法 —> 新的解决办法又有什么问题 —> 又找到解决办法 )的思路一步一步引出各种概念和解决方案的。

我们的学习过程也是如此,市面上突然出现的各种模型也是如此,了解它解决了什么问题也就知道乱七八糟的各种模型为什么会出现了。


什么是自然语言处理?
  • 自然语言:就是我们平常使用的语言,如汉语、英语;

  • 自然语言处理:就是让机器理解人类的语言,理解了人类语言才能对我们的语言进行进一步解读和分析!(比如对人类的情感进行分析、对文本进行分类、能够实现人机对话等等)

在没有深度学习的时候,专家们是这样进行词向量的表示的:


同义词词典

最著名的同义词词典当属WordNet [2]啦。WordNet等同义词词典中对大量单词人工的定义了同义词和层级结构关系等。

同义词词典存在的问题

  • 难以顺应时代的变化。语言是活的,新词会不断出现。

  • 人力成本高,WordNet收录了超过20W个单词。

  • 无法表示单词的微妙差异。即使是含义相近的单词,也有细微的差别。比如,vintage 和retro(类似复古的意思)虽然表示相同的含义,但是用法不同,而这种细微的差别在同义词词典中是无法表示出来的(让人来解释是相当困难的)。

Marty:“This is heavy (棘手).”

Dr. Brown:“In the future, things are so heavy (重)?”

— 电影《回到未来》

在电影《回到未来》中,有这样一个场景:从1985 年穿越回来的马蒂和生活在1955年的的博士的对话中,对“heavy”的含义有不同的理解。如果要处理这样的单词变化,就需要人工不停地更新同义词词典。


基于计数的方法(基于统计)

目标:从海量文本数据中自动提取单词含义,减少人为干扰。

  • 语料库(corpus):就是我们输入模型的大量文本,比如句子、文章等等。

这里将用一句话作为语料库来阐述接下来的所有概念。

>>> text = 'you say goodbye and I say hello.'

语料库的预处理

1、进行句子的分词,并标记每个单词的ID。(就像给每个学生编上学号ID一样,方便后续指定某一个学生呀!)

>>>text=text.lower()//将所有单词转化为小写>>>text=text.replace('.','.')//使句号其和前一个单词分开>>>text'yousaygoodbyeandisayhello.'>>>words=text.split('')//切分句子>>>words['you', 'say', 'goodbye', 'and', 'i', 'say', 'hello', '.'] //由八个词组成的数组

首先,使用lower()方法将所有单词转化为小写,这样可以将句子开头的单词也作为常规单词处理。然后,将空格作为分隔符,通过split(' ')切分句子。考虑到句子结尾处的句号(.),我们先在句号前插人一个空格(即用 ' .'替换'.'),再进行分词。

2、我们进一步给单词标上 ID,以便使用单词 ID 列表,方便为后续对每个单词进行操作。

将单词列表转化为单词 ID 列表,然后再将其转化为 NumPy 数组。

word_to_id={}//将单词转化为单词IDid_to_word={}//将单词ID转化为单词(键是单词ID,值是单词)forwordinwords:  ifwordnotinword_to_id:  //如果单词不在word_to_id中,则分别向word_to_id和id_to_word添加新ID和单词    new_id=len(word_to_id)    word_to_id[word]=new_id    id_to_word[new_id] = word
corpus = np.array([word_to_id[w] for w in words])

如果单词不在 word_to_id 中,则分别向 word_to_id 和id_to_word 添加新 ID 和单词

如下为创建好了单词 ID 和单词的对应表

>>>id_to_word{0:'you',1:'say',2:'goodbye',3:'and',4:'i',5:'hello',6:'.'}>>>word_to_id{'you': 0, 'say': 1, 'goodbye': 2, 'and': 3, 'i': 4, 'hello': 5, '.': 6}

最后,我们将单词列表转化为单词 ID 列表,然后再将其转化为 NumPy 数组。

>>>corpusarray([0, 1, 2, 3, 4, 1, 5, 6])

将第一步和第二步封装为一个preprocess() 函数,使用这个函数,可以按如下方式对语料库进行预处理。( 代码在common/util.py)

输入要处理的语料库text,输出corpus, word_to_id, id_to_word

>>> text = 'You say goodbye and I say hello.'>>>corpus,word_to_id,id_to_word=preprocess(text)

corpus 是单词ID 列表,word_to_id 是单词到单词 ID 的字典,id_to_word 是单词 ID 到单词的字典。

语料库的预处理已完成。这里准备的 corpus、word_to_id 和 id_to_word 这 3 个变量名在本书接下来的很多地方都会用到。

接下来的目标就是使用语料库提取单词含义,这里先使用基于计数的方法,也就是基于统计的方法,能够得到词向量!(也就是将单词表示为向量)

分布式假说(distributional hypothesis)

  • 分布式假说(distributional hypothesis):某个单词的含义由它周围的单词形成。(某个人存在的价值由它的社会属性构成。—我瞎说的)

单词本身没有含义,单词含义由它所在的上下文(语境)形成。

比如“I drink beer.” “We drink wine.” , drink 的附近常有饮料出现。

另外,从“I guzzle beer.” “We guzzle wine.”可知,guzzle 和 drink 所在的语境相似。进而我们可以推测出guzzle 和 drink 是近义词(guzzle 是“大口喝”的意思) 。

基于这一假说,我们就可以通过单词的上下文来表示该单词。如图,左侧和右侧的 2 个单词就是上下文。

0b9659f2-58b3-11eb-8b86-12bb97331649.jpg

这里的窗口大小可以控制你需要关心多少单词的上下文。显而易见,关心的上下文单词数越多,单词的含义越准确,但是所需要的存储量就越大,看你自己的取舍咯!这里简单起见,窗口大小为1。

如何基于分布式假设使用向量表示单词,最直截了当的实现方法是对周围单词的数量进行计数。

共现矩阵(co-occurrence matrix)

  • 共现矩阵(co-occurrence matrix):用上下文共同出现的单词次数作为该单词的向量。即若两个单词挨着出现一次,次数加一。

上面已经处理好语料库了,接下来构建共现矩阵,也就是计算每个单词的上下文所包含的单词的频数。在这个例子中,我们将窗口大小设为 1,从单词 ID 为 0 的 you 开始。

单词 you 的上下文仅有 say 这个单词,如下图所示。

0bfd33a2-58b3-11eb-8b86-12bb97331649.jpg

所以单词you可表示为:

0c162f7e-58b3-11eb-8b86-12bb97331649.jpg

即可以用向量 [0, 1, 0, 0, 0, 0, 0] 表示单词 you。其他单词也是重复如此操作。

0c48f0f8-58b3-11eb-8b86-12bb97331649.jpg

于是得到了共现矩阵:

0c7b260e-58b3-11eb-8b86-12bb97331649.jpg

接下来,我们来实际创建一下上面的共现矩阵。

将图 2-7 的结果按原样手动输入。

C=np.array([  [0,1,0,0,0,0,0],  [1,0,1,0,1,1,0],  [0,1,0,1,0,0,0],  [0,0,1,0,1,0,0],  [0,1,0,1,0,0,0],  [0,1,0,0,0,0,1],  [0, 0, 0, 0, 0, 1, 0], ], dtype=np.int32)

这就是共现矩阵。使用这个共现矩阵,可以获得各个单词的向量,如下所示。

print(C[0])#单词ID为0的向量#[0100000]print(C[4])#单词ID为4的向量#[0101000]print(C[word_to_id['goodbye']])#goodbye的向量# [0 1 0 1 0 0 0]

我们通过共现矩阵成功地用向量表示了单词。但手动输入共现矩阵太麻烦,这一操作显然可以自动化。下面,我们来实现一个能直接从语料库生成共现矩阵的函数。

通过函数create_co_matrix()能直接从语料库生成共现矩阵。(代码实现在common/util.py)

其中参数 corpus 是单词 ID 列表,参数 vocab_ size 是词汇个数,window_size 是窗口大小。

defcreate_co_matrix(corpus,vocab_size,window_size=1):  corpus_size=len(corpus)  co_matrix = np.zeros((vocab_size, vocab_size), dtype=np.int32)
  foridx,word_idinenumerate(corpus):foriinrange(1,window_size+1):  left_idx=idx-i  right_idx=idx+i  ifleft_idx>=0:  left_word_id=corpus[left_idx]  co_matrix[word_id,left_word_id]+=1
  ifright_idx< corpus_size:  right_word_id=corpus[right_idx]  co_matrix[word_id,right_word_id]+=1
  return co_matrix

首先,用元素为 0 的二维数组对 co_matrix 进行初始化。然后,针对语料库中的每一个单词,计算它的窗口中包含的单词。同时,检查窗口内的单词是否超出了语料库的左端和右端。

这样一来,无论语料库多大,都可以自动生成共现矩阵。之后,我们都将使用这个函数生成共现矩阵

到这里我们终于第一次成功的用向量表示单词啦!将正式迈入文本词向量表示的道路!

写到这发现篇幅太长了,为了能有更好的学习体验,接下来共现矩阵存在的问题以及改进方式就下一篇再见啦!

责任编辑:xj

原文标题:小白跟学系列之手把手搭建NLP经典模型(含代码)

文章出处:【微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模型
    +关注

    关注

    1

    文章

    3649

    浏览量

    51713
  • 自然语言处理

    关注

    1

    文章

    629

    浏览量

    14563
  • nlp
    nlp
    +关注

    关注

    1

    文章

    491

    浏览量

    23192

原文标题:小白跟学系列之手把手搭建NLP经典模型(含代码)

文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    搭建万卡GPU集群,小米AI大模型即将全力启动

    电子发烧友网报道(文/黄山明)近日,有媒体报道,小米正在着手搭建自家的GPU万卡集群,将对AI大模型加大投入。该计划已进行数月,据悉小米大模型团队在成立之初便已拥有6500张GPU资源,小米创始人兼
    的头像 发表于 12-29 00:02 3532次阅读
    <b class='flag-5'>搭建</b>万卡GPU集群,小米AI大<b class='flag-5'>模型</b>即将全力启动

    测试小白3分钟上手,零代码自动化测试平台,15分钟搭建自动化测试方案

    还在为不懂代码搭建测试方案耗时久而发愁?ATECLOUD 零代码自动化测试平台,专为自动化测试量身打造,小白3 分钟就能轻松上手,15 分钟即可完成自动化测试方案搭建,彻底打破传统测
    的头像 发表于 09-22 17:52 615次阅读
    测试小白3分钟上手,零<b class='flag-5'>代码</b>自动化测试平台,15分钟<b class='flag-5'>搭建</b>自动化测试方案

    小白学大模型:国外主流大模型汇总

    数据科学AttentionIsAllYouNeed(2017)https://arxiv.org/abs/1706.03762由GoogleBrain的团队撰写,它彻底改变了自然语言处理(NLP
    的头像 发表于 08-27 14:06 670次阅读
    小白学大<b class='flag-5'>模型</b>:国外主流大<b class='flag-5'>模型</b>汇总

    干货分享 | TSMaster MBD模块全解析:从模型搭建到自动化测试的完整实践

    在汽车电子MBD开发中,TSMasterMBD模块深度集成于TSMaster先进的总线分析、仿真与测试平台,旨在为工程师提供一套从模型自动编译、代码集成到自动化测试的端到端无缝解决方案。本文将手把手
    的头像 发表于 08-22 20:04 1895次阅读
    干货分享 | TSMaster MBD模块全解析:从<b class='flag-5'>模型</b><b class='flag-5'>搭建</b>到自动化测试的完整实践

    代码开发云平台是什么?零编程零成本搭建

    联网云平台作为连接物理设备与数字世界的核心枢纽,其功能设计围绕设备管理、数据流转、应用开发、业务赋能四大维度展开。 一、核心能力 低代码/零代码:通过可视化拖拽组件、预置模板、图形化逻辑编排代替手写代码,快速
    的头像 发表于 07-31 15:25 585次阅读

    迅为RK3576开发板NPU环境搭建和使用rknn-toolkit2功能演示模型转换

    迅为RK3576开发板NPU环境搭建和使用rknn-toolkit2功能演示模型转换
    的头像 发表于 06-19 10:53 974次阅读
    迅为RK3576开发板NPU环境<b class='flag-5'>搭建</b>和使用rknn-toolkit2功能演示<b class='flag-5'>模型</b>转换

    FA模型卡片和Stage模型卡片切换

    卡片切换 卡片切换主要包含如下三部分: 卡片页面布局:FA模型卡片和Stage模型卡片的布局都采用类web范式开发可以直接复用。 卡片配置文件:FA模型的卡片配置在config.json中
    发表于 06-06 08:10

    FA模型访问Stage模型DataShareExtensionAbility说明

    DataShareExtensionAbility提供数据库的读写服务。 服务端由FA模型升级到Stage模型后,会导致FA模型的客户端在API 9()之后的版本上无法访问服务端。
    发表于 06-04 07:53

    代码革命的先锋:aiXcoder-7B模型介绍

       国内开源代码模型 4月9日aiXcoder宣布正式开源其7B模型Base版,仅仅过去一个礼拜,aiXcoder-7B在软件源代码托管服务平台GitHub上的Star数已超过2
    的头像 发表于 05-20 14:41 617次阅读
    <b class='flag-5'>代码</b>革命的先锋:aiXcoder-7B<b class='flag-5'>模型</b>介绍

    KaihongOS操作系统FA模型与Stage模型介绍

    KaihongOS中提供了不同的开发方式和架构选择,Stage模型因其在分布式应用开发中的优势而被推荐使用。 说明:KaihongOS文档中心中应用开发(开发准备、快速入门、进阶提高模块中的示例代码均基于Stage模型。)
    发表于 04-24 07:27

    STM32电机驱动控制方案(原理图和源代码

    淘到一个STM32电机驱动控制方案(原理图和源代码),一起分享,欢迎交流
    发表于 03-17 19:43

    【实测】用全志A733平板搭建一个端侧Deepseek算力平台

    :Deepseek-R1-Distill-Qwen-1.5B ​ 首先,我们测试AI经典哲学问题“你是谁?” ​ 输入运行命令之后可看到模型运行起来了,此时我们就可以开始和Deepseek对话了。 从实拍
    发表于 02-13 10:19

    代码平台:快速搭建与优化MES系统,提升生产效率

    和交付应用软件,全方位降低软件的开发、配置、部署和培训的成本。 二、低代码平台搭建MES系统的优势 1、快速开发: 低代码平台提供了丰富的模板和组件,IT人员可以通过拖拽、配置等图形化操作,快速
    的头像 发表于 01-23 09:37 588次阅读
    低<b class='flag-5'>代码</b>平台:快速<b class='flag-5'>搭建</b>与优化MES系统,提升生产效率

    小米加速布局AI大模型搭建GPU万卡集群

    近日,有消息称小米正在紧锣密鼓地搭建自己的GPU万卡集群,旨在加大对AI大模型的投入力度。据悉,小米的大模型团队在成立之初就已经拥有了6500张GPU资源,而现在他们正在进一步扩大这一规模。 针对
    的头像 发表于 12-28 14:25 791次阅读

    超级干货!本地搭建代码托管平台Gitea

    1关于GiteaGitea是一个轻量级的Git托管服务,也就是基于Git的代码托管平台,类似于GitHub、Gitee等。Gitea相对于其他代码托管平台,是一个可以本地部署的开源项目,非常轻量化
    的头像 发表于 12-19 19:33 1294次阅读
    超级干货!本地<b class='flag-5'>搭建</b><b class='flag-5'>代码</b>托管平台Gitea