精华内容
下载资源
问答
  • BI-LSTM-CRF模型的PyTorch实现。 特征: 与相比,执行了以下改进: 全面支持小批量计算 完全矢量化的实现。 特别是,删除了“得分句”算法中的所有循环,从而极大地提高了训练效果 支持CUDA 用于非常简单的API ...
  • 针对长短时记忆网络(LSTM)不能有效地提取动作前后之间相互关联的信息导致行为识别率偏低的问题,提出了一种基于Bi-LSTM-Attention模型的人体行为识别算法。该算法首先从每个视频中提取20帧图像,通过Inceptionv3模型...
  • NER-LSTM-CRF 一个易于使用的命名实体识别(NER)工具包,在张量流中实现了LSTM + [CNN] + CRF模型。 该项目短期内不再维护,PyTorch版本: : 1.型号 Bi-LSTM / Bi-GRU + [CNN] + CRF,其中CNN层针对英文,捕获...
  • 需要调用的模块及整体Bi-lstm流程 import torch import pandas as pd import numpy as np from tensorflow import keras import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from ...
  • 本文提出了一种基于正负样本和Bi-LSTM的文本相似度匹配模型, 该模型首先为了提升问题和正确答案之间的相似度, 构建正负样本问答对用于模型训练; 其次为了解决分词错误引起的实验误差, 采用双层嵌入词向量方法进行预...
  • 情绪分析 总览 情感分析是一种自然语言处理(NLP)任务,其目的是评估文本块的极性/情感。... 情绪分析中常见的子任务是: 消息极性分类:给定一条消息,对消息的整体上下文极性进行分类是正面,负面还是中性。...
  • 对联AI 用PyTorch实现的自动对对联系统,支持多种模型。一般而言,给定一句话生成另一句话是序列生成问题,本项目根据上下联字数不同的特点将其转化为序列标注问题,即用下联去标注上联。 依存关系 ...
  • 针对中文文本自动校对提出了一种新的基于Seq2Seq和Bi-LSTM结合的深度学习模型。与传统的基于规则和概率统计的方法不同,基于Seq2Seq基础结构改进,加入了Bi-LSTM单元和注意力机制,实现了一个中文文本自动校对模型。...
  • 在已有工作基础上提出了双向LSTM与MLP集成的深度神经网络模型。在2016年SemEval的医疗事件抽取以及事件属性预测任务中,该模型将医疗文本的词性以及命名实体的描述信息当做附加属性,使用双向LSTM神经网络学习文本的...
  • Bi-LSTM matlab代码 DataScience-Notes 数据科学笔记。数据科学的相关笔记、代码和实例,包含数学、统计、机器学习、深度学习等数据科学基础,以及某些应用场景的实现。 参考来源已在最后说明。 大部分代码都是 ...
  • Bi-LSTM_CRF_NER.rar

    2019-05-28 17:57:58
    本代码是在参考了别人代码的基础上进一步修改的,该代码的功能是用Bi-LSTM+CRF进行NER任务,仅供大家参考!
  • Bi-LSTM_CRF_NER.zip

    2020-06-12 20:20:48
    采用LSTM-CRF进行中文实体识别,框架为tensorflow,该版本中的输入词向量是随机生成的并且所有的.py文件中有不容易读懂的地方都进行了注释
  • 基于Bi-LSTM-CRF的公交下车站点推断方法,杨鑫,左兴权,公交IC刷卡记录中隐藏着丰富的乘客出行信息,目前多数城市中公交IC系统只记录了乘客的上车信息,下车信息缺失,为客流的分析和公交调��
  • 针对此提出一种结合TFIDF的self-attention-based Bi-LSTM的神经网络模型.该模型首先将短信文本以词向量的方式输入到Bi-LSTM层,经过特征提取并结合TFIDF和self-attention层的信息聚焦获得最后的特征向量,最后将特征...
  • Multi-Domain Joint Semantic Frame Parsing using Bi-directional RNN-LSTM.pdf
  • BI-LSTM,BILSTM-CRF,Lattice-LSTM基本原理以及在NER中的应用 连大赵露思 喜欢这篇文章可以关注公众号GoAI哟,都是感兴趣的在读研究生共同经营的,目前已收录计算机视觉和NLP的文章多篇 目录: ①BI-LSTM,BILSTM-CRF...

    BI-LSTM,BILSTM-CRF,Lattice-LSTM基本原理以及在NER中的应用

    连大赵露思

    喜欢这篇文章可以关注公众号GoAI哟,都是感兴趣的在读研究生共同经营的,目前已收录计算机视觉和NLP的文章多篇

    目录:
    ①BI-LSTM,BILSTM-CRF,Lattice-LSTM的基本原理
    ②BI-LSTM,BILSTM-CRF,Lattice-LSTM在NER中的作用

    BI-LSTM,BILSTM-CRF,Lattice-LSTM的基本原理

    BI-LSTM:
    LSTM(long-short term memory)是RNN(recurrent neural network)的一种非常适合对时序数据(如文本数据)建模的算法。
    Bi-LSTM(Bi-directional long-short term memory)由前项LSTM和后项LSTM组合而成的,两者在自然语言处理任务中都常被用来建模上下文信息。

    Bi-LSTM由两个LSTM上下叠加在一起组成。输出由这两个LSTM的隐藏层的状态决定。
    注意:Forward layer和Backward layer是不相连的,即x->y不会同时经过F和B层。
    在这里插入图片描述

    为什么选择BI-LSTM而不是LSTM
    虽然LSTM相较于RNN已经有明显的改进,在一定程度上解决了梯度消失和梯度爆炸的问题。
    但是,LSTM无法编码从后到前的信息,而BILSTM可以更好地捕捉双向的语义依赖。
    举一个栗子,“这个火锅店脏得不行,没有隔壁好”,这里的“不行”是对“脏”的程度的一种修饰,通过BiLSTM可以更好的捕捉双向的语义依赖。

    在这里插入图片描述

    前向的依次输入“我”,“爱”,“中国”得到三个向量{ hL0, hL1, hL2 };
    后向的依次输入“中国”,“爱”,“我”得到三个向量{ hR0, hR1, hR2 };
    最后将前向和后向的隐向量进行拼接得到{ [hL0, hR2], [hL1, hR1], [hL2, hR0] },即{ h0, h1, h2 }。

    在这里插入图片描述

    对于情感分类任务来说,我们采用的句子的表示往往是[hL2, hR2]。因为其包含了前向与后向的所有信息。上图中softmax函数是神经网络的最后一层,又称归一化指数函数,它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来,使神经网络的输出由原本的不具有概率分布特性, 变为了具有概率分布的特性, 这样可以对神经网络的性能进行评估。

    BILSTM-CRF

    在我们开始了解BILSTM-CRF之前,我们假定在我们的数据集里有两个实体类型:Person和Organization。实际上在我们的数据集里,我们有五种标签类别:B-Person,I-Person,B-Organization,I-Organization和O这五种。

    虽然,理解BILSTM层的细节并不是很重要,但是为了更容易理解CRF层,我们需要了解BILSTM层输出的含义。
    首先,句子x中的每一个词都会被表示成一个向量,这个向量包含单词的character embedding 以及word embedding。这里的character embedding随机初始化,word embedding通常来自一个预训练的word embedding文件,所有的embeddings都会在训练过程中微调。
    然后,BiLSTM-CRF模型的输入是这些embeddings,输出是句子x的所有单词的预测标签。

    【embedding就是用一个低维的向量表示一个物体,可以是一个词,或是一个商品,或是一个电影等等。embedding向量的性质是能使距离相近的向量对应的物体有相近的含义,比如 Embedding(复仇者联盟)和Embedding(钢铁侠)之间的距离就会很接近,但 Embedding(复仇者联盟)和Embedding(乱世佳人)的距离就会远一些。】

    BiLSTM的输出是该单词对应每一个类别的score,这些score作为CRF layer的输入。
    CRF layer中,在所有的label sequence选择预测得分最高的序列作为最佳答案。
    CRF layer 可以对最终的预测labels添加一些限制来确保结果是有效的。
    这些限制可以由CRF layer在训练过程中自动的训练数据集中学到。

    这些限制可以是:
    句子的第一个单词应该是“B-”或 “O”,不可能是 “I-”;
    Eg: “B-Person I-Person”是可以的,“B-Person I-Organization”无效,“O I-label” 不合法,命名实体的开始应该是“B-”而不是“I-”。添加了这些限制之后,预测结果中的无效序列会大幅减少。

    在这里插入图片描述

    为什么我们需要CRF这层,直接挑出最大的概率的那个不行吗?
    还真不行,CRF会学习到合适的表达。
    你或许会发现,尽管不加CRF层,我们依然可以训练得到一个BILSTM命名实体识别模型作为结果。

    在这里插入图片描述

    因为BILSTM每个词的输出都是标签的分数,我们选择每个词最高分数的的标签。

    举个栗子,对于w0的最高分数是1.5即B-Person类别,因此我们选择B-Person作为w0的最好的预测标签。同理,我们选择I-Person作为w1的最好的预测标签,O作为w2的最好的预测标签,B-Organization作为w3的最好的预测标签,O作为w4的最好的预测标签。

    虽然在这个例子里我们可以得到句子x的正确标签,但是结果并不总是好的。让我们用下面这张图片上的例子再试一次。

    在这里插入图片描述

    显然,此时的输出是无效的。I-Organization不能作为开头,开头应该以B或者O开头。而且I-Organization和I-Person是不能相邻的。

    CRF layer
    在 CRF 层的损失函数中,我们有两种类型的分数。这两个分数是 CRF 层的关键概念。
    第一个是 emission 分数。这些 emission 分数来自 BiLSTM 层。如标记为 B-Person 的 w0 的分数为 1.5。
    我们使用tyi,yj来表示 transition 分数。例如tB−Person,I−person= 0.9 表示标签的 transition,即B−Persion−>I−Person得分为 0.9。因此,我们有一个 transition 得分矩阵,它存储了所有标签之间的所有得分。为了使 transition 评分矩阵更健壮,我们将添加另外两个标签,START 和 END。START 是指一个句子的开头,而不是第一个单词。END 表示句子的结尾。
    下面是一个 transition 得分矩阵的例子,包括额外添加的 START 和 END 标签。
    在这里插入图片描述

    如上表所示,我们可以发现 transition 矩阵已经学习了一些有用的约束。

    你可能想问一个关于矩阵的问题。在哪里或如何得到 transition 矩阵?
    实际上,该矩阵是 BiLSTM-CRF 模型的一个参数。在训练模型之前,可以随机初始化矩阵中的所有 transition 分数。所有的随机分数将在你的训练过程中自动更新。换句话说,CRF 层可以自己学习这些约束。我们不需要手动构建矩阵。随着训练迭代次数的增加,分数会逐渐趋于合理。

    CRF损失函数
    CRF 损失函数由真实路径得分和所有可能路径的总得分组成。在所有可能的路径中,真实路径的得分应该是最高的。
    假设我们有一个 5 个单词的句子。可能的路径是:
    在这里插入图片描述

    假设每条可能的路径都有一个分数 Pi​,并且总共有 N 条可能的路径,所有路径的总分数是 Ptotal=P1​+P2​+…+PN​

    如果我们说第 10 条路径是真正的路径,换句话说,第 10 条路径是我们的训练数据集提供的黄金标准标签。在所有可能的路径中,得分P10应该是百分比最大的。

    在这里插入图片描述

    在训练过程中,我们的 BiLSTM-CRF 模型的参数值将会一次又一次的更新,以保持增加真实路径的分数百分比。

    Lattice-LSTM

    Lattice-LSTM(网格结构-长短期记忆网络)模型是在基于字的LSTM-CRF模型的基础上,加入潜在的多粒度词语的信息。将分词信息带入LSTM,能够将字符级别序列信息和该序列对应的词信息同时编码供模型自动取用,相较于字粒度(字符级)的编码,Lattice-LSTM加入了词信息,丰富了语义表达;相较于词粒度的编码,Lattice-LSTM可以避免分词错误带来的影响。以句子“支气管哮喘”为例:

    在这里插入图片描述


    BI-LSTM,BILSTM-CRF,Lattice-LSTM在NER中的作用


    NER(Named Entity Recognition,命名实体识别)又称作专名识别,是自然语言处理中常见的一项任务,使用的范围非常广。命名实体通常指的是文本中具有特别意义或者指代性非常强的实体,通常包括人名、地名、机构名、时间、专有名词等。

    NER系统就是从非结构化的文本中抽取出上述实体,并且可以按照业务需求识别出更多类别的实体,比如产品名称、型号、价格等。因此实体这个概念可以很广,只要是业务需要的特殊文本片段都可以称为实体。

    在中文命名实体识别中,目前的主流方法是基于字符的BILSTM-CRF模型。词语为命名实体识别提供了重要的边界信息,越来越多的研究利用单词信息提高识别的准确率,而在特定领域的命名实体识别中,由于专业术语的特殊性,未登录词常常会因为歧义造成识别错误。

    目前,常用中文分词方法主要分为基于词典的方法、基于传统机器学习的方法和基于深度学习的方法。由于基于词典的方法简单高效,在一些实际应用中常常使用该方法。其中,基于词典的方法主要以词典为主,结合少量的词法、语法规则和语义解析。基于统计的方法来处理命名实体识别任务需要手动定义特征模版,基于深度学习的方法,由于不需要人为设定特征,能够从原始数据中自主的学习,因此可以减少人为对数据的干扰,找到更深层次和更加抽象的特征,近年来成为研究热点,但是深度学习的方法也存在特征学习不足的问题。

    随着时代的进步,一些新词不断涌现,词典的规模也相应扩大,还会面临存在未登录词的问题。所以,越来越多的学者研究如何发现新词去扩充词典。

    BILSTM-CRF

    BILSTM-CRF将中文命名实体识别任务分为 2 步:先通过CRF进行分词,在分词的基础上再利用双向LSTM模型进行命名实体识别。在进行中文分词的时候使用CRF模型,CRF模型分词从“字组成词” 的构词思想,通过分析大规模的语料库,统计字在词中的相应位置出现的可能性。由于同时考虑词语出现的频率和上下文语境,因此具备了较好的上下文融合能力,同时CRF对于歧义词和未登录词也具有良好的识别效果。BILSTM 能够对任何长度的序列数据进行处理,适用于文本数据。因此,CRF分词和 BI- LSTM 实体识别相融合的方法可以有效地提升命名实体识别的性能。中文分词实质上就是序列标注的问题。

    Lattice-LSTM
    中文NER和分词有关,特别是实体的边界就是词的边界,一个lattice中的字-词会有指数级别的路径,所以构建了一个lattice-lstm结构自动控制信息流从句子开始流到句子结尾。
    在传统的基于字的 LSTM 模型中加入潜在的粒度多样化的词语信息作为特征,并构建 Lattice-LSTM 来对这些词语进行建模。

    多粒度中文分词的优势在于其应用于信息检索和机器翻译等任务时具有一定的容错性,可以减少分词错误对后续任务的影响。不同粒度的分词结果可以起到分词作用:一方面,粗粒度词语可以使模型更加准确地捕获信息从而进行分析;另一方面,细粒度词语可以减少数据稀疏性并且体现出对语言更深层次的理解,为后续任务打下良好的基础。

    命名实体识别效果的评判主要看实体的边界是否划分正确以及实体的类型是否标注正确。(实体边界的识别更加困难)

    展开全文
  • BI-LSTM-CRF用于方面提取-情感提取 数据->通过BDCI 2017基于主题的文本情感分析的训练数据修改的数据集: ://www.datafountain.cn/#/competitions/268/intro,最后访问时间2018/5/13 train.csv->培训文件大小:...
  • Bi-LSTM matlab代码 项目介绍 该项目的目标是:基于PyTorch实现中文孤立手语词识别; 目前使用的基本网络结构是:Bi-LSTM(双向长短期记忆神经网络); 数据集使用的是:中国科学技术大学提供的500-CSL(500类中文...
  • pytorch使用lstm“There is no rule on how to write. Sometimes it comes easily and perfectly: sometimes it’s like drilling rock and then blasting it out with charges” — Ernest Hemingway “没有写法的...

    pytorch使用lstm

    “There is no rule on how to write. Sometimes it comes easily and perfectly: sometimes it’s like drilling rock and then blasting it out with charges” — Ernest Hemingway

    “没有写法的规则。 有时候它变得轻松而完美:有时候就像钻石头,然后用炸药炸开它” –欧内斯特·海明威(Ernest Hemingway)

    The aim of this blog is to explain the building of an end-to-end model for text generation by implementing a powerful architecture based on LSTMs.

    该博客的目的是通过实现基于LSTM的强大架构来解释用于文本生成的端到端模型。

    The blog is divided into the following sections:

    该博客分为以下几部分:

    • Introduction

      介绍

    • Text preprocessing

      文字预处理

    • Sequence generation

      序列产生

    • Model architecture

      模型架构

    • Training phase

      训练阶段

    • Text generation

      文字产生

    You can find the complete code at: https://github.com/FernandoLpz/Text-Generation-BiLSTM-PyTorch

    您可以在以下位置找到完整的代码: https : //github.com/FernandoLpz/Text-Generation-BiLSTM-PyTorch

    介绍 (Introduction)

    Over the years, various proposals have been launched to model natural language, but how is this? what does the idea of “modeling natural language” refer to? We could think that “modeling natural language” refers to the reasoning given to the semantics and syntax that make up the language, in essence, it is, but it goes further.

    多年以来,已经提出了各种建议来模拟自然语言 ,但这是怎么回事? “ 模拟自然语言 ”的想法指的是什么? 我们可以认为“ 对自然语言建模 ”是指对构成语言的语义和语法的推理,从本质上讲,确实如此,但它可以走得更远。

    Nowadays, the field of Natural Language Processing (NLP) deals with different tasks that refer to reasoning, understanding and modeling of language through different methods and techniques. The field of NLP (Natural Language processing) has been growing extremely fast in this past decade. It has been proposed in plenty of models to solve different NLP tasks from different perspectives. Likewise, the common denominator among the most popular proposals is the implementation of Deep Learning based models.

    如今, 自然语言处理 ( NLP )领域通过不同的方法和技术处理涉及语言推理,理解和建模的不同任务。 在过去的十年中,NLP(自然语言处理)领域的发展非常Swift。 已经提出了许多模型来从不同角度解决不同的NLP任务。 同样,最受欢迎的提案中的共同点是基于深度学习的模型的实现。

    As already mentioned, NLP field addresses a huge number of problems, specifically in this blog we will address the problem of text generation by making use of deep learning based models, such as the recurrent neural networks LSTM and Bi-LSTM. Likewise, we will use one of the most sophisticated frameworks today to develop deep learning models, specifically we will use the LSTMCell class from PyTorch to develop the proposed architecture.

    如前所述, NLP领域解决了大量问题,特别是在此博客中,我们将通过使用基于深度学习的模型 (例如递归神经网络 LSTMBi-LSTM)来解决文本生成问题。 同样,我们将用最先进的框架之一,今天深发展的学习模式,特别是我们将使用LSTMCell PyTorch发展所提出的架构。

    If you want to dig into the mechanics of the LSTM, as well as how it is implemented in PyTorch, take a look at this amazing explanation: From a LSTM Cell to a Multilayer LSTM Network with PyTorch

    如果您想了解LSTM的原理以及在PyTorch中的实现方式 ,请看一下以下令人惊奇的解释: 从LSTM单元到带有PyTorch的多层LSTM网络

    问题陈述 (Problem statement)

    Given a text, a neural network will be fed through character sequences in order to learn the semantics and syntactics of the given text. Subsequently, a sequence of characters will be randomly taken and the next character will be predicted.

    给定文本,将通过字符序列提供神经网络,以学习给定文本的语义和句法。 随后,将随机抽取一系列字符,并预测下一个字符。

    So, let’s get started!

    所以,让我们开始吧!

    文字预处理 (Text preprocessing)

    First, we are going to need a text which we are going to work with. There are different resources where you can find different texts in plain text, I recommend you take a look at the Gutenberg Project.

    首先,我们需要一个将要使用的文本。 您可以在不同的资源中找到纯文本的不同文本,我建议您看一下Gutenberg项目

    In this case, I will use the book called Jack Among the Indians by George Bird Grinnell, the one you can find here: link to the book. So, the first lines of chapter 1 look like:

    在这种情况下,我将使用乔治·伯德·格林纳尔 ( George Bird Grinnell)所著的《印第安人杰克之中 》一书,您可以在这里找到该书链接至该书 。 因此,第一章的第一行如下所示:

    The train rushed down the hill, with a long shrieking whistle, and then began to go more and more slowly. Thomas had brushed Jack off and thanked him for the coin that he put in his hand, and with the bag in one hand and the stool in the other now went out onto the platform and down the steps, Jack closely following.

    As you can see, the text contains uppercase, lowercase, line breaks, punctuation marks, etc. What is suggested to do is to try to adapt the text to a form which allows us to handle it in a better way and which mainly reduces the complexity of the model that we are going to develop. So we are going to transform each character to its lowercase form. Also, it is advisable to handle the text as a list of characters, that is, instead of having a “big string of characters”, we will have a list of characters. The purpose of having the text as a sequence of characters is for better handling when generating the sequences which the model will be fed with (we will see this in the next section in detail).

    如您所见,文本包含大写,小写,换行符,标点符号等。建议做的是尝试使文本适应某种形式,以使我们可以更好地处理它,并且主要减少我们将要开发的模型的复杂性。 因此,我们将每个字符转换为小写形式 。 另外,建议将文本作为字符列表来处理,也就是说,我们将拥有一个字符列表,而不是使用“ 大字符字符串 ”。 将文本作为字符序列的目的是为了更好地处理生成模型将要使用的序列(我们将在下一节中详细介绍)。

    So let’s do it!

    让我们开始吧!

    Code snippet 1. Preprocessing
    代码段1.预处理

    As we can see, in line 2 we are defining the characters to be used, all other symbols will be discarded, we only keep the “white space” symbol. In lines 6 and 10 we are reading the raw file and transforming it into its lowercase form. In the loops of lines 14 and 19 we are creating and string which represents the entire book and generating a list of characters. In line 23 we are filtering the text list by only keeping the letters defined in line 2.

    如我们所见,在第2行中,我们定义了要使用的字符,所有其他符号都将被丢弃,我们仅保留“ 空白 ”符号。 在第6和10行中,我们正在读取原始文件并将其转换为小写形式。 在第14和19行的循环中,我们创建并表示整个书籍的字符串,并生成一个字符列表。 在第23行中,我们仅保留第2行中定义的字母来过滤文本列表

    So, once the text is loaded and preprocessed, we will go from having a text like this:

    因此,一旦加载并预处理了文本,我们将不再需要这样的文本:

    text = "The train rushed down the hill."

    to have a list of characters like this:

    具有这样的字符列表:

    text = ['t','h','e',' ','t','r','a','i','n',' ','r','u','s','h','e','d',' ','d','o','w','n',
    ' ','t','h','e',' ','h','i','l','l']

    Well, we already have the full text as a list of characters. As it’s well known, we cannot introduce raw characters directly to a neural network, we require a numerical representation, therefore, we need to transform each character to a numerical representation. For this, we are going to create a dictionary which will help us to save the equivalence “character-index” and “index-character”.

    好吧,我们已经有了全文作为字符列表。 众所周知,我们无法将原始字符直接引入神经网络,我们需要一个数字表示形式 ,因此,我们需要将每个字符转换为一个数字表示形式。 为此,我们将创建一个字典,该字典将帮助我们保存等价的“ character-index ”和“ i ndex-character ”。

    So, let’s do it!

    所以,让我们开始吧!

    Code snippet 2. Dictionary creation
    代码段2.字典创建

    As we can notice, in lines 11 and 12 the “char-index” and “index-char” dictionaries are created.

    我们可以注意到,在第11和12行中,创建了“ char-index ”和“ index-char ”字典。

    So far we have already shown how to load the text and save it in the form of a list of characters, we have also created a couple of dictionaries that will help us to encode-decode each character. Now, it is time to see how we will generate the sequences that will be introduced to the model. So, let’s go to the next section!

    到目前为止,我们已经展示了如何加载文本并以字符列表的形式保存文本,我们还创建了两个字典,可以帮助我们对每个字符进行编码/解码。 现在,该看一下我们如何生成将引入模型的序列了。 因此,让我们进入下一部分!

    序列产生 (Sequence generation)

    The way in which the sequences are generated depends entirely on the type of model that we are going to implement. As already mentioned, we will use recurrent neural networks of the LSTM type, which receive data sequentially (time steps).

    生成序列的方式完全取决于我们将要实现的模型的类型。 如前所述,我们将使用LSTM类型的递归神经网络,该网络顺序地(时间步长)接收数据。

    For our model, we need to form sequences of a given length which we will call “window”, where the character to predict (the target) will be the character next to the window. Each sequence will be made up of the characters included in the window. To form a sequence, the window is sliced one character to the right at a time. The character to predict will always be the character following the window. We can clearly see this process in Figure 1.

    对于我们的模型,我们需要形成给定长度的序列,我们将其称为“ 窗口 ”,其中要预测的字符( 目标 )将是窗口旁边的字符。 每个序列将由窗口中包含的字符组成。 为了形成一个序列,将窗口一次向右切一个字符。 要预测的字符始终是跟随窗口的字符。 我们可以在图1中清楚地看到此过程。

    Image for post
    Figure 1. Sequences generation. In this example the window has a size of 4, meaning that it will contain 4 characters. The target is the first character next to the window | Image by the author
    图1.序列生成。 在此示例中,窗口的大小为4,这意味着它将包含4个字符。 目标是窗口旁边的第一个字符。 图片由作者提供

    Well, so far we have seen how to generate the character sequences in a simple way. Now we need to transform each character to its respective numerical format, for this we will use the dictionary generated in the preprocessing phase. This process can be visualized in Figure 2.

    好了,到目前为止,我们已经看到了如何以简单的方式生成字符序列。 现在我们需要将每个字符转换为其各自的数字格式,为此,我们将使用在预处理阶段生成的字典。 此过程可以在图2中看到。

    Image for post
    Figure 2. Transforming from chars to numerical format | Image by the author
    图2.从字符转换为数字格式 图片由作者提供

    Great, now we know how to generate the character sequences using a window that slides one character at a time and how we transform the characters into a numeric format, the following code snippet shows the process described.

    太好了,现在我们知道如何使用可一次滑动一个字符的窗口生成字符序列,以及如何将字符转换为数字格式,以下代码片段显示了所描述的过程。

    Code snippet 3. Sequences generation
    代码段3.序列生成

    Fantastic, now we know how to preprocess raw text, how to transform it into a list of characters and how to generate sequences in a numeric format. Now we go to the most interesting part, the model architecture.

    太神奇了,现在我们知道如何预处理原始文本,如何将其转换为字符列表以及如何以数字格式生成序列。 现在我们来看最有趣的部分,即模型架构。

    模型架构 (Model architecture)

    As you already read in the title of this blog, we are going to make use of Bi-LSTM recurrent neural networks and standard LSTMs. Essentially, we make use of this type of neural network due to its great potential when working with sequential data, such as the case of text-type data. Likewise, there are a large number of articles that refer to the use of architectures based on recurrent neural networks (e.g. RNN, LSTM, GRU, Bi-LSTM, etc.) for text modeling, specifically for text generation [1, 2].

    正如您已经在该博客的标题中阅读的那样,我们将使用Bi-LSTM递归神经网络和标准LSTM 。 本质上,由于这种类型的神经网络在处理顺序数据(例如文本类型数据)时具有巨大的潜力,因此我们会使用这种类型的神经网络。 同样,有很多文章引用了基于递归神经网络(例如RNN, LSTMGRUBi-LSTM等)的架构进行文本建模,尤其是用于文本生成[1,2]。

    The architecture of the proposed neural network consists of an embedding layer followed by a Bi-LSTM as well as a LSTM layer. Right after, the latter LSTM is connected to a linear layer.

    所提出的神经网络的体系结构由嵌入层, Bi-LSTM以及LSTM层组成。 之后,将后者的LSTM连接到线性层

    方法 (Methodology)

    The methodology consists of passing each sequence of characters to the embedding layer, this to generate a representation in the form of a vector for each element that makes up the sequence, therefore we would be forming a sequence of embedded characters. Subsequently, each element of the sequence of embedded characters will be passed to the Bi-LSTM layer. Subsequently, a concatenation of each output of the LSTMs that make up the Bi-LSTM (the forward LSTM and the backward LSTM) will be generated. Right after, each forward + backward concatenated vector will be passed to the LSTM layer from which the last hidden state will be taken to feed the linear layer. This last linear layer will have as activation function a Softmax function in order to represent the probability of each character. Figure 3 show the described methodology.

    该方法包括将每个字符序列传递给嵌入层,从而为构成该序列的每个元素生成矢量形式的表示形式,因此我们将形成一个嵌入字符序列 。 随后, 嵌入字符序列中的每个元素都将传递到Bi-LSTM 。 随后,将生成组成Bi-LSTM的LSTM的每个输出( 正向LSTM反向LSTM )的串联。 之后,每个正向和反向连接的向量将传递到LSTM 层,从该将获取最后的隐藏状态以馈送线性层 。 最后的线性层将具有Softmax函数作为激活函数,以便表示每个字符的概率。 图3显示了所描述的方法。

    Image for post
    Figure 3 . BiLSTM-LSTM model. In this image the word “bear” is passed through the BiLSTM-LSTM model for text generation | Image by the author
    图3。 BiLSTM-LSTM模型。 在此图像中,单词“ bear”通过BiLSTM-LSTM模型传递以生成文本| 图片由作者提供

    Fantastic, so far we have already explained the architecture of the model for text generation as well as the implemented methodology. Now we need to know how to do all this with the PyTorch framework, but first, I would like to briefly explain how the Bi-LSTM and the LSTM work together to later see how we would do it in code, so let’s see how a Bi-LSTM network works.

    太棒了,到目前为止,我们已经解释了文本生成模型的体系结构以及实现的方法。 现在我们需要知道如何使用PyTorch框架来完成所有这些工作,但是首先,我想简要地解释一下Bi-LSTMLSTM如何一起工作,以便以后在代码中看到我们将如何做,所以让我们看看Bi-LSTM 网络有效。

    Bi-LSTM和LSTM (Bi-LSTM & LSTM)

    The key difference between a standard LSTM and a Bi-LSTM is that the Bi-LSTM is made up of 2 LSTMs, better known as “forward LSTM” and “backward LSTM”. Basically, the forward LSTM receives the sequence in the original order, while the backward LSTM receives the sequence in reverse. Subsequently and depending on what is intended to be done, each hidden state for each time step of both LSTMs can be joined or only the last states of both LSTMs will be operated. In the proposed model, we suggest joining both hidden states for each time step.

    标准LSTMBi-LSTM之间的主要区别在于Bi-LSTM 2 个LSTM 组成 ,通常称为“ 正向 LSTM ”和“ 反向 LSTM ”。 基本上, 前向 LSTM按原始顺序接收序列,而后 LSTM 接收相反的顺序。 随后,根据要执行的操作,两个LSTM每个时间步的每个隐藏状态都可以合并,或者仅两个LSTM最后一个状态都将被操作。 在提出的模型中,我们建议为每个时间步加入两个隐藏状态

    Perfect, now we understand the key difference between a Bi-LSTM and an LSTM. Going back to the example we are developing, Figure 4 represents the evolution of each sequence of characters when they are passed through the model.

    完美,现在我们了解了Bi-LSTMLSTM之间的关键区别。 回到我们正在开发的示例,图4表示每个字符序列在通过模型时的演变。

    Image for post
    Figure 4. BiLSTM-LSTM model. A simple example showing the evolution of each character when passed through the model | Image by the author
    图4. BiLSTM-LSTM模型。 一个简单的示例,显示通过模型时每个角色的演变| 图片由作者提供

    Great, once everything about the interaction between Bi-LSTM and LSTM is clear, let’s see how we do this in code using only LSTMCells from the great PyTorch framework.

    太好了,一旦有关Bi-LSTMLSTM之间的交互的所有事情都清楚了,让我们看看我们如何仅使用来自PyTorch框架的LSTMCells在代码中执行此操作。

    So, first let’s understand how we make the constructor of the TextGenerator class, let’s take a look at the following code snippet:

    因此,首先让我们了解如何制作TextGenerator类的构造函数,让我们看一下以下代码片段:

    Code snippet 4. Constructor of text generator class
    代码段4.文本生成器类的构造函数

    As we can see, from lines 6 to 10 we define the parameters that we will use to initialize each layer of the neural network. It is important to mention that input_size is equal to the size of the vocabulary (that is, the number of elements that our dictionary generated in the preprocessing contains). Likewise, the number of classes to be predicted is also the same size as the vocabulary and sequence_length refers to the size of the window.

    如我们所见,从第6行到第10行,我们定义了用于初始化神经网络每一层的参数。 重要的是要提到input_size等于词汇表大小 (即预处理中生成的字典中包含的元素数)。 同样,要预测的类数量也与词汇表相同,并且sequence_length指的是窗口的大小。

    On the other hand, in lines 20 and 21 we are defining the two LSTMCells that make up the Bi-LSTM (forward and backward). In line 24 we define the LSTMCell that will be fed with the output of the Bi-LSTM. It is important to mention that the hidden state size is double compared to the Bi-LSTM, this is because the output of the Bi-LSTM is concatenated. Later on line 27 we define the linear layer, which will be filtered later by the softmax function.

    另一方面,在第20行和第21行中,我们定义了两个构成 Bi-LSTM的 LSTMCell ( 正向反向 )。 在第24行中,我们定义了将与Bi-LSTM的输出一起馈入的LSTMCell 。 值得一提的是, 隐藏状态的大小是Bi-LSTM的两倍,这是因为Bi-LSTM的输出是串联的。 在第27行的后面,我们定义了线性层 ,稍后将通过softmax函数对其进行过滤。

    Once the constructor is defined, we need to create the tensors that will contain the cell state (cs) and hidden state (hs) for each LSTM. So, we proceed to do it as follows:

    定义构造函数后,我们需要创建张量,其中将包含每个LSTM单元状态 ( cs )和隐藏状态 ( hs )。 因此,我们继续执行以下操作:

    Code snippet 5. Weights initialization
    代码段5.权重初始化

    Fantastic, once the tensors that will contain the hidden state and cell state have been defined, it is time to show how the assembly of the entire architecture is done, let’s go for it!

    太棒了,一旦定义了包含隐藏状态单元状态的张量,就该展示整个架构的组装方式了,那就开始吧!

    First, let’s take a look at the following code snippet:

    首先,让我们看一下以下代码片段:

    Code snippet 6. BiLSTM + LSTM + Linear layer
    代码段6. BiLSTM + LSTM +线性层

    For a better understanding, we are going to explain the assembly with some defined values, in such a way that we can understand how each tensor is passed from one layer to another. So say we have:

    为了更好地理解,我们将以一些定义的值来解释装配,这样我们可以理解每个张量如何从一层传递到另一层。 所以说我们有:

    batch_size = 64
    hidden_size = 128
    sequence_len = 100
    num_classes = 27

    so the x input tensor will have a shape:

    因此x输入张量将具有以下形状:

    # torch.Size([batch_size, sequence_len])
    x : torch.Size([64, 100])

    then, in line 2 is passed the x tensor through the embedding layer, so the output would have a size:

    然后,在第2行中将x张量通过嵌入层,因此输出将具有以下大小:

    # torch.Size([batch_size, sequence_len, hidden_size])
    x_embedded : torch.Size([64, 100, 128])

    It is important to notice that in line 5 we are reshaping the x_embedded tensor. This is because we need to have the sequence length as the first dimension, essentially because in the Bi-LSTM we will iterate over each sequence, so the reshaped tensor will have a shape:

    请注意,在第5行中,我们正在重塑 x_embedded张量。 这是因为我们需要将序列长度作为第一维,主要是因为在Bi-LSTM中,我们将遍历每个序列,因此重塑后的张量将具有以下形状:

    # torch.Size([sequence_len, batch_size, hidden_size])
    x_embedded_reshaped : torch.Size([100, 64, 128])

    Right after, in lines 7 and 8 the forward and backward lists are defined. There we will store the hidden states of the Bi-LSTM.

    之后,在第7和8行中,定义了向前向后的列表。 在那里,我们将存储Bi-LSTM隐藏状态

    So it’s time to feed the Bi-LSTM. First, in line 12 we are iterating over forward LSTM, we are also saving the hidden states of each time step (hs_forward). In line 19 we are iterating over the backward LSTM, at the same time we are saving the hidden states of each time step (hs_backward). You can notice that the loop is done in the same sequence, the difference is that it’s read in reversed form. Each hidden state will have the following shape:

    因此,现在该喂Bi-LSTM了 。 首先,在第12行中,我们遍历正向LSTM ,还保存了每个时间步隐藏状态 ( hs_forward )。 在第19行中,我们遍历向后 LSTM ,同时,我们保存每个时间步隐藏状态 ( hs_backward )。 您可能会注意到,循环以相同的顺序完成,不同之处在于它是以相反的形式读取的。 每个隐藏状态将具有以下形状:

    # hs_forward : torch.Size([batch_size, hidden_size])
    hs_forward : torch.Size([64, 128])# hs_backward : torch.Size([batch_size, hidden_size])
    hs_backward: torch.Size([64, 128])

    Great, now let’s see how to feed the latest LSTM layer. For this, we make use of the forward and backward lists. In line 26 we are iterating through each hidden state corresponding to forward and backward which are concatenated in line 27. It is important to note that by concatenating both hidden states, the dimension of the tensor will increase 2X, that is, the tensor will have the following shape:

    太好了,现在让我们看看如何添加最新的LSTM层 。 为此,我们使用前向后向列表。 在第26行中,我们遍历与在第27行中串联的 前向后向相对应的每个隐藏状态 。重要的是要注意,通过将这两个隐藏状态 串联在一起 ,张量的尺寸将增加2倍,也就是说,张量将具有以下形状:

    # input_tesor : torch.Size([bathc_size, hidden_size * 2])
    input_tensor : torch.Size([64, 256])

    Finally, the LSTM will return a hidden state of size:

    最后,LSTM将返回size的隐藏状态

    # last_hidden_state: torch.Size([batch_size, num_classes])
    last_hidden_state: torch.Size([64, 27])

    At the very end, the last hidden state of the LSTM will be passed through a linear layer, as shown on line 31. So, the complete forward function is shown in the following code snippet:

    最后LSTM最后一个隐藏状态将通过inear层传递,如第31行所示。因此,下面的代码片段显示了完整的forward函数:

    Code snippet 7. Forward function
    代码段7.转发功能

    Congratulations! Up to this point we already know how to assemble the neural networks using LSTMCell in PyTorch. Now it’s time to see how we do the training phase, so let’s move on to the next section.

    恭喜你! 至此,我们已经知道如何在PyTorch中使用LSTMCell组装神经网络。 现在是时候看看我们如何进行培训了,接下来让我们继续下一节。

    训练阶段 (Training phase)

    Great, we’ve come to training. To perform the training we need to initialize the model and the optimizer, later we need to iterate for each epoch and for each mini-batch, so let’s do it!

    太好了,我们来训练了 。 为了执行训练,我们需要初始化模型优化器 ,稍后我们需要针对每个时期和每个迷你批处理进行迭代,让我们开始吧!

    Code snippet 8. Training phase
    代码段8.培训阶段

    Once the model is trained, we will need to save the weights of the neural network to later use them to generate text. For this we have two options, the first is to define a fixed number of epochs and then save the weights, the second is to determine a stop function to obtain the best version of the model. In this particular case, we are going to opt for the first option. After training the model under a certain number of epochs, we save the weights as follows:

    训练完模型后,我们将需要保存神经网络的权重 ,以便以后使用它们生成文本 。 为此,我们有两个选择,第一个是定义固定数量的纪元 ,然后保存权重,第二个是确定停止函数以获得模型的最佳版本。 在这种情况下,我们将选择第一个选项。 在一定时期内训练模型后,我们将权重保存如下:

    Code snippet 9. Save weights
    代码段9.节省重量

    Perfect, up to this point we have already seen how to train the text generator and how to save the weights, now we are going to the top part of this blog, the text generation! So let’s go to the next section.

    完美,到目前为止,我们已经了解了如何训练文本生成器以及如何节省权重 ,现在我们将转到本博客的顶部,即文本生成! 因此,让我们进入下一部分。

    文字产生 (Text generation)

    Fantastic, we have reached the final part of the blog, the text generation. For this, we need to do two things: the first is to load the trained weights and the second is to take a random sample from the set of sequences as the pattern to start generating the next character. So let’s take a look at the following code snippet:

    太棒了,我们已经到达了博客的最后一部分, 即文本生成 。 为此,我们需要做两件事:第一是加载训练后的权重 ,第二是从序列集中获取随机样本作为模式,以开始生成下一个字符。 因此,让我们看一下以下代码片段:

    Code snippet 10. Text generator
    代码段10。文本生成器

    So, by training the model under the following characteristics:

    因此,通过根据以下特征训练模型:

    window : 100
    epochs : 50
    hidden_dim : 128
    batch_size : 128
    learning_rate : 0.001

    we can generate the following:

    我们可以生成以下内容:

    Seed:one of the prairie swellswhich gave a little wider view than most of them jack saw quite close to thePrediction:one of the prairie swellswhich gave a little wider view than most of them jack saw quite close to the wnd banngessejang boffff we outheaedd we band r hes tller a reacarof t t alethe ngothered uhe th wengaco ack fof ace ca  e s alee bin  cacotee tharss th band fofoutod we we ins sange trre anca y w farer we sewigalfetwher d e  we n s shed pack wngaingh tthe we the we javes t supun f the har man bllle s ng ou   y anghe ond we nd ba a  she t t anthendwe wn me anom ly tceaig t i isesw arawns t d ks wao thalac tharr jad  d anongive where the awe w we he is ma mie cack seat sesant sns t imes hethof riges we he d ooushe he hang out f t thu inong bll llveco we see s the he haa is s igg merin ishe d t san wack owhe o or th we sbe se we we inange t ts wan br seyomanthe harntho thengn  th me ny we ke in acor offff  of wan  s arghe we t angorro the wand be thing a sth t tha alelllll willllsse of s wed w brstougof bage orore he anthesww were ofawe ce qur the he sbaing tthe bytondece nd t llllifsffo acke o t in ir me hedlff scewant pi t bri pi owasem the awh thorathas th we hed ofainginictoplid we me

    As we can see, the generated text may not make any sense, however there are some words and phrases that seem to form an idea, for example:

    我们可以看到,生成的文本可能没有任何意义,但是有些单词和短语似乎构成了一个想法,例如:

    we, band, pack, the, man, where, he, hang, out, be, thing, me, were

    Congratulations, we have reached the end of the blog!

    恭喜,我们已经结束了博客!

    结论 (Conclusion)

    Throughout this blog we have shown how to make an end-to-end model for text generation using PyTorch’s LSTMCell and implementing an architecture based on recurring neural networks LSTM and Bi-LSTM.

    在整个博客中,我们展示了如何使用PyTorch的LSTMCell创建端到端的文本生成模型,以及如何实现基于递归神经网络LSTMBi-LSTM的体系结构

    It is important to comment that the suggested model for text generation can be improved in different ways. Some suggested ideas would be to increase the size of the text corpus to be trained, increase the number of epochs as well as the memory size for each LSTM. On the other hand, we could think of an interesting architecture based on Convolutional-LSTM (maybe a topic for another blog).

    重要的是要评论可以以不同方式改进建议的文本生成模型。 一些建议的想法将是增加要训练的文本语料库的大小增加每个LSTM 的时期数以及内存大小 另一方面,我们可以想到一个基于卷积LSTM (也许是另一个博客的主题)的有趣架构。

    翻译自: https://towardsdatascience.com/text-generation-with-bi-lstm-in-pytorch-5fda6e7cc22c

    pytorch使用lstm

    展开全文
  • BI-LSTM

    2020-05-07 14:29:39
    https://blog.csdn.net/lgy54321/article/details/99936770
    展开全文
  • BiLSTM-CRF(6B手套50D)(F1 = 83.0 ) BiLSTM-CRF(6B手套100D)(F1 = 83.15 ) BiLSTM-CRF(6B手套200D)(F1 = 83.29 ) BiLSTM-CRF(6B手套300D)(F1 = 83.10 ) 森那 BiLSTM-CRF(SENNA 50D)(F1 = ...
  • 提出一种考虑变压器油特征参量序列间复杂关系的基于双向长短时记忆(Bi-LSTM)网络的变压器故障诊断方法。首先构建了变压器油特征参量序列,基于序列数据构建了Bi-LSTM变压器故障诊断模型。工程实际中不同变压器油特征...
  • 1 Bi-LSTM 层 3 . 1 . 1 RNN 和 LSTM 3 . 1 . 2 Bi-LSTM 3 . 2 句嵌入层 3 . 3 注意力层 3 . 4 ATT-over-ATT 层 3 . 5 注意力汇聚层 3 . 6 总结 四、 实验评估 4 . 1 实验平台 4 . 2 实验数据来源 4 . 3 实验

    目录
    一、 简介

    1 . 1 挖掘意义
    1 . 2 挖掘目标
    1 . 3 挖掘流程

    二、 预处理

    2 . 1 分词
    2 . 2 去停用词
    2 . 3 word2vec

    三、 对回答候选集评分

    3 . 1 Bi-LSTM 层
    3 . 1 . 1 RNN 和 LSTM
    3 . 1 . 2 Bi-LSTM
    3 . 2 句嵌入层
    3 . 3 注意力层
    3 . 4 ATT-over-ATT 层
    3 . 5 注意力汇聚层
    3 . 6 总结

    四、 实验评估

    4 . 1 实验平台
    4 . 2 实验数据来源
    4 . 3 实验评价指标
    4 . 4 实验设置及结果分析
    4 . 4 . 1 相关参数
    4 . 4 . 2 阈值确定
    4 . 4 . 3 相关结果

    五、 模型优化

    5 . 2 文本蕴含
    5 . 3 未来改进

    六、 参考文献

    一、 简介

    1 . 1 挖掘意义

    关于阅读,相信大家都不陌生,在学习方面,我们接受的传统语文教育中阅读理解是非常常规的考试内容;在生活中,我们也常常会遇到阅读文件、论文、书籍等应用场景。除去欣赏优美的语言艺术,更多情况下,我们只是需要从文本中查找某一些片段来解决我们的实际问题。比如,通过查找法律文献中的一些段落来解决我们的法律疑惑,这时并不需要精读整个法律文献;就算对于小说,有时候我们也只是想知道其中一些特殊细节,并不想花时间去通读整个小说。但是,这对人类来说无疑是一个难题。浩如烟海的书籍作为古往今来人类智慧的结晶,其中内容往往很难在短时间内为人掌握,就算
    是略读也不容易,更不必说从浩繁卷帙中准确的定位答案。因此,我们希望智能阅读技术能够在这方面提供一些帮助。

    为了构建智能文本挖掘模型,学界对于机器阅读理解的研究从未止步。机器阅读理解作为目前热门的自然语言处理任务,目标是使机器在能够理解原文的基础上,正确回答与原文相关的问题。提高机器对语言的理解能力。机器阅读理解技术的发展对信息检索、问答系统、机器翻译等自然语言处理研究任务有积极作用,同时也能够直接改善搜索引擎、智能助手等产品的用户体验,因此,以阅读理解、文本挖掘为契机研究机器理解语言的技术,具有重要的研究与应用价值。

    1 . 2 挖掘目标

    我们要构建一个智能的文本挖掘模型。模型可以起到辅助阅读的作用,帮助人们显著提高阅读的效率。具体到使用情景上,对于用户输入的问题与文档,模型可以定位到文档中能帮我们回答问题的所在行,或者直接给出明确的某个词作为答案输出。

    更形式化地,我们要解决的智能阅读模型的构建问题可以被解释为一个三元组<D,Q,A>。三元组由文档 D,问题 Q 和答案 A 的答案组成。作为最大粒度的输出要求,我们需要把答案 A 定位到文档中的某一句话,为了解决这个问题,需要同时利用问题 Q 中的信息与文档 D 中的全部上下文信息。

    1 . 3 挖掘流程

    如图1挖掘主要分为两大部分,预处理部分和候选答案评分部分。其中预处理包括分词,去停用词,将词组向量化(word2vec)。候选答案评分部分为核心步骤,为了进一步挖掘上下文信息,将预处理得到的词向量放入 Bi-LSTM 网络, 为了进一步凸显处答句整句的语义信息,对答句进行 sentence2vec, 最后使用注意力机制对 Bi-LSTM 的解码端进行信息整合。最后对已经有了评分的候选集,设置阈值,输出预测结果。

    二、 预处理

    在这里插入图片描述

    图 1: 挖掘流程

    2 . 1 分词

    由于中文文本的特点是词与词之间没有明显的界限,从文本中提取词语时需要分词,本文采用 Python 开发的一个中文分词模块——jieba 分词,对问题和回答中的每一句话进行分词进行中文分词。

    jieba 分词用到的算法为最短路径匹配算法该算法首先利用词典找到字符串中所有可能的词条,然后构造一个有向无环图。其中,每个词条对应图中的一条有向边,并可利用统计的方法赋予对应的边长一个权值, 然后找到从起点到终点的最短路径, 该路径上所包含的词条就是该句子的切分结果。

    2 . 2 去停用词

    在文本处理中,停用词是指那些功能极其普遍,与其他词相比没有什么实际含义的词,它们通常是一些单字,单字母以及高频的单词,比如中文中的“我、的、了、地、吗”等,英文中的“the、this、an、a、of”等。对于停用词一般在预处理阶段就将其删除,避免对文本,特别是短文本,造成负面影响。本文所用的停用词,取自四川大学机器智能实验室停用词表。

    2 . 3 word2vec

    为了将语料输入神经网络进行训练,我们首先要将自然语言符号表示成计算机能够理解的数字形式。

    一个自然的想法是把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。这就是独热编码形式(One-Hot)。独热编码虽然方便易懂,但也有显而易见的不足:首先,One-hot 编码的维数由词典长度而定,过于稀疏,存在降维难问题,给计算造成了很大不便;其次,One-hot 编码下任意两个词之间都是孤立的,丢失了语言中的词义关系。

    Word2vec 是 Mikolov 在 2013 年提出的用于快速有效地训练词向量的模型[3]。作者的目标是要从海量的文档数据中学习高质量的词向量, 该词向量在语义和句法上都有很好地表现, 已经广泛应用于自然语言处理的各种任务中。Word2vec 包含了两种训练模型, 分别是 CBOW 和 Skip_gram 模型, 如图2所示。中 CBOW 模型利用上下文预测当前词, 而 Skip_gram 模型利用当前词预测其上下文。

    在这里插入图片描述

    图 2: 两种 word2vec 算法网络示意图

    我们使用 Skip_gram 模型构建智能阅读系统。Skip-gram 模型的训练目标就是使得下式的值最大:
    1 T ∑ t = 1 T ∑ − c ≤ j ≤ c l o g   p ( w t + j ∣ w t ) \frac{1}{T}\sum_{t=1}^{T} \sum_{-c \leq j\leq c} log \ p(w_t+j|w_t) T1t=1Tcjclog p(wt+jwt)

    其中, c c c 是窗口的大小, T T T 是训练文本的大小。基本的 Skip_gram 模型计算条件概率如下式:

    p ( w O ∣ w I ) = e x p ( v w O ′ T v w I ) ∑ W w = 1 e x p ( v w ′ T v w I ) p(w_O|w_I)=\frac{exp(v'^T_{w_O} v_{w_I})}{\sum_{W}^{w=1} exp(v'^T_{w} v_{w_I})} p(wOwI)=Ww=1exp(vwTvwI)exp(vwOTvwI)

    其中 v w v_w vw v ′ w v′w vw 是单词 w w w 的输入和输出向量, W W W是词典的大小。

    三、 对回答候选集评分

    3 . 1 Bi-LSTM 层

    为了尽可能保持语句中词组之间的上下文联系,我们决定将通过上一步 word2vec得到的词向量放入循环神经网。同时为了获得尽可能多的上下文记忆信息,我们最终选择了 Bi-LSTM 这一模型。

    3 . 1 . 1 RNN 和 LSTM

    循环神经网络(Recurrent Neural Network,RNN)近年来由于其良好的性能代替深度神经网络(Deep Neural Network,DNN)成为主流自然语言处理建模方案,相对于DNN,RNN 在隐层上增加了一个反馈,即 RNN 隐层的输入有一部分是前一级的隐层输出,这使 RNN 能够通过循环反馈看到当前时刻之前的信息,赋予了 RNN 记忆功能,能较好的表征上下文的语义。这些特点使得 RNN 非常适合用于对自然语言进行建模。如图3所示,所有的 RNN 都具有一种重复神经网络模块的链式形式, 在标准 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。

    在这里插入图片描述

    图 3: RNN 结构

    RNN 虽然看似简单,却也有一些严重的缺点。首先是过拟合,在现在广泛应用的端到端 RNN 系统中,RNN 对上下文相关性的拟合较强,而这会导致 RNN 相比与 DNN而言更易出现过拟合问题。其次是梯度消失和梯度爆炸,因为 RNN 比 DNN 更复杂,海量数据环境下的 RNN 模型训练难度较大,容易出现梯度消失和梯度爆炸问题,导致在构建大型系统方面表现较差。第三是 RNN 对较长的问句有严重语义遗忘问题,当相关信息和当前预测位置之间的间隔不断增大时,RNN 有限的记忆能力会因为信息不断增多而耗尽,因此当间隔增大,一部分初始的记忆信息就会被遗忘,这些长期依赖的遗忘和缺失最终会导致问句语义丢失。为了避免以上问题,我们选择用 LSTM 这一 RNN变种。

    长短期记忆网络(Long Short-Term Memory,LSTM),是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要事件。与标准 RNN 相比,LSTM在算法中加入了一个判断信息有用与否的“处理器”,这个处理器作用的结构被称为细胞。一个细胞当中被放置了三扇门,分别叫做输入门、遗忘门和输出门如图4所示,这些精心设计的“门”结构实现了 LSTM 遗忘或增加信息能力。一个信息进入 LSTM 的网络当中,可以根据规则来判断是否有用。只有符合算法认证的信息才会留下,不符的信息则通过遗忘门被遗忘。

    在这里插入图片描述

    图 4: LSTM 细胞结构

    某一时间步 t t t 的输入门 ( i t ) (i_t) (it) 和遗忘门 ( f t ) (f_t) (ft) 都以输入变量(即我们的备选答案编码 x t x_t xt)、上一个时间步 t − 1 t − 1 t1 的输入向量 ( h t − 1 ) (ht − 1) (ht1) 和偏置 ( b ) (b) (b) 作为输入,并通过激活函数得到响应值。

    忘记门层:忘记门层决定了 LSTM 何时会从系统状态中丢弃信息。其公式为:

    f t = δ ( W f ⋅ [ h t − 1 , x t ] + b f ) f_t = \delta(W_f \cdot [h_{t-1},x_t]+b_f) ft=δ(Wf[ht1,xt]+bf)

    当我们在输入中看到新的主语时,可以通过使用忘记门层忘记旧的主语,提高语义准确度。

    输入门层:输入门层确定了 LSTM 将要把什么样的信息保存在新的细胞状态中。其计算公式为:

    i t = σ ( W i ⋅ [ h ] t − 1 , x t ] + b f ) c t ‾ = t a n h ( W c ⋅ [ h ] t − 1 , x t ] + b f ) c t = f t ∗ c t − 1 + i t ∗ c t ‾ i_t=\sigma(W_i \cdot [h]_{t-1},x_t]+b_f)\\ \overline{c_t}= tanh(W_c \cdot [h]_{t-1},x_t]+b_f)\\ c_t=f_t*c_{t-1}+i_t* \overline{c_t} it=σ(Wi[h]t1,xt]+bf)ct=tanh(Wc[h]t1,xt]+bf)ct=ftct1+itct

    输出门层:最终 LSTM 使用输出门层确定需要输出的值,其计算公式为:

    o t = σ ( W o [ h t − 1 , x t ] + b o ) h t = o t ∗ t a n h ( c t ) o_t=\sigma(W_o[h_{t-1},x_t]+b_o)\\ h_t=o_t *tanh(c_t) ot=σ(Wo[ht1,xt]+bo)ht=ottanh(ct)

    3 . 1 . 2 Bi-LSTM

    由于自然语言的语义复杂性,语句的重要信息既可能出现在句首,也可能出现在句尾。普通的 LSTM 可以解决 RNN 的遗忘问题,但它只能做到根据前文理解后文,而无法做到根据后文理解前文,这样在某些情况下,LSTM 仍然可能丢失部分句首或者句尾的重要语义,因此我们最终决定用双向长短时记忆模型(Bi-LSTM)。Bi-LSTM 可以将原来按序的输入转化成一正一逆的两股输入,通过两个 LSTM 单元组成一个新的双向 LSTM 单元,以尽量弥补纯问答对匹配方式对上下文信息考虑的不足,一定程度上解决 RNN 与单向 LSTM 的遗忘问题。采用了 Bi-LSTM 的模型经过实验检验,比普通的 LSTM、RNN 效果有明显提升,它可以更完整的对句子的深层语义进行编码,中间编码向量与既包含了句首的语义信息,也保留了句尾的语义信息,因此能更好的表征语句的深层语义。如图5所示:
    在这里插入图片描述

    图 5: Bi-LSTM 网络结构

    设第二步 word2vec 得到的向量为 e ( x ) , x ∈ D , Q e(x),x ∈ D, Q e(x),xD,Q, 则 Bi-LSTM 网络可以表示为:
    h s ( s ) → = L S T M ( e ( x ) ) → h s ( s ) ← = L S T M ( e ( x ) ) ← h s ( s ) = [ h s ( s ) → , h s ( s ) ← ] \overrightarrow{h_s(s)}=\overrightarrow{LSTM(e(x))}\\ \overleftarrow{h_s(s)}= \overleftarrow{LSTM(e(x))}\\ h_s(s)= [\overrightarrow{h_s(s)}, \overleftarrow{h_s(s)}] hs(s) =LSTM(e(x)) hs(s) =LSTM(e(x)) hs(s)=[hs(s) ,hs(s) ]

    d d d 为单个 LSTM 的维度,则经过 Bi-LSTM 网络后的问句和答句中的词向量可表示为 h d o c ∈ R ∣ Q ∣ ∗ 2 d h_{doc} \in R^{|Q|*2d} hdocRQ2d h q u e r y ∈ R ∣ Q ∣ ∗ 2 d h_{query} \in R^{|Q|*2d} hqueryRQ2d

    3 . 2 句嵌入层

    Arora 等人在 2017 提出了一种简单但非常有效的计算句向量的算法。使用预估计的参数给句中的每个词向量赋予权重, 然后使用 PCA 或者 SVD 方法移除句向量中的无关部分。这种简单方法提高了文本相似性任务中的性能约 10%至 30%,并击败了使用 RNN 和 LSTM 的复杂的监督方法。相关算法流程如表1所示:

    表 1: 句向量表示算法
    在这里插入图片描述

    为了让注意力机制聚焦于语句,我们利用 Bi-LSTM 的输出 y 作为最终版本的词向量,应用 sentence2vec 算法,将答句的词向量转换成句向量,每条句向量成一行镶嵌成 h d o c h_{doc} hdoc, 再进行下一步处理。

    3 . 3 注意力层

    对于 Bi-LSTM, 其解码端的状态可以通过多种方式进行整合,较为简单的方法是直接采用最后一个时间片的状态,这种方法的有个比较明显的缺点是容易丢失句首的语义信息。另一种就是较为合理的方法就是将解码端的状态加权相加,也就是注意力(Attention 机制)。

    将第二步得到问句矩阵 h q u e r y h_{query} hquery 和由第三步得到句向量化的回答矩阵 h d o c h_{doc} hdoc,我们计算出一个成对匹配矩阵,它表明回答文档中的一句话和问句中的一个词的匹配程度,即将两矩阵做矩阵乘。
    M ( i , j ) = h d o c T ⋅ h q u e r y ( j ) M_(i,j)={h_{doc}}^T \cdot h_{query}(j) M(i,j)=hdocThquery(j)

    在得到成对匹配矩阵 M M M 后,我们逐列进行 sof tmax 操作,来获取每列的概率分布,其中对于问句中的单个词时每列是单个答句级别的注意力。即对于问句中的单个词,对应答句的单个词的注意力为:

    α ( t ) = s o f t max ⁡ ( M ( 1 , t ) , . . . M ( ∣ D ∣ , t ) ) α = [ α ( 1 ) , α ( 2 ) , . . . , α ( ∣ Q ∣ ) ] \alpha(t)= soft\max(M(1,t),...M(|D|,t))\\ \alpha = [\alpha(1),\alpha(2), ...,\alpha(|Q|)] α(t)=softmax(M(1,t),...M(D,t))α=[α(1),α(2),...,α(Q)]

    其中 α ( t ) ∈ R ∣ D ∣ \alpha(t) \in R^{|D|} α(t)RD表示时间 t t t 时回答中每句关于问句中单个词的注意力。

    3 . 4 ATT-over-ATT 层

    与其他模型应用简单的启发式方法(如求和或求平均)来将这些个体注意力集中到最后的注意力上不同,我们用另一种注意力机制来自动确定每个个体注意力。首先我们计算反向注意力,即对于时间 t t t 的每一个答句,我们计算出问句中单个词的重要性,以指出给定单个答句时, 问句中哪个词更重要。

    我们将对第三步骤得到的 M M M 矩阵的每一行做 sof tmax 归一化,即得到答句对问句中的单个词级别的注意力。设 β ( t ) ∈ R ∣ D ∣ \beta(t) \in R^{|D|} β(t)RD为答句对问句中的单个词级别的注意力,即

    β ( t ) = s o f t max ⁡ ( M ( 1 , t ) , . . . M ( t , ∣ Q ∣ ) ) \beta(t)= soft\max(M(1,t),...M(t,|Q|)) β(t)=softmax(M(1,t),...M(t,Q))
    问题级别的注意力 β,可以看作是对 β(t) 的加权平均,即

    β = 1 n ∑ t = 1 ∣ D ∣ β ( t ) \beta = \frac {1}{n}\sum_{t=1}^{|D|} \beta(t) β=n1t=1Dβ(t)

    3 . 5 注意力汇聚层

    经过第四步和第五步骤,我们得到了回答到问题级别的注意力 α 和问题级别的注意力 β, 最后,我们计算 α 与 β 的点积来获得回答级注意力,即将两个级别的注意力进行汇聚。汇聚示例如图6所示, 其中 1 到 9 为答句候选集中语句标号,通过汇聚表明答句 5,6 和 9 的是有关答句的可能性较高。

    s = α T β s=\alpha^T\beta s=αTβ
    该操作就是在时间 t t t 查看问句词组时,计算每个独立文档等级 α(t) 注意力的加权总和。通过这种方式,问句中的每个词的贡献考可以明确的了解到,并且最终的分数由每个查询词来“投票”得到。

    最后通过设定相关阈值,来确定,回答文档集合中的每一句是否是回答了问句,低于该阈值的记为无关,高于该阈值的记为有关。

    3 . 6 总结

    本节中所提出的神经网络架构如图7所示: s s s 中每个元素的值,即其对应位置的答句
    与问句的匹配分数,也可以理解为该答句是正确结果的可能性 P P P。即

    p ( v ∣ D , Q ) = ( s i ) y i ( 1 − s i ) 1 − y i , v ∈ V p(v|D,Q)=(s_i)^{y_{i}}(1-s_i)^{1-y_i},v \in V p(vD,Q)=(si)yi(1si)1yi,vV

    在这里插入图片描述

    图 6: 汇聚过程示意图

    其中语句空间为 V V V ,每一个语句表示为 v v v i i i 表示该语句所对应的句向量在其所属的句向量矩阵的第 i i i 行。我们将最大化正确答案的对数似然率作为训练目标。

    ℓ = ∑ i l o g ( p ( x ) ) , x ∈ A ℓ=\sum_{i}log(p(x)), x\in A =ilog(p(x)),xA

    则模型的损失函数为:

    L ( x ) = − ∑ i l o g ( p ( x ) ) L(x)= -\sum_{i}log(p(x)) L(x)=ilog(p(x))

    在这里插入图片描述

    图 7: 神经网络架构

    四、 实验评估

    本节中我们将对上文中我们建立的模型进行实验验证,通过与传统方法以及其他深度学习方法进行比较分析,从而说明我们模型的合理性与有效性,同时介绍与分析模型的最优参数调整过程与各类参数对模型性能的具体影响。

    4 . 1 实验平台

    实验环境的软件硬件配置如表2所示:
    • tensorflow: 由 Google 大脑小组的研究员和工程师们开发出来开源机器学习框架 tensorflow, 我们应用了其中 Bi-LSTM、Attention、Word2Vec,Softmax 这些深度学习算法。

    表 2: 实验环境配置
    在这里插入图片描述

    • numpy:NumPy 系统是 Python 的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比 Python 自身的嵌套列表(nested list structure) 结构要高效的多。是 TensorFlow 的前置依赖。

    • jieba: 在预处理部分用于中文的分词部分。同时为了加速训练和测试的速度,使用了显卡厂商 NVIDIA 推出的运算平台 CUDA和 cuDNN。

    4 . 2 实验数据来源

    (1) 出题方

    选取了出题方以 json 形式所给的 test_data_sample.json 和 test_data_complete.json中大约 55 万个 < Q , A , T > <Q,A,T> <Q,A,T> 三元组用于我们模型的训练和测试。

    (2) 百度 WebQA

    百度利用百度知道和其他资源,构建了 WebQA 数据集,目的是解决“如何从大片相关文本中,为给定问题提取正确的、简明的答案”问题,通过提供好的数据集进行训练,来发现好的算法。WebQA 中每条数据由 question,evidence,answer 三部分构成:question 是用户提出的问题。evidence 为对应的材料,即回答的文本段。answer 是一个答案列表(因为答案可能有多个),如果材料中并没有答案,那么答案是 [no_answer]。

    (3) 机器学习保险行业问答开放数据集

    该语料库包含从网站 Insurance Library 收集的问题和答案。这是保险领域首个开放的 QA 语料库,语料库的内容由现实世界的用户提出,高质量的答案由具有深度领域知识的专业人士提供。

    4 . 3 实验评价指标

    对于本文中的模型,我们采用精确率(Precision)、召回率(Recall)、两者的调和平均数 F1-Score、准确率(accuracy)、MRR、MAP 来评价我们模型的表现效果。以上指标的详细定义如下: 为了放便后面符号的说明定义一个混淆矩阵,如表3所示:

    表 3: 混淆矩阵
    在这里插入图片描述

    • TP(True Positive): 正类项目被判定为正类
    • F P(False Positive): 负类项目被判定为负类
    • F N(False Negative): 正类项目被判断为负类
    • T N(True Negative): 正类项目被判断为负类

    (1) 精准率 (Precision)

    是衡量某一检索系统的信号噪声比的一种指标,即检出的相关文献与检出的全部文献的百分比。
    p = T P T P + F P p =\frac {TP}{TP+FP} p=TP+FPTP

    (2) 召回率 (Recall)

    召回率 (Recall) 是检索出的相关文档数和文档库中所有的相关文档数的比率,衡量的是检索系统的查全率。

    R = T P T P + F N R =\frac {TP}{TP+FN} R=TP+FNTP

    (3) 准确率 (Accuracy)

    正确率(Accuracy)是指是指正确检索出的有关无关文档数,占文档库中所有文档数的比率。

    A = T P + T N T P + F P + F N + T N A= \frac {TP+TN}{TP+FP+FN+TN} A=TP+FP+FN+TNTP+TN

    (4)F1-Score

    分类的 F1 值就是准确率和召回率的调和平均值,具体计算公式为:

    F 1 = 2 P R P + R F1=\frac{2PR}{P+R} F1=P+R2PR

    (5)MRR

    最后我们的系统会对回答的每一个句子打一个分,然后设置阈值返回含有多个句子的集合,同时将得分高的结果考前返回,用 MRR 评判这个系统系统好坏就是看第一个正确答案的位置,第一个正确答案越靠前,MRR 评分越高,即:

    M R R = 1 ∣ Q ∣ ∑ i = 1 ∣ Q ∣ 1 r a n k i MRR= \frac{1}{|Q|} \sum_{i=1}^{|Q|} \frac{1}{rank_i} MRR=Q1i=1Qranki1
    其中,Q 为样本 query 集合,|Q| 表示 Q 中 query 个数, r a n k i rank_i ranki 表示在第 i i i q u e r y query query 中,第一个正确答案的排名。

    (6)MAP

    定义单个问题检测出的相关回答的准确率为 AP

    A P = ∑ k ∣ R ∣ r a n k k r a n k i ∣ A ∣ AP= \frac{\sum_{k}^{|R|} \frac{rank_k}{rank_i}}{|A|} AP=AkRrankirankk
    其中 A,R 分别为系统返回的相关回答和,其中正类项目的集合,|A|,|R| 表示 A 和 R集合的大小, r a n k i rank_i ranki r a n k k rank_k rankk 表示该条回答在 A 和 R 中的排名。

    MAP 则为对去一个查询集合中每条查询的 AP 值的平均,即
    M A P = ∑ k = 1 ∣ Q ∣ A P ( K ) ∣ Q ∣ MAP= \frac{\sum_{k=1}^{|Q|} AP(K)}{|Q|} MAP=Qk=1QAP(K)

    其中,Q 为样本 q u e r y query query 集合,|Q| 表示 Q Q Q q u e r y query query个数。

    4 . 4 实验设置及结果分析

    4 . 4 . 1 相关参数

    我们实现了基于 Attention-over-Attention 机制下的双向 LSTM 智能阅读模型,系统训练时相关参数设置如表4所示:

    表 4: 系统训练时相关参数
    在这里插入图片描述

    4 . 4 . 2 阈值确定

    模型经过最后的 attention-over-attention 机制得到的是对应位置答句与问句的匹配程度 P,我们需要设置一个阈值 δ, 当 P > δ 时,判断该答句为有关回答,即输出为 1; 反之,则判断该答句为无关回答,即输出为 0。同时实验来选取阈值 δ。

    由图8可以看出,权衡精准率和召回率,我们取 δ = 0.5 作为最后的阈值。

    在这里插入图片描述

    图8:阈值对性能的影响

    4.4.3相关结果

    (1)在不同数据集上验证模型的性能

    在这里插入图片描述

    图9:在不同数据集上模型的性能

    如图9所示,为模型在题目给定数据集,百度WebQA和保险行业语聊库上的相关性能。在三个数据集上,我们的模型均表现出了优异的性能,说明该模型可以成功捕捉到不同语料库中的问答关系,具有较强的泛化能力。

    (2)使用不同的词嵌入方法的相关性能

    在这里插入图片描述

    图10:采用不同的词嵌入方法的相关性能

    在实验过程中,为了确定最佳方案,我们分别使用Skip_gram算法,CBOW算法与传统的One-hot编码算法对语料进行词嵌入处理,并将测得性能进行了对比。实验结果,如图10所示。Skip_gram与CBOW同属Word2vec方法,而使用Word2vec获得的F1-score是只使用One-Hot方法的3.5倍,这说明Word2vec算法的性能要明显优于One-hot编码,而Word2vec中,Skip_gram与CBOW性能相近,多次实验统计结果的平均水平表明,Skip_gram的F1-score比CBOW高6.484%,ACC低1.337%,MAP高1.639%,MRR高1.467%,Skip_gram略好于CBOW,因此我们最终采用Skip_gram 算法进行词嵌入。

    (3)采用sentence2vec、普通RNN生成句向量和不采用句向量下相关性能

    在这里插入图片描述

    图11:采用sentence2vec、普通RNN生成句向量和不采用句向量下相关性能

    如图11所示,采用sentence2vec,F1-score比基于RNN生成句向量的模型高15.405%,比不使用句向量的模型高19.776%。经过分析,与基于RNN生成句向量的模型相比,sentence2vec不会出现梯度消失问题,且训练速度明显加快;而sentence2vec嵌入的句向量兼顾了上下文提取句意,有助于最终将答案定位到具体的句子;与不使用句向量、仅用词向量的模型相比,性能提升很大。

    (4)采用Attention-over-Attention机制和与不采用机制下相关性能

    如图12所示,采用Attention-over-Attention机制后,F1-score比起单一注意力提高了22.350%。Attention-over-Attention机制捕捉了答案到问题、问题到答案的双重注意力,使模型可以利用问句和答句之间的交互信息,这样的机制比起只依赖单一注意力的普通模型,兼顾利用的信息更多,因此性能更优。

    在这里插入图片描述

    图12:采用Attention-over-Attention机制和与不采用机制下相关性能

    (5)本文模型与其他模型相比较

    如图13所示,我们在出题方所给的数据库上,我们分别对比了基于传统方法进行语义分析的模型与基于卷积神经网络的模型,我们的模型均优于上述模型。
    在这里插入图片描述

    图13:本文模型与其他模型相比较

    五、模型优化

    5.1对问句语义提取

    可以将知识库理解为一个三元组组成的集合实体,实体关系,实体。智能的阅读系统就算是可以看作给定一个实体和一个联系,查看候选答句中是否包另一个实体。

    因此可以首先基于语义分析的方法通过将实体和联系进行识别和标注将自然语言形式的问句转换为lambda表达式或依存组合语义树等逻辑表达形式。通过对这种逻辑表达形式,进行向量化表示,从而进一步加强,对语义的聚焦。

    5.2文本蕴含

    文本蕴含 (textual entailment) 是指文本对之间的指向关系,用符号 T 表示被蕴含的文本,用 H 表示被蕴含的文本,也就是假设。如果 H 意思能够从 T 中推导出来,那么就认为 T 蕴含 H。

    我们也可以将文本蕴含的相关思想运用到智能阅读系统中,对候选答案进行重排序。因为可以假设在一个已经存在的阅读系统中返回的最佳的候选答案,虽然最佳候选答案可能不是正确答案,但是在大多数情况下正确答案位于返回的候选答案集合中。

    因此可能创建一个蕴含对的集合,其中将系统返回的候选答案合并作为蕴含对的文本,将转换的问题作为蕴含对的假设。文本蕴含系统接下来依次应用在蕴含对上,那些能蕴含转换文本的候选蕴含对移到列表的顶端,非蕴含的则移动到底部。Harabagiu 和Hickl[15] 在问答系统上对文本蕴含计算进行了测试,系统的准确率得到提高。

    5 . 3 未来改进

    由以上论述可知,对于输入的问题,我们的模型可以出色地完成将答案定位到所在句子的任务。下一步,我们希望继续改进模型,实现更细粒度的答案提取。如果需要将答案定位到词语,我们可以去掉嵌入句向量的步骤,用 Bi-LSTM 得到的蕴含上下文信息的词向量进行 Attention-over-Attention 的计算。按列计算的注意力代表了问题中每个词选择答案的重要性,按行计算的注意力代表了文档中的每个词响应问题的重要性。正反注意力经过点乘,最终获取的注意力向量每个分量值含义为文档中每个词与问题的匹配分数。统计每个词对应分量值之和,即以该词作为答案时与问题的匹配分数之和,获得所有和值并排序,分数越高则该词是正确答案的可能性越大。

    六、 参考文献

    1] https://github.com/fxsjy/jieba

    [2] http://www.scu.edu.cn/cs/xsky/gjhy/webinfo/2014/12/1416879433948314.htm

    [3] MIKOLOV T, CHEN K, CORRADO G, et al. Efficient Estimation of Word Representations in Vector Space[J]. arXiv preprint arXiv, 2013.

    [4] A simple but tough-to-beat baseline for sentence embeddings.”Arora, Sanjeev,
    Yingyu Liang, and Tengyu Ma.2017.

    [5] MikolovT, Karafiat M,Burget L,et al.Recurrent neural network based language
    model[C].Interspeech.2010,2:3.

    [6] Hochreiter S,Schmidhuber J.Longshort-term memory[J].Neural
    computation,1997,9(8):1735-1780.

    [7] Yiming Cui, Zhipeng Chen, Attention-over-Attention Neural Networks for Reading
    Comprehension, 2016.

    [8] Diederik Kingma and Jimmy Ba. 2014. Adam: A method for stochastic optimization.
    arXiv preprint arXiv:1412.6980 .

    [9] www.tensorflow.org/

    [10] Van Der Walt S,Colbert S C,Varoquaux G.The NumPy array:a structure for efficient
    numerical computation[J].computing in Science & Engineering,2011,13(2):22-30

    [11] http://www.nvidia.cn/object/cudazone-cn.html

    [12] https://developer.nvidia.com/cudnn

    [13] http://idl.baidu.com/WebQA.html

    [14] https://github.com/Samurais/insuranceqa-corpus-zh

    [15] A.Esuli and F.Sebastiani,and T.Fukushima,”Collecting evaluative expressions for
    opinion extraction” in Proceedings of International Joint Conference on NaturalLanguage Processing and Computational Linguistics,2006.

    展开全文
  • NER的BERT-BILSTM-GCN-CRF 在原本BERT-BILSTM-CRF上融合GCN和词性标签等做NER任务 数据格式 高B-剧种B-名词腔I-剧种I-名词:OO马B-人名B-名词平I-人名I-名词所OO着O B动词扶O B动词贫O I动词小O B -名词I O-名词 ...
  • 情感分析分类 先决条件 安装依赖项 pip install -r requirements.txt 安装Spacy英语数据 python -m spacy download en 框架 火炬 数据集 Cornell MR(电影评论)数据集 ... LSTMLSTM LSTM +注意 有线电视新闻网
  • 单词嵌入和字符嵌入都被用作训练Bi-LSTM的特征向量。 CRF模型用于标签的联合解码。 系统显示开发数据F1分数为92.87%,测试数据F1分数为94.66%。 使用的数据集和获得的元结果可免费发布以供研究使用。
  • Bi-LSTM-CRF命名实体识别实战

    千次阅读 2020-04-07 22:36:59
    链接:https://tianchi.aliyun.com/competition/entrance/231687/information  二、Bi-LSTM-CRF模型介绍 (一)Bi-LSTM RNN为循环神经网络(Recurrent Neural Network),与全连接网络的不同之处是其隐藏层之间是...
  • LSTMBi-LSTM

    千次阅读 2020-10-15 15:28:36
    什么是LSTM与Bi-LSTM LSTM的全称是Long Short-Term Memory,它是RNN(Recurrent Neural Network)的一种。...BiLSTM是Bi-directional Long Short-Term Memory的缩写,是由前向LSTM与后向LSTM组合而成。两者在自
  • 序列标注之Bi-LSTM-CRF

    2020-03-05 21:50:54
    文章目录Bi-LSTM-CRF1. 模型原理1.1 CRF原理2. 模型实现2.1 tensorflow实现2.2 pytorch实现 Bi-LSTM-CRF 1. 模型原理 1.1 CRF原理 2. 模型实现 2.1 tensorflow实现 2.2 pytorch实现 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,122
精华内容 4,848
关键字:

Bi-lstm