当前位置:   article > 正文

Python ark-nlp文本分类,命名实体识别,关系抽取,文本匹配,预训练模型,机器学习,深度学习,ERNIE,NEZHA_文本识别章节名称 python算法

文本识别章节名称 python算法

本文参考了大佬的文档https://github.com/xiangking/ark-nlp#ark-nlp

一、ark-nlp简介

ark-nlp集成了机器学习和深度学习的多个模型,主要用于NLP的任务处理,这里面集合了众多大佬们的汗水,是开源的模型,也是我们这些菜菜们的福音。

(1)环境需求

python 3-3.7(3.8不太稳定)

torch >= 1.0.0,<1.10.0

tqdm >= 4.56.0

jieba >= 0.42.1

transformers >= 3.0.0

zhon >= 1.1.5

scipy >= 1.2.0

scikit-learn >= 0.17.0

(2)安装

pip install --upgrade ark-nlp

清华镜像源:

pip install --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple ark-nlp

二、Ark_nlp构成简介

(1)Ark_nlp项目结构

ark_nlp

开源的自然语言处理库

ark_nlp.dataset

封装数据加载、处理和转化等功能

ark_nlp.nn

封装一些完整的神经网络模型

ark_nlp.processor

封装分词器、词典和构图器等

ark_nlp.factory

封装损失函数、优化器、训练和预测等功能

ark_nlp.model

按实际NLP任务封装常用的模型,方便调用

(2)预训练模型

(3)文本分类 (Text Classification)

模型

简介

RNN/CNN/GRU/LSTM

经典的RNN, CNN, GRU, LSTM等经典文本分类结构

BERT/ERNIE

常用的预训练模型分类

ERT就不用介绍了,讲解一下ERNIE

ERNIE(Enhanced Representation through Knowledge Integration)是百度基于BERT开发的NLP模型。ERNIE使用了更多的语料,除维基百科等数据集外,还使用了中文维基百科,百度百科,百度新闻,百度贴吧数据集。该模型的参数:L = 12,H = 768,A = 12 (BERT BASE)。ERNIE实现了实体级别的Mask,实体级别的连续Mask改变了训练Task,而BERT是基于单字的Mask。所以在涉及到实体级别的训练和预测时,一般选择ERNIE。但是现在ERNIE已经进化到2.0了。

下面来说说哪吒,NEZHA论文全名为Neural Contextualized Representation For Chinese Language Understanding,来自与华为诺亚方舟实验室。NEZHA论文是也是基于Transformer的预训练模型,从文章来看,它对BERT模型进行了四点改进,增加相对位置编码函数(Functional Relative Positional Encoding)全词掩码(Whole Word Masking)混合精度训练(Mixed Precision Training)优化器改进(LAMB Optimizer)

RoFormerRotary Transformer)是基于旋转式位置编码 RoPE 以及对应的 Transformer 模型的预训练模型,这是一种配合Attention机制能达到“绝对位置编码的方式实现绝对位置编码”的设计。而也正因为这种设计,它还是目前唯一一种可用于线性Attention的相对位置编码。

(4)文本匹配 (Text Matching)

模型

简介

BERT/ERNIE

常用的预训练模型匹配分类

UnsupervisedSimcse

无监督Simcse匹配算法

CoSENT

CoSENT:比Sentence-BERT更有效的句向量方案

(5)命名实体识别 (Named Entity Recognition)

(6)关系抽取 (Relation Extraction)

三、实际应用

CHIP2021-Task3-临床术语标准化任务-第三名

CHIP2021-Task1-医学对话临床发现阴阳性判别任务-第一名

中文医疗信息处理挑战榜CBLUE

使用方法和示例

(1)文本分类

  1. import torch
  2. import pandas as pd
  3. from ark_nlp.model.tc.bert import Bert
  4. from ark_nlp.model.tc.bert import BertConfig
  5. from ark_nlp.model.tc.bert import Dataset
  6. from ark_nlp.model.tc.bert import Task
  7. from ark_nlp.model.tc.bert import get_default_model_optimizer
  8. from ark_nlp.model.tc.bert import Tokenizer
  9. # 加载数据集
  10. # train_data_df的columns必选包含"text""label"
  11. # text列为文本,label列为分类标签
  12. tc_train_dataset = Dataset(train_data_df)
  13. tc_dev_dataset = Dataset(dev_data_df)
  14. # 加载分词器
  15. tokenizer = Tokenizer(vocab='nghuyong/ernie-1.0', max_seq_len=30)
  16. # 文本切分、ID化
  17. tc_train_dataset.convert_to_ids(tokenizer)
  18. tc_dev_dataset.convert_to_ids(tokenizer)
  19. # 加载预训练模型
  20. config = BertConfig.from_pretrained('nghuyong/ernie-1.0',
  21. num_labels=len(tc_train_dataset.cat2id))
  22. dl_module = Bert.from_pretrained('nghuyong/ernie-1.0',
  23. config=config)
  24. # 任务构建
  25. num_epoches = 10
  26. batch_size = 32
  27. optimizer = get_default_model_optimizer(dl_module)
  28. model = Task(dl_module, optimizer, 'ce', cuda_device=0)
  29. # 训练
  30. model.fit(tc_train_dataset,
  31. tc_dev_dataset,
  32. lr=2e-5,
  33. epochs=5,
  34. batch_size=batch_size
  35. )
  36. # 推断
  37. from ark_nlp.model.tc.bert import Predictor
  38. tc_predictor_instance = Predictor(model.module, tokenizer, tc_train_dataset.cat2id)
  39. tc_predictor_instance.predict_one_sample(待预测文本)

(2)文本匹配

  1. import torch
  2. import pandas as pd
  3. from ark_nlp.model.tm.bert import Bert
  4. from ark_nlp.model.tm.bert import BertConfig
  5. from ark_nlp.model.tm.bert import Dataset
  6. from ark_nlp.model.tm.bert import Task
  7. from ark_nlp.model.tm.bert import get_default_model_optimizer
  8. from ark_nlp.model.tm.bert import Tokenizer
  9. # 加载数据集
  10. # train_data_df的columns必选包含"text_a""text_b""label"
  11. # text_a和text_b列为文本,label列为匹配标签
  12. tm_train_dataset = Dataset(train_data_df)
  13. tm_dev_dataset = Dataset(dev_data_df)
  14. # 加载分词器
  15. tokenizer = Tokenizer(vocab='nghuyong/ernie-1.0', max_seq_len=30)
  16. # 文本切分、ID化
  17. tm_train_dataset.convert_to_ids(tokenizer)
  18. tm_dev_dataset.convert_to_ids(tokenizer)
  19. # 加载预训练模型
  20. config = BertConfig.from_pretrained('nghuyong/ernie-1.0',
  21. num_labels=len(tm_train_dataset.cat2id))
  22. dl_module = Bert.from_pretrained('nghuyong/ernie-1.0',
  23. config=config)
  24. # 任务构建
  25. num_epoches = 10
  26. batch_size = 32
  27. optimizer = get_default_model_optimizer(dl_module)
  28. model = Task(dl_module, optimizer, 'ce', cuda_device=0)
  29. # 训练
  30. model.fit(tm_train_dataset,
  31. tm_dev_dataset,
  32. lr=2e-5,
  33. epochs=5,
  34. batch_size=batch_size
  35. )
  36. # 推断
  37. from ark_nlp.model.tm.bert import Predictor
  38. tm_predictor_instance = Predictor(model.module, tokenizer, tm_train_dataset.cat2id)
  39. tm_predictor_instance.predict_one_sample([待预测文本A, 待预测文本B])

(3)命名实体识别

  1. import torch
  2. import pandas as pd
  3. from ark_nlp.model.ner.crf_bert import CRFBert
  4. from ark_nlp.model.ner.crf_bert import CRFBertConfig
  5. from ark_nlp.model.ner.crf_bert import Dataset
  6. from ark_nlp.model.ner.crf_bert import Task
  7. from ark_nlp.model.ner.crf_bert import get_default_model_optimizer
  8. from ark_nlp.model.ner.crf_bert import Tokenizer
  9. # 加载数据集
  10. # train_data_df的columns必选包含"text""label"
  11. # text列为文本
  12. # label列为列表形式,列表中每个元素是如下组织的字典
  13. # {'start_idx': 实体首字符在文本的位置, 'end_idx': 实体尾字符在文本的位置, 'type': 实体类型标签, 'entity': 实体}
  14. ner_train_dataset = Dataset(train_data_df)
  15. ner_dev_dataset = Dataset(dev_data_df)
  16. # 加载分词器
  17. tokenizer = Tokenizer(vocab='nghuyong/ernie-1.0', max_seq_len=30)
  18. # 文本切分、ID化
  19. ner_train_dataset.convert_to_ids(tokenizer)
  20. ner_dev_dataset.convert_to_ids(tokenizer)
  21. # 加载预训练模型
  22. config = CRFBertConfig.from_pretrained('nghuyong/ernie-1.0',
  23. num_labels=len(ner_train_dataset.cat2id))
  24. dl_module = CRFBert.from_pretrained('nghuyong/ernie-1.0',
  25. config=config)
  26. # 任务构建
  27. num_epoches = 10
  28. batch_size = 32
  29. optimizer = get_default_model_optimizer(dl_module)
  30. model = Task(dl_module, optimizer, 'ce', cuda_device=0)
  31. # 训练
  32. model.fit(ner_train_dataset,
  33. ner_dev_dataset,
  34. lr=2e-5,
  35. epochs=5,
  36. batch_size=batch_size
  37. )
  38. # 推断
  39. from ark_nlp.model.ner.crf_bert import Predictor
  40. ner_predictor_instance = Predictor(model.module, tokenizer, ner_train_dataset.cat2id)
  41. ner_predictor_instance.predict_one_sample(待抽取文本)

(4)Casrel关系抽取

  1. import torch
  2. import pandas as pd
  3. from ark_nlp.model.re.casrel_bert import CasRelBert
  4. from ark_nlp.model.re.casrel_bert import CasRelBertConfig
  5. from ark_nlp.model.re.casrel_bert import Dataset
  6. from ark_nlp.model.re.casrel_bert import Task
  7. from ark_nlp.model.re.casrel_bert import get_default_model_optimizer
  8. from ark_nlp.model.re.casrel_bert import Tokenizer
  9. from ark_nlp.factory.loss_function import CasrelLoss
  10. # 加载数据集
  11. # train_data_df的columns必选包含"text""label"
  12. # text列为文本
  13. # label列为列表形式,列表中每个元素是如下组织的字典
  14. # [头实体, 头实体首字符在文本的位置, 头实体尾字符在文本的位置, 关系类型, 尾实体, 尾实体首字符在文本的位置, 尾实体尾字符在文本的位置]
  15. re_train_dataset = Dataset(train_data_df)
  16. re_dev_dataset = Dataset(dev_data_df,
  17. categories = re_train_dataset.categories,
  18. is_train=False)
  19. # 加载分词器
  20. tokenizer = Tokenizer(vocab='nghuyong/ernie-1.0', max_seq_len=100)
  21. # 文本切分、ID化
  22. # 注意:casrel的代码这部分其实并没有进行切分、ID化,仅是将分词器赋予dataset对象
  23. re_train_dataset.convert_to_ids(tokenizer)
  24. re_dev_dataset.convert_to_ids(tokenizer)
  25. # 加载预训练模型
  26. config = CasRelBertConfig.from_pretrained('nghuyong/ernie-1.0',
  27. num_labels=len(re_train_dataset.cat2id))
  28. dl_module = CasRelBert.from_pretrained('nghuyong/ernie-1.0',
  29. config=config)
  30. # 任务构建
  31. num_epoches = 40
  32. batch_size = 16
  33. optimizer = get_default_model_optimizer(dl_module)
  34. model = Task(dl_module, optimizer, CasrelLoss(), cuda_device=0)
  35. # 训练
  36. model.fit(re_train_dataset,
  37. re_dev_dataset,
  38. lr=2e-5,
  39. epochs=5,
  40. batch_size=batch_size
  41. )
  42. # 推断
  43. from ark_nlp.model.re.casrel_bert import Predictor
  44. casrel_re_predictor_instance = Predictor(model.module, tokenizer, re_train_dataset.cat2id)
  45. casrel_re_predictor_instance.predict_one_sample(待抽取文本)

(5)PRGC关系抽取

  1. import torch
  2. import pandas as pd
  3. from ark_nlp.model.re.prgc_bert import PRGCBert
  4. from ark_nlp.model.re.prgc_bert import PRGCBertConfig
  5. from ark_nlp.model.re.prgc_bert import Dataset
  6. from ark_nlp.model.re.prgc_bert import Task
  7. from ark_nlp.model.re.prgc_bert import get_default_model_optimizer
  8. from ark_nlp.model.re.prgc_bert import Tokenizer
  9. # 加载数据集
  10. # train_data_df的columns必选包含"text""label"
  11. # text列为文本
  12. # label列为列表形式,列表中每个元素是如下组织的字典
  13. # [头实体, 头实体首字符在文本的位置, 头实体尾字符在文本的位置, 关系类型, 尾实体, 尾实体首字符在文本的位置, 尾实体尾字符在文本的位置]
  14. re_train_dataset = Dataset(train_df, is_retain_dataset=True)
  15. re_dev_dataset = Dataset(dev_df,
  16. categories = re_train_dataset.categories,
  17. is_train=False)
  18. # 加载分词器
  19. tokenizer = Tokenizer(vocab='nghuyong/ernie-1.0', max_seq_len=100)
  20. # 文本切分、ID化
  21. re_train_dataset.convert_to_ids(tokenizer)
  22. re_dev_dataset.convert_to_ids(tokenizer)
  23. # 加载预训练模型
  24. config = PRGCBertConfig.from_pretrained('nghuyong/ernie-1.0',
  25. num_labels=len(re_train_dataset.cat2id))
  26. dl_module = PRGCBert.from_pretrained('nghuyong/ernie-1.0',
  27. config=config)
  28. # 任务构建
  29. num_epoches = 40
  30. batch_size = 16
  31. optimizer = get_default_model_optimizer(dl_module)
  32. model = Task(dl_module, optimizer, None, cuda_device=0)
  33. # 训练
  34. model.fit(re_train_dataset,
  35. re_dev_dataset,
  36. lr=2e-5,
  37. epochs=5,
  38. batch_size=batch_size
  39. )
  40. # 推断
  41. from ark_nlp.model.re.prgc_bert import Predictor
  42. prgc_re_predictor_instance = Predictor(model.module, tokenizer, re_train_dataset.cat2id)
  43. prgc_re_predictor_instance.predict_one_sample(待抽取文本)

 总结:ark-nlp模型集合了很多大厂开源的深度学习模型,并且在集成的基础上优化了调用方法,大家可以尽情的使用啦~~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/367974
推荐阅读
相关标签
  

闽ICP备14008679号