准备工作,先准备 python 环境,下载 BERT 语言模型

  • Python 3.6 环境

需要安装kashgari

Backend pypi version desc
TensorFlow 2.x pip install ‘kashgari>=2.0.0’ coming soon
TensorFlow 1.14+ pip install ‘kashgari>=1.0.0,<2.0.0’ current version
Keras pip install ‘kashgari<1.0.0’ legacy version
  • BERT, Chinese 中文模型

    我选择的是工大的BERT-wwm-ext模型

在此感谢上述作者

数据集准备

from kashgari.corpus import ChineseDailyNerCorpus

train_x, train_y = ChineseDailyNerCorpus.load_data('train')
valid_x, valid_y = ChineseDailyNerCorpus.load_data('validate')
test_x, test_y = ChineseDailyNerCorpus.load_data('test') print(f"train data count: {len(train_x)}")
print(f"validate data count: {len(valid_x)}")
print(f"test data count: {len(test_x)}")
train data count: 20864
validate data count: 2318
test data count: 4636

采用人民日报标注的数据集,格式为:

海 O
钓 O
比 O
赛 O
地 O
点 O
在 O
厦 B-LOC
门 I-LOC
与 O
金 B-LOC
门 I-LOC
之 O
间 O
的 O
海 O
域 O
。 O

创建 BERT embedding

import kashgari
from kashgari.embeddings import BERTEmbedding bert_embed = BERTEmbedding('chinese_wwm_ext_L-12_H-768_A-12',
task=kashgari.LABELING,
sequence_length=100)

创建模型并训练

from kashgari.tasks.labeling import BiLSTM_CRF_Model

# 还可以选择 `CNN_LSTM_Model`, `BiLSTM_Model`, `BiGRU_Model` 或 `BiGRU_CRF_Model`

model = BiLSTM_CRF_Model(bert_embed)
model.fit(train_x,
train_y,
x_validate=valid_x,
y_validate=valid_y,
epochs=20,
batch_size=512)
model.save('ner.h5')

模型评估

model.evaluate(test_x, test_y)

BERT + B-LSTM-CRF 模型效果最好。详细得分如下:

precision recall f1-score support
LOC 0.9208 0.9324 0.9266
ORG 0.8728 0.8882 0.8804
PER 0.9622 0.9633 0.9627
avg / total 0.9169 0.9271 0.9220

模型使用

# -*- coding: utf-8 -*-
import kashgari
import re loaded_model = kashgari.utils.load_model('per_ner.h5') def cut_text(text, lenth):
textArr = re.findall('.{' + str(lenth) + '}', text)
textArr.append(text[(len(textArr) * lenth):])
return textArr def extract_labels(text, ners):
ner_reg_list = []
if ners:
new_ners = []
for ner in ners:
new_ners += ner;
for word, tag in zip([char for char in text], new_ners):
if tag != 'O':
ner_reg_list.append((word, tag)) # 输出模型的NER识别结果
labels = {}
if ner_reg_list:
for i, item in enumerate(ner_reg_list):
if item[1].startswith('B'):
label = ""
end = i + 1
while end <= len(ner_reg_list) - 1 and ner_reg_list[end][1].startswith('I'):
end += 1 ner_type = item[1].split('-')[1] if ner_type not in labels.keys():
labels[ner_type] = [] label += ''.join([item[0] for item in ner_reg_list[i:end]])
labels[ner_type].append(label) return labels while True:
text_input = input('sentence: ') texts = cut_text(text_input, 100)
ners = loaded_model.predict([[char for char in text] for text in texts])
print(ners)
labels = extract_labels(text_input, ners)
print(labels)

参考文献

Chinese-BERT-wwm:https://github.com/ymcui/Chinese-BERT-wwm

Kashgari:https://github.com/BrikerMan/Kashgari

NLP 基于kashgari和BERT实现中文命名实体识别(NER)的更多相关文章

  1. 基于 bi-LSTM和CRF的中文命名实体识别

    follow: https://github.com/zjy-ucas/ChineseNER  这里边主要识别的实体如图所示,其实也就主要识别人名PER,机构ORG和地点LOC: B表示开始的字节,I ...

  2. 基于BERT预训练的中文命名实体识别TensorFlow实现

    BERT-BiLSMT-CRF-NERTensorflow solution of NER task Using BiLSTM-CRF model with Google BERT Fine-tuni ...

  3. DL4NLP —— 序列标注:BiLSTM-CRF模型做基于字的中文命名实体识别

    三个月之前 NLP 课程结课,我们做的是命名实体识别的实验.在MSRA的简体中文NER语料(我是从这里下载的,非官方出品,可能不是SIGHAN 2006 Bakeoff-3评测所使用的原版语料)上训练 ...

  4. NLP入门(八)使用CRF++实现命名实体识别(NER)

    CRF与NER简介   CRF,英文全称为conditional random field, 中文名为条件随机场,是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机 ...

  5. 命名实体识别(NER)

    一.任务 Named Entity Recognition,简称NER.主要用于提取时间.地点.人物.组织机构名. 二.应用 知识图谱.情感分析.机器翻译.对话问答系统都有应用.比如,需要利用命名实体 ...

  6. pytorch 文本情感分类和命名实体识别NER中LSTM输出的区别

    文本情感分类: 文本情感分类采用LSTM的最后一层输出 比如双层的LSTM,使用正向的最后一层和反向的最后一层进行拼接 def forward(self,input): ''' :param inpu ...

  7. 使用Standford coreNLP进行中文命名实体识别

    因为工作需要,调研了一下Stanford coreNLP的命名实体识别功能. Stanford CoreNLP是一个比较厉害的自然语言处理工具,很多模型都是基于深度学习方法训练得到的. 先附上其官网链 ...

  8. 『深度应用』NLP命名实体识别(NER)开源实战教程

    近几年来,基于神经网络的深度学习方法在计算机视觉.语音识别等领域取得了巨大成功,另外在自然语言处理领域也取得了不少进展.在NLP的关键性基础任务—命名实体识别(Named Entity Recogni ...

  9. 零基础入门--中文命名实体识别(BiLSTM+CRF模型,含代码)

    自己也是一个初学者,主要是总结一下最近的学习,大佬见笑. 中文分词说到命名实体抽取,先要了解一下基于字标注的中文分词.比如一句话 "我爱北京天安门”. 分词的结果可以是 “我/爱/北京/天安 ...

随机推荐

  1. 私有npm计划

    为什么要建立私有npm 提高代码复用程度,增加团队沉淀 剥离项目依赖,工程更加轻量 引用全量更新,支持版本降级 建立模块文档,降低上手难度 全员把关代码质量,无需重复测试 构建工具已成趋势,优化发布流 ...

  2. JS判定数据类型

    1.typeof                我们能够使用typeof判断变量的身份,判断字符串得到string,数字和NaN得到number,函数会得到function等,但是判断数组,对象和nu ...

  3. 【React自制全家桶】四、React中state与props的分析与比较

    一.state 1.state的作用 state是React中组件的一个对象.React把用户界面当做是状态机,想象它有不同的状态然后渲染这些状态,可以轻松让用户界面与数据保持一致. React中,更 ...

  4. 代码实现从键盘接收一个字符串, 程序对其中所有字符进行排序,例如键盘输入: helloitcast程序打印:acehillostt

    package com.loaderman.test; import java.util.Comparator; import java.util.Scanner; import java.util. ...

  5. Ubuntu16.04使用apt安装完nginx常见问题

    1.安装完并remove掉后重新install后没nginx.conf文件 解决办法: apt-get -y --purge remove nginx* apt-get -y autoremove a ...

  6. k8s测试容器之间是否互通

    [root@lab2 .kube]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE curl-87b54756-rbqz ...

  7. JAVA文件上传 ServletFileUpLoad 实例

    1.  jsp <%@ page language="java" contentType="text/html" pageEncoding="u ...

  8. PJzhang:从js文件中寻找子域名的SubDomainizer

    猫宁!!! 有些专门针对企业客户的网站,可能没有供公开注册的页面,但是在js文件中可能会隐藏他们的注册接口,当然这也是一种安全风险,就像有些后台是一定不能不小心放外网一个道理.   最近看到一篇文章提 ...

  9. SQL注入-预防

    输入验证: 检查用户输入的合法性,确信输入的内容只包含合法的数据.数据检查应当在客户端和服务器端都执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性. 输入验证最好使用“白名单”校验的方式. 输入 ...

  10. Windows下的开发辅助神器——Chocolate Package Manager

    Windows下的开发辅助神器——Chocolate Package Manager:https://juejin.im/post/5c6cb3acf265da2dc4537235 Windows上的 ...