序列标注

序列标注,序列标注,序列标注!

序列标注问题是NLP中最常见的问题。“序列标注问题是我们要解决源问题的子问题,是解决大部分问题之基础”。

序列标注:输入一个线性序列,给序列中每一个元素打上标签集合中的某个标签。(通俗得讲:如何根据汉字的上下文给汉字打上一个合适的标签)

常见问题:分词,词性标注,命名实体识别(NER),关键词抽取,词义角色标注等等。

常用解决模型:

NER 任务中的常用模型包括生成式模型HMM、判别式模型CRF等。

条件随机场(ConditionalRandom Field,CRF)是NER目前的主流模型。它的目标函数不仅考虑输入的状态特征函数,而且还包含了标签转移特征函数。在训练时可以使用SGD学习模型参数。在已知模型时,给输入序列求预测输出序列即求使目标函数最大化的最优序列,是一个动态规划问题,可以使用Viterbi算法解码来得到最优标签序列。

CRF的优点在于其为一个位置进行标注的过程中可以利用丰富的内部及上下文特征信息。

具体如何处理?

答:将token从离散one-hot表示映射到低维空间中成为稠密的embedding,随后将句子的embedding序列输入到RNN中,用神经网络自动提取特征,Softmax来预测每个token的标签。

 

BiLSTM就可以实现序列标注,为什么还要接一个CRF模型?

答:BiLSTM的softmax层的输出是相互独立的,即虽然BiLSTM学习到了上下文的信息,但是输出相互之间并没有影响,它只是在每一步挑选一个最大概率值的label输出。这样就会导致如B-person后再接一个B-person的问题。而crf中有转移特征,即它会考虑输出label之间的顺序性,所以考虑用crf去做BiLSTM的输出层。
1.CRF考虑了标签顺序性。

2.CRF提供了更多的可调试空间。

 

 

今天来针对于NER问题,来进行几个常用模型的梳理。

 

BiLSTM-CRF

keras框架中已对CRF模型封装好了,直接下载使用即可:https://github.com/keras-team/keras-contrib

代码块

model = Sequential()
model.add(Embedding(len(vocab), EMBED_DIM))
model.add(Bidirectional(LSTM(BiRNN_UNITS // 2, return_sequences=True)))
crf = CRF(len(chunk_tags), sparse_target=True)
model.add(crf)

model.summary()
model.compile('adam', loss=crf.loss_function, metrics=[crf.accuracy])

【输入参数】
train_x:(batch_size,maxLength)           每句话的词索引(不足用0补全)

【输出参数】

train_y:(batch_size,maxLength,label_class)        每个词对应的标签索引

output:(batch_size,maxLength,label_class)    针对预测时,我们只取真实句长对应的标注即可,取realLength而不是取maxLength

 

Bert

关于Bert之前谈过简单入门使用:Bert操练起来   五分钟搭建一个基于BERT的NER模型

通常使用bert预训练模型+下游模型LSTM/crf模型,完成序列标注任务。
1

发表评论

电子邮件地址不会被公开。 必填项已用*标注

微信扫一扫

微信扫一扫

微信扫一扫,分享到朋友圈

序列标注
嘿!有什么能帮到您的吗?
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close