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.7 kB

6 years ago
6 years ago
6 years ago
6 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. =====================
  2. 快速实现序列标注模型
  3. =====================
  4. 这一部分的内容主要展示如何使用fastNLP 实现序列标注任务。你可以使用fastNLP的各个组件快捷,方便地完成序列标注任务,达到出色的效果。
  5. 在阅读这篇Tutorial前,希望你已经熟悉了fastNLP的基础使用,尤其是数据的载入以及模型的构建,通过这个小任务的能让你进一步熟悉fastNLP的使用。
  6. 我们将对基于Weibo的中文社交数据集进行处理,展示如何完成命名实体标注任务的整个过程。
  7. 载入数据
  8. ===================================
  9. fastNLP的数据载入主要是由Loader与Pipe两个基类衔接完成的。通过Loader可以方便地载入各种类型的数据。同时,针对常见的数据集,我们已经预先实现了载入方法,其中包含weibo数据集。
  10. 在设计dataloader时,以DataSetLoader为基类,可以改写并应用于其他数据集的载入。
  11. .. code-block:: python
  12. from fastNLP.io import WeiboNERLoader
  13. data_bundle = WeiboNERLoader().load()
  14. 载入后的数据如 ::
  15. {'dev': DataSet(
  16. {{'raw_chars': ['用', '最', '大', '努', '力', '去', '做''人', '生', '。', '哈', '哈', '哈', '哈', '哈', '哈', '
  17. 'target': ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O',, 'O', 'O', 'O', 'O', 'O', 'O'] type=list})}
  18. {'test': DataSet(
  19. {{'raw_chars': ['感', '恩', '大', '回', '馈'] type=list, 'target': ['O', 'O', 'O', 'O', 'O'] type=list})}
  20. {'train': DataSet(
  21. {'raw_chars': ['国', '安', '老', '球', '迷'] type=list, 'target': ['B-ORG.NAM', 'I-ORG.NAM', 'B-PER.NOM', 'I-PER.NOM', 'I-PER.NOM'] type=list})}
  22. 数据处理
  23. ----------------------------
  24. 我们进一步处理数据。通过Pipe基类处理Loader载入的数据。 如果你还有印象,应该还能想起,实现自定义数据集的Pipe时,至少要编写process 函数或者process_from_file 函数。前者接受 :class:`~fastNLP.DataBundle` 类的数据,并返回该 :class:`~fastNLP.DataBundle` 。后者接收数据集所在文件夹为参数,读取并处理为 :class:`~fastNLP.DataBundle` 后,通过process 函数处理数据。
  25. 这里我们已经实现通过Loader载入数据,并已返回 :class:`~fastNLP.DataBundle` 类的数据。我们编写process 函数以处理Loader载入后的数据。
  26. .. code-block:: python
  27. from fastNLP.io import ChineseNERPipe
  28. data_bundle = ChineseNERPipe(encoding_type='bioes', bigram=True).process(data_bundle)
  29. 载入后的数据如下 ::
  30. {'raw_chars': ['用', '最', '大', '努', '力', '去', '做', '值', '得', '的', '事', '人', '生', '。', '哈', '哈', '哈', '哈', '哈', '哈', '我', '在'] type=list,
  31. 'target': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] type=list,
  32. 'chars': [97, 71, 34, 422, 104, 72, 144, 628, 66, 3, 158, 2, 9, 647, 485, 196, 2,19] type=list,
  33. 'bigrams': [5948, 1950, 34840, 98, 8413, 3961, 34841, 631, 34842, 407, 462, 45, 3 1959, 1619, 3, 3, 3, 3, 3, 2663, 29, 90] type=list,
  34. 'seq_len': 30 type=int}
  35. 模型构建
  36. --------------------------------
  37. 我们使用CNN-BILSTM-CRF模型完成这一任务。在网络构建方面,fastNLP的网络定义继承pytorch的 :class:`nn.Module` 类。
  38. 自己可以按照pytorch的方式定义网络。需要注意的是命名。fastNLP的标准命名位于 :class:`~fastNLP.Const` 类。
  39. 模型的训练
  40. 首先实例化模型,导入所需的char embedding以及word embedding。Embedding的载入可以参考教程。
  41. 也可以查看 :mod:`~fastNLP.embedding` 使用所需的embedding 载入方法。
  42. fastNLP将模型的训练过程封装在了 :class:`~fastnlp.Trainer` 类中。
  43. 根据不同的任务调整trainer中的参数即可。通常,一个trainer实例需要有:指定的训练数据集,模型,优化器,loss函数,评测指标,以及指定训练的epoch数,batch size等参数。
  44. .. code-block:: python
  45. #实例化模型
  46. model = CNBiLSTMCRFNER(char_embed, num_classes=len(data_bundle.vocabs['target']), bigram_embed=bigram_embed)
  47. #定义评估指标
  48. Metrics=SpanFPreRecMetric(data_bundle.vocabs['target'], encoding_type='bioes')
  49. #实例化trainer并训练
  50. Trainer(data_bundle.datasets['train'], model, batch_size=20, metrics=Metrics, num_workers=2, dev_data=data_bundle. datasets['dev']).train()
  51. 训练中会保存最优的参数配置。
  52. 训练的结果如下 ::
  53. Evaluation on DataSet test:
  54. SpanFPreRecMetric: f=0.727661, pre=0.732293, rec=0.723088
  55. Evaluation at Epoch 1/100. Step:1405/140500. SpanFPreRecMetric: f=0.727661, pre=0.732293, rec=0.723088
  56. Evaluation on DataSet test:
  57. SpanFPreRecMetric: f=0.784307, pre=0.779371, rec=0.789306
  58. Evaluation at Epoch 2/100. Step:2810/140500. SpanFPreRecMetric: f=0.784307, pre=0.779371, rec=0.789306
  59. Evaluation on DataSet test:
  60. SpanFPreRecMetric: f=0.810068, pre=0.811003, rec=0.809136
  61. Evaluation at Epoch 3/100. Step:4215/140500. SpanFPreRecMetric: f=0.810068, pre=0.811003, rec=0.809136
  62. Evaluation on DataSet test:
  63. SpanFPreRecMetric: f=0.829592, pre=0.84153, rec=0.817989
  64. Evaluation at Epoch 4/100. Step:5620/140500. SpanFPreRecMetric: f=0.829592, pre=0.84153, rec=0.817989
  65. Evaluation on DataSet test:
  66. SpanFPreRecMetric: f=0.828789, pre=0.837096, rec=0.820644
  67. Evaluation at Epoch 5/100. Step:7025/140500. SpanFPreRecMetric: f=0.828789, pre=0.837096, rec=0.820644