BiLSTM + CRF 命名实体识别实践(下)

0. 前言

上一篇博客简单讨论了理论知识,这篇博客主要是实践部分,主要针对上一篇博客中提到的代码的优化。优化点和实践点主要包含以下几个方面:

(1)max_seq_len如何取值?

(2)learning rate设置多少合适?

(3)sequence_len不固定会给模型带来多大的提升?

(4)batch_size不固定,方便预测

(5)词向量的预训练能给模型带来哪些好处?

(6)特定业务场景下,如何迁移?

注:数据集为公开数据集boson.

 

1. max_seq_len取值

BiLSTM + CRF 命名实体识别实践(下)_第1张图片 boson 数据集句子长度分布情况

从上图不难看出,大部分句子的长度不超过50。源代码设置max_seq_len=60,这里觉得设置成50就可以了。

 

2. learning rate会影响模型效果吗

通过实验发现,learning rate不仅会影响模型的训练速度,还会影响最终的模型效果。learning rate=0.01可以加速模型的收敛速度,但是其f score只能达到50%+, 而learning rate=0.001时,f score可以达到60%+,这表明 learning rate太大导致模型在训练的过程中出现了严重的震荡现象。

 

3. sequence_len不固定

原先代码的sequence_len都设置为max_seq_len,现改为实际句子长度。

 

4. batch_size不固定

改变网络结构,使得预测时不用把数据按照batch_size来分批处理。提高预测速度。

 

5.词向量的预训练给模型带来的好处

通过查看vec.txt提前预训练的词向量文件,发现实际出现的字都出现在该文件中,因此可以加速模型的收敛。但是否需要进一步训练还需要进一步尝试,与样本量和数据是否同分布有关。

实验表明,采用预训练的词向量可以快速使模型收敛,但是最终表现效果没有明显提升。此外还尝试,在模型训练时不对字向量进行upate,发现效果表现更差。另外learning rate需要修改为0.01,不然模型训练太慢。我想可能是样本集数量太少导致。

 

6. 特定业务场景下,如何迁移?

如果实际业务只是识别出公司名称,可以只保留公司的标签,其他的都改为O。此外还可以扩充一些特定业务场景下的数据集。

 

改进后代码:

├── Batch.py # 实现batch功能
├── bilstm_crf.py # 模型定义
├── data # 数据文件夹
│   ├── Bosondata.pkl # 训练数据的输入(加工后)
│   ├── generate_dataset.py # 数据加工脚本,将原数据处理成模型需要的格式
│   └── wordtagsplit.txt # 原数据
├── train.py # 训练相关的代码
└── utils.py # 功能函数

下载地址:https://download.csdn.net/download/jingyi130705008/12657357

你可能感兴趣的:(深度学习,bilstm,crf,ner,tensorflow)