You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

tutorial_6_seq_labeling.rst 5.8 kB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. =====================
  2. 快速实现序列标注模型
  3. =====================
  4. 这一部分的内容主要展示如何使用fastNLP 实现序列标注任务。你可以使用fastNLP的各个组件快捷,方便地完成序列标注任务,达到出色的效果。
  5. 在阅读这篇Tutorial前,希望你已经熟悉了fastNLP的基础使用,包括基本数据结构以及数据预处理,embedding的嵌入等,希望你对之前的教程有更进一步的掌握。
  6. 我们将对CoNLL-03的英文数据集进行处理,展示如何完成命名实体标注任务整个训练的过程。
  7. 载入数据
  8. ===================================
  9. fastNLP可以方便地载入各种类型的数据。同时,针对常见的数据集,我们已经预先实现了载入方法,其中包含CoNLL-03数据集。
  10. 在设计dataloader时,以DataSetLoader为基类,可以改写并应用于其他数据集的载入。
  11. .. code-block:: python
  12. class Conll2003DataLoader(DataSetLoader):
  13. def __init__(self, task:str='ner', encoding_type:str='bioes'):
  14. assert task in ('ner', 'pos', 'chunk')
  15. index = {'ner':3, 'pos':1, 'chunk':2}[task]
  16. #ConllLoader是fastNLP内置的类
  17. self._loader = ConllLoader(headers=['raw_words', 'target'], indexes=[0, index])
  18. self._tag_converters = None
  19. if task in ('ner', 'chunk'):
  20. #iob和iob2bioes会对tag进行统一,标准化
  21. self._tag_converters = [iob2]
  22. if encoding_type == 'bioes':
  23. self._tag_converters.append(iob2bioes)
  24. def load(self, path: str):
  25. dataset = self._loader.load(path)
  26. def convert_tag_schema(tags):
  27. for converter in self._tag_converters:
  28. tags = converter(tags)
  29. return tags
  30. if self._tag_converters:
  31. #使用apply实现convert_tag_schema函数,实际上也支持匿名函数
  32. dataset.apply_field(convert_tag_schema, field_name=Const.TARGET, new_field_name=Const.TARGET)
  33. return dataset
  34. 输出数据格式如:
  35. {'raw_words': ['on', 'Friday', ':'] type=list,
  36. 'target': ['O', 'O', 'O'] type=list},
  37. 数据处理
  38. ----------------------------
  39. 我们进一步处理数据。将数据和词表封装在 :class:`~fastNLP.DataBundle` 类中。data是DataBundle的实例。
  40. 我们输入模型的数据包括char embedding,以及word embedding。在数据处理部分,我们尝试完成词表的构建。
  41. 使用fastNLP中的Vocabulary类来构建词表。
  42. .. code-block:: python
  43. word_vocab = Vocabulary(min_freq=2)
  44. word_vocab.from_dataset(data.datasets['train'], field_name=Const.INPUT)
  45. word_vocab.index_dataset(*data.datasets.values(),field_name=Const.INPUT, new_field_name=Const.INPUT)
  46. 处理后的data对象内部为:
  47. dataset
  48. vocabs
  49. dataset保存了train和test中的数据,并保存为dataset类型
  50. vocab保存了words,raw-words以及target的词表。
  51. 模型构建
  52. --------------------------------
  53. 我们使用CNN-BILSTM-CRF模型完成这一任务。在网络构建方面,fastNLP的网络定义继承pytorch的 :class:`nn.Module` 类。
  54. 自己可以按照pytorch的方式定义网络。需要注意的是命名。fastNLP的标准命名位于 :class:`~fastNLP.Const` 类。
  55. 模型的训练
  56. 首先实例化模型,导入所需的char embedding以及word embedding。Embedding的载入可以参考教程。
  57. 也可以查看 :mod:`~fastNLP.modules.encoder.embedding` 使用所需的embedding 载入方法。
  58. fastNLP将模型的训练过程封装在了 :class:`~fastnlp.trainer` 类中。
  59. 根据不同的任务调整trainer中的参数即可。通常,一个trainer实例需要有:指定的训练数据集,模型,优化器,loss函数,评测指标,以及指定训练的epoch数,batch size等参数。
  60. .. code-block:: python
  61. #实例化模型
  62. model = CNNBiLSTMCRF(word_embed, char_embed, hidden_size=200, num_layers=1, tag_vocab=data.vocabs[Const.TARGET], encoding_type=encoding_type)
  63. #定义优化器
  64. optimizer = Adam(model.parameters(), lr=0.005)
  65. #定义评估指标
  66. Metrics=SpanFPreRecMetric(tag_vocab=data.vocabs[Const.TARGET], encoding_type=encoding_type)
  67. #实例化trainer
  68. trainer = Trainer(train_data=data.datasets['train'], model=model, optimizer=optimizer, dev_data=data.datasets['test'], batch_size=10, metrics=Metrics,callbacks=callbacks, n_epochs=100)
  69. #开始训练
  70. trainer.train()
  71. 训练中会保存最优的参数配置。
  72. 训练的结果如下:
  73. .. code-block:: python
  74. Evaluation on DataSet test:
  75. SpanFPreRecMetric: f=0.727661, pre=0.732293, rec=0.723088
  76. Evaluation at Epoch 1/100. Step:1405/140500. SpanFPreRecMetric: f=0.727661, pre=0.732293, rec=0.723088
  77. Evaluation on DataSet test:
  78. SpanFPreRecMetric: f=0.784307, pre=0.779371, rec=0.789306
  79. Evaluation at Epoch 2/100. Step:2810/140500. SpanFPreRecMetric: f=0.784307, pre=0.779371, rec=0.789306
  80. Evaluation on DataSet test:
  81. SpanFPreRecMetric: f=0.810068, pre=0.811003, rec=0.809136
  82. Evaluation at Epoch 3/100. Step:4215/140500. SpanFPreRecMetric: f=0.810068, pre=0.811003, rec=0.809136
  83. Evaluation on DataSet test:
  84. SpanFPreRecMetric: f=0.829592, pre=0.84153, rec=0.817989
  85. Evaluation at Epoch 4/100. Step:5620/140500. SpanFPreRecMetric: f=0.829592, pre=0.84153, rec=0.817989
  86. Evaluation on DataSet test:
  87. SpanFPreRecMetric: f=0.828789, pre=0.837096, rec=0.820644
  88. Evaluation at Epoch 5/100. Step:7025/140500. SpanFPreRecMetric: f=0.828789, pre=0.837096, rec=0.820644