【极简】基于BERT的实体识别,并在旧版docker上部署

  • gajanlee
  • 代码已开源github
  • 如有帮助,欢迎star
  • 如有问题,欢迎Issue

BERT实体识别

  • 实体识别是一个序列输出模型,所以与分类模型略有不同
  • 实体标签有顺序关系,加入CRF层准确率会提升
  • 最小文件run_ner.py
  • 对配置文件进行抽取,减少命令行的参数量

Usage

  • 把run_ner.py放在bert目录下
  • 使用predictor读取配置文件,并进行训练、预测
  • 测试命令【service模式输出】:python predictor.py
2020-05-29 17:45:00,886 - ./output/ner.log - INFO - 
吴奇隆很帅啊
[(0, 3, ['吴', '奇', '隆'], 'PER')]

2020-05-29 17:45:00,886 - ./output/ner.log - INFO - 
你认识周润发吗?
[(3, 6, ['周', '润', '发'], 'PER')]

2020-05-29 17:45:00,886 - ./output/ner.log - INFO - 
东风风神AX7大战启辰T90
[]

2020-05-29 17:45:00,886 - ./output/ner.log - INFO - 
2018年美国中期选举,你认为特朗普会下台吗?
[(12, 15, ['特', '朗', '普'], 'PER')]

2020-05-29 17:45:00,886 - ./output/ner.log - INFO - 
【海泰发展连续三日涨停提示风险:公司没有与创投相关的收入来源】连续三日涨停的海泰发展11月12日晚间披露风险提示公告,经公司自查,谁不想做吴彦祖?公司目前生产经营活动正常。目前,公司主营业务收入和利润来源为贸易和房产租售,没有与创投相关的收入来源,也没有科技产业投资项目。公司对应2017年每股收益的市盈率为271.95倍,截至11月12日,公司动态市盈率为2442.10倍,请投资者注意投资风险。另外,谁帅过吴彦祖?
[(5, 8, ['吴', '彦', '祖'], 'PER'), (6, 9, ['吴', '彦', '祖'], 'PER')]
  • 运行环境
    • tensorflow[-gpu] == 1.12.0

数据

  • run.sh中提供三个数据的下载链接
  • config.json包括各个模式的设置及相应的batch_size

思路

bert-ner主要依赖BERT对输入的句子进行encode,然后经过CRF层对输出标签的顺序进行限制,对每个token预测一个分类标签,“B-PER”、“I-PER”、"O"等。

相比run_classifier.py的修改

  • Features中的label_ids变为多个标签,即长度为N的文本,对应(N+2)个label([CLS], [SEP]).
  • create_model变为get_sequence_output, 接入CRF模型
  • 生成label_ids时的补充策略:定义_X标签作为一个特殊label,即不参与实体识别。通常应用在word piece和[CLS]、[SEP].

其他事项

  • estimator.predict()返回max_seq_length个lable_id
  • NERFastPredictor,免去每次预测重新加载模型
  • 在预测出来结果后,text中每个词与predict_id一一对应,略过_X标签即可
  • 标签以B-, I-,[E-]为标准
  • nvidia-docker

Docker-Nvidia

  • docker18.03以下使用docker-nvidia1.0,以上使用docker-nvidia2
17.12.1-ce正常运行
  • 安装nvidia-docker1.0
yum install -y nvidia-docker
  • 列出所有nvidia-docker volume

    • 应该有一个
    nvidia-docker volume ls
    
    • 如果没有的话
    docker volume create --driver=nvidia-docker --name=nvidia_driver_$(modinfo -F version nvidia)
    nvidia-docker volume ls
    
  • 查看显卡和docker是否正常

    • 直接输出信息
    nvidia-docker run --rm nvidia/cuda nvidia-smi
    
    • 进入镜像查看
    # 直接查看失败的话进入镜像运行
    nvidia-docker run -it -p 8888:8888 --name ten tensorflow/tensorflow:0.11.0rc0-gpu  /bin/sh
    nvidia-smi
    python
    >>> import tensorflow as tf
    >>> tf.test.is_gpu_available()
    
  • 构建容器

nvidia-docker build  --network host -t service:bert .
  • 运行容器
nvidia-docker run --network host -it --rm -p 1234:1234 -v data:data  service:bert /bin/bash
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于BERT的命名实体识别Python代码示例: 首先,需要安装相应的库,包括torch、transformers和nltk: ``` !pip install torch !pip install transformers !pip install nltk ``` 然后,导入所需的库: ``` import torch from transformers import BertTokenizer, BertForTokenClassification import nltk nltk.download('punkt') from nltk.tokenize import word_tokenize ``` 接下来,加载预训练的BERT模型和tokenizer: ``` model = BertForTokenClassification.from_pretrained('bert-base-cased', num_labels=9) tokenizer = BertTokenizer.from_pretrained('bert-base-cased') ``` 在这里,我们使用了一个预训练的BERT模型(bert-base-cased),该模型具有104万个参数,并在大型文本语料库上进行了训练。模型的tokenizer也使用了相同的语料库。 然后,定义一个函数来执行命名实体识别: ``` def ner(text): # 标记化文本 tokenized_text = word_tokenize(text) # 应用BERT tokenizer input_ids = torch.tensor([tokenizer.encode(tokenized_text, add_special_tokens=True)]) # 对于BERT,我们需要将输入标记的标记位置(mask)设置为1 attention_mask = torch.ones(input_ids.shape) # 预测标记(实体类别) with torch.no_grad(): output = model(input_ids, attention_mask=attention_mask) # 获取预测标记的索引 predicted_tokens = torch.argmax(output[0], dim=2) # 将标记转换为实体类别 tags = [] for i in predicted_tokens[0]: tags.append(model.config.id2label[i.item()]) # 将标记和实体类别组合成元组 entities = [] for i in range(len(tokenized_text)): if tags[i] != 'O': entities.append((tokenized_text[i], tags[i])) return entities ``` 该函数接受一个字符串作为输入,并将其标记化为单词。然后,使用BERT tokenizer将单词转换为输入ID。对于BERT,我们还需要创建一个用于标记输入标记位置的注意力掩码。然后,我们使用预训练的BERT模型来预测每个标记的实体类别。最后,我们将标记和实体类别组合成元组,并将其作为输出返回。 现在,我们可以使用该函数来识别给定文本中的命名实体。例如: ``` text = "J.K. Rowling is the author of the Harry Potter series." entities = ner(text) print(entities) ``` 该代码将输出以下内容: ``` [('J.K.', 'B-PERSON'), ('Rowling', 'I-PERSON'), ('Harry', 'B-PRODUCT'), ('Potter', 'I-PRODUCT')] ``` 该输出表示在给定文本中找到了4个实体,其中2个是人名,2个是产品名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值