如何使用深度学习执行文本实体提取?‘下载雷火电竞官网入口(官方)APP下载安装IOS/登录入口/手机app’
本文讲解了如何用于深度自学继续执行文本实体萃取。作者尝试了分别用于深度自学和传统方法来萃取文章信息,结果深度自学的准确率超过了85%,相比之下领先于传统算法的65%。
章节文本实体萃取是自然语言处置(NLP)的主要任务之一。随着近期深度自学领域较慢发展,我们可以将这些算法应用于到NLP任务中,并获得准确率近超强传统方法的结果。我尝试过分别用于深度自学和传统方法来萃取文章信息,结果十分难以置信:深度自学的准确率超过了85%,相比之下领先于传统算法的65%。本项目的目标是把文章中的每个单词标示为以下四种类别之一:的组织、个人、杂项以及其他;然后寻找文中最引人注目的的组织和名称。
深度自学模型对每个单词已完成上述标示,随后,我们用于基于规则的方法来过滤器掉我们不想的标示,并确认最引人注目的名称和的组织。在这里要感激GuillaumeGenthial这篇关于序列标示的文章(https://guillaumegenthial.github.io/),本项目创建在这篇文章的基础之上。模型的高级架构架构右图是对每个单词展开分类标示的模型高级架构。在建模过程中,最耗时间的部分是单词分类。
我将说明模型的每个组成部分,协助读者对模型组件有一个全面的、更加高层次的解读。一般来说,模型组件可分成三部分:单词密切相关:在建模第一步,我们必须做到的是读取一些实训练词映射(GloVe)。同时,我们必须从字符中萃取出有一些含义。语境单词密切相关:我们必须利用LSTM,对语境中的每一个单词获得一个有意义的密切相关。
解码:当我们获得回应单词的向量后,我们就可以用它展开预测。hotencoding(用数值回应单词)深度自学算法只拒绝接受数值型数据作为输出,而无法处置文本数据。如果想在大量的非数值场景下用于深度神经网络,就必须将输出数据改变数值形式。这个过程就是hotencoding。
下面是部分段构建hotencoding的代码示例:word_counts=Counter(words)sorted_vocab=sorted(word_counts,key=word_counts.get,reverse=True)int_to_vocab={ii:wordforii,wordinenumerate(sorted_vocab)}vocab_to_int={word:iiforii,wordinint_to_vocab.items()}某种程度地,我们必需提供输出数据中的所有字符,然后将其转化成为向量,作为字符映射。单词映射字符映射单词映射是处置文本问题时用于的一种通过自学获得的密切相关方式,其中含义完全相同的单词密切相关相似。
一般来说,我们利用神经网络来构建单词映射,其中用于的单词或短语来自于词库,并必须改变为实数包含的向量形式。但是,在数据集上分解词向量计算成本很高,我们可以用于一些实训练的单词映射来防止这个问题:比如用于斯坦福大学的NLP研究者获取的GloVe向量。字符映射是字符的向量密切相关,可用作推论词向量。之所以不会用于字符映射,是因为许多实体并没对应的预训练词向量,所以我们必须用字符向量来计算出来词向量。
LSTM传统神经网络VS循环神经网络(RNN)循环神经网络(RNN)是人工神经网络的一种,用作序列数据中的模式识别,例如文本、基因组、手写笔迹、口语词汇,或者来自传感器、股市和政府机构的数值型时间序列数据。它可以「解读」文本的语境含义。
RNN神经元LSTM是一种类似的循环神经网络,比起于非常简单的循环神经网络,它可以存储更好的语境信息。非常简单的RNN和LSTM之间的主要区别在于它们各自神经元的结构有所不同。对于语境中的每一个单词,我们都必须利用LSTM获得它在所处语境中的有意义密切相关。
条件随机场(CRF)在预测标示最后的解码步骤中,我们可以用于softmax函数。当我们用于softmax函数时,它得出单词归属于每个分类的概率。但这个方法得出的是局部自由选择;换句话说,即使我们从文本语境中萃取出有了一些信息,标示决策过程仍然是局部的,我们在用于softmax转录函数时,并没用于到附近单词的标示决策。
例如,在「NewYork」这个词中,我们将「York」标示为一个地方,事实上,这应当可以协助我们确认『New』对应地方的开始。在CRF中,我们的输出数据是序列数据;同时,我们在某个数据点上展开预测时,必须考虑到先前文本的语境。在本项目中,我们用于的是线性链CRF。在线性链CRF中,特征只倚赖当前标示和之前的标示,而不是整个句子中的给定标示。
为了对这个不道德建模,我们将用于特征函数,该函数包括多个输出值:句子s单词在句子中的方位i当前单词的标示l_i前一个单词的标示l_i?1接下来,对每一个特征函数f_j彰显权重λ_j。等价一个句子s,现在我们可以根据下式计算出来s的标示l:对句子中所有单词的权重特征议和。
基于词性标示的特征函数示例如果l_i=ADVERB,且第i个单词以『-ly』结尾,则f_1(s,i,l_i,l_i?1)=1,否则所取0。如果对应的权重λ1为于是以,且十分大,那么这个特征基本上就回应我们偏向于把以『-ly』结尾的单词标示为ADVERB。如果i=1,l_i=VERB,且句子以问号结尾,则f_2(s,i,l_i,l_i?1)=1,否则所取0。
如果对应的权重λ2为于是以,且十分大,那么这个特征基本上就回应我们偏向于把疑问句的第一个单词标为VERB。(事例,「Isthisasentencebeginningwithaverb?」)如果l_i?1=ADJECTIVE,且l_i=NOUN,则f_3(s,i,l_i,l_i?1)=1,否则为0。对应权重为正时,回应我们偏向于指出名词跟在形容词之后。
如果l_i?1=PREPOSITION,且l_i=PREPOSITION,则f_4(s,i,l_i,l_i?1)=1。此函数对应的权重λ4为负,回应介词不应当回来另一个介词,因此我们应当防止这样的标示经常出现。最后,我们可以通过所取指数和归一化,将这些分数切换为0~1之间的概率p(l|s)。
总之,要创建一个条件随机场,你只必须定义一组特征函数(可以依赖整个句子、单词的当前方位和附近单词的标示)、彰显权重,然后特一起,最后如果有必须,转化成为概率形式。非常简单地说道,必须做到两件事情:1.寻找分数最低的标示序列;2.在全体标示序列上求出有概率分布。
幸运地的是,TensorFlow获取了涉及的库,协助我们可以很更容易地构建CRF。log_likelihood,transition_params=tf.contrib.crf.crf_log_likelihood(scores,labels,sequence_lengths)模型的运营原理对于每一个单词,我们期望创建一个向量来捕猎其意义以及和任务涉及的特征。我们将该向量建构为GloVe单词映射与包括字符级特征的向量的级联。
我们还可以自由选择用于一些特定的神经网络,自动萃取出有这些特征。在本文中,我们将在字符层面上用于双向LSTM算法。我们将CONLL数据集中于的所有单词都展开hot-encode,这些单词都在GloVe单词映射中有对应的实体。
如上文所述,神经网络只拒绝接受向量,不拒绝接受文本,因此我们必须将单词切换为向量。CONLL数据集包括单词及其对应标示。
在hotencoding后,单词和标示都被转换成了向量。用作hotencoding单词及其对应标示的代码:withopen(self.filename)asf:words,tags=[],[]forlineinf:line=line.strip()if(len(line)==0orline.startswith(-DOCSTART-)):iflen(words)!=0:niter+=1ifself.max_iterisnotNoneandniterself.max_iter:breakyieldwords,tagswords,tags=[],[]else:ls=line.split()word,tag=ls[0],ls[-1]ifself.processing_wordisnotNone:word=self.processing_word(word)ifself.processing_tagisnotNone:tag=self.processing_tag(tag)words+=[word]tags+=[tag]用作萃取单词、标示和字符向量的代码:ifvocab_charsisnotNoneandchars==True:char_ids=[]forcharinword:#ignorecharsoutofvocabularyifcharinvocab_chars:char_ids+=[vocab_chars[char]]iflowercase:word=word.lower()ifword.isdigit():word=NUMifvocab_wordsisnotNone:ifwordinvocab_words:word=vocab_words[word]else:ifallow_unk:word=vocab_words[UNK]else:print(word)print(vocab_words)ifvocab_charsisnotNoneandchars==True:returnchar_ids,wordelse:returnword现在,我们用于TensorFlow内置的函数读取单词映射。假设embeddings是一个GloVe映射的numpy数组,其中embeddings[i]回应第i个单词的向量形式。
L=tf.Variable(embeddings,dtype=tf.float32,trainable=False)pretrained_embeddings=tf.nn.embedding_lookup(L,word_ids)现在,我们可以建构根据字符获得的单词映射。这里,我们不必须任何实训练字符映射。
_char_embeddings=tf.get_variable(name=_char_embeddings,dtype=tf.float32,shape=[self.config.nchars,self.config.dim_char])char_embeddings=tf.nn.embedding_lookup(_char_embeddings,self.char_ids_tensor,name=char_embeddings)s=tf.shape(char_embeddings)char_embeddings=tf.reshape(char_embeddings,shape=[s[0]*s[1],s[-2],self.config.dim_char])word_lengths=tf.reshape(self.word_lengths_tensor,shape=[s[0]*s[1]])cell_fw=tf.contrib.rnn.LSTMCell(self.config.hidden_size_char,state_is_tuple=True)cell_bw=tf.contrib.rnn.LSTMCell(self.config.hidden_size_char,state_is_tuple=True)_output=tf.nn.bidirectional_dynamic_rnn(cell_fw,cell_bw,char_embeddings,sequence_length=word_lengths,dtype=tf.float32)一旦获得了单词密切相关,我们就可以必要在词向量序列上运营bi-LSTM,获得另一个向量序列。cell_fw=tf.contrib.rnn.LSTMCell(self.config.hidden_size_lstm)cell_bw=tf.contrib.rnn.LSTMCell(self.config.hidden_size_lstm)(output_fw,output_bw),_=tf.nn.bidirectional_dynamic_rnn(cell_fw,cell_bw,self.word_embeddings,sequence_length=self.sequence_lengths_tensor,dtype=tf.float32)output=tf.concat([output_fw,output_bw],axis=-1)output=tf.nn.dropout(output,self.dropout_tensor)现在,每个单词都和一个向量对应,其中向量记录了这个单词的含义、字符和语境。
我们用于向量来做到最后的预测。我们可以用于仅有相连神经网络欲出有一个向量,该向量中每个条目对应每个标示的分数。W=tf.get_variable(W,dtype=tf.float32,shape=[2*self.config.hidden_size_lstm,self.config.ntags])b=tf.get_variable(b,shape=[self.config.ntags],dtype=tf.float32,initializer=tf.zeros_initializer())nsteps=tf.shape(output)[1]output=tf.reshape(output,[-1,2*self.config.hidden_size_lstm])pred=tf.matmul(output,W)+bself.logits=tf.reshape(pred,[-1,nsteps,self.config.ntags])最后,我们用于CRF方法来计算出来每个单词的标示。构建CRF只必须一行代码!下面的代码计算出来出有了损失,同时回到了在预测时很简单的trans_params。
log_likelihood,_trans_params=tf.contrib.crf.crf_log_likelihood(self.logits,self.labels_tensor,self.sequence_lengths_tensor)self.trans_params=_trans_paramsself.loss=tf.reduce_mean(-log_likelihood)现在,我们可以定义我们的训练算子:optimizer=tf.train.AdamOptimizer(self.lr_tensor)self.train_op=optimizer.minimize(self.loss)一旦我们定义好模型,在数据集上已完成很少的几次递归,就可以获得训练好的模型了。如何用于训练好的模型TensorFlow获取了存储模型权重的功能,这样我们就可以在之后的场景中复原训练好的模型。无论什么时候必须展开预测,我们都可以读取模型权重,这样就不必须新的训练了。defsave_session(self):Savessession=weightsifnotos.path.exists(self.config.dir_model):os.makedirs(self.config.dir_model)self.saver.save(self.sess,self.config.dir_model)defrestore_session(self,dir_model):self.saver.restore(self.sess,dir_model)每篇文章都被分解成为单词再输入到模型中,然后经过上文所述一系列过程,获得输入结果。
模型最后输入结果将每个单词分成4类:的组织、个人、杂项以及其他。这个算法通过基于规则的方法过滤器结果,然后更进一步准确萃取出有文本中最引人注目的名称和的组织,它并没超过100%的准确率。
本文关键词:下载雷火电竞官网入口,下载雷火电竞官网入口最新版V7.24.568,下载雷火电竞官网入口(官方)APP下载安装IOS/登录入口/手机app
本文来源:下载雷火电竞官网入口-www.zzwfh.com