初识NER及其应用NER-BILSTM-CNN

Named Entity Recognition

1. NER

1.1 NER定义

命名实体识别(NER):

也称为实体识别、实体分块和实体提取,是信息提取的一个子任务,旨在将文本中的命名实体定位并分类为预先定义的类别,如人员、组织、位置、时间表达式、数量、货币值、百分比等。

在这里插入图片描述

1.2 数据格式

NER是一种序列标注问题,因此他们的数据标注方式也遵照序列标注问题的方式,主要是BIO和BIOES两种。

1.2.1 BIO
1.2.2 BIOES

在这里插入图片描述

1.3 开源库

常用的NER工具推荐:

  • LTP:适合中文分词、NER
  • Spacy:多适用于英文
  • StanfordNER
开源库介绍安装官网
Stanford NER斯坦福大学开发的基于条件随机场的命名实体识别系统,该系统参数是基于CoNLL、MUC-6、MUC-7和ACE命名实体语料训练出来的。pip install stanfordcorenlp官网 | Github
SpaCy工业级的自然语言处理工具,遗憾的是不支持中文。pip install spaCy官网| Github
NLTKNLTK是一个高效的Python构建的平台,用来处理人类自然语言数据。pip install nltk官网 | Github
HanlpHanLP是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用。支持命名实体识别。pip install pyhanlp官网 | Github
LTPLTP提供了一系列中文自然语言处理工具,用户可以使用这些工具对于中文文本进行分词、词性标注、句法分析等等工作。pip install pyltp官网 | Github

1.4 相关数据集

数据集简要说明访问地址
中文电子病历CCKS2017开放的中文的电子病例测评相关的数据CCKS2017测评1 | CCKS2017测评2
音乐领域CCKS2018开放的音乐领域的实体识别任务CCKS2018
口语理解NLPCC2018开放的任务型对话系统中的口语理解评测NLPCC
(CoNLL 2002)Annotated Corpus for Named Entity Recognition这是来自GMB语料库的摘录,用于训练分类器以预测命名实体,例如姓名,位置等。Kaggle

1.5 方法

在这里插入图片描述

阶段 1:早期的方法,如:基于规则的方法、基于字典的方法

阶段 2:传统机器学习,如:HMM、MEMM、CRF

阶段 3:深度学习的方法,如:RNN – CRF、CNN – CRF

阶段 4:近期新出现的一些方法,如:注意力模型、迁移学习、半监督学习的方法

2. BILSTM

在这里插入图片描述

2.1 BILSTM classify

对于分类任务,例如情感分类,采用的句子表示是 [ h L 2 , h R 2 ] [h_{L_2},h_{R_2}] [hL2,hR2],其包含了前向与后向的所有信息。BILSTM对前向和后向的LSTM的最后一个state的隐藏信息进行拼接。

在这里插入图片描述

2.2 BILSTM seq encode

序列编码任务,对“我爱中国”句子进行编码,模型如下所示。BILSTM的每个state的前向和后向隐藏信息进行拼接。

在这里插入图片描述

在这里插入图片描述

3. NER应用:NER-BILSTM-CNN

论文: Named Entity Recognition with Bidirectional LSTM-CNNs

论文复现(Github):https://github.com/kamalkraj/Named-Entity-Recognition-with-Bidirectional-LSTM-CNNs

在这里插入图片描述

论文处理的是英文,是在CONLL2003 的数据集上针对NER任务提出的一项新模型。主要是将字符级别的特征经过CNN和词级别的特征进行concat之后经过双向LSTM进行NER预测。

这样能够更好的利用到前缀后缀之类的字符级特征。而且可以减少人工构造特征的工作。

论文的一个重点工作是特征融合工作,核心的特征包括Word Embedding,Character Embedding,Additional features。而Additional features即在字符级特征和词级别特征上加一些人工特征,包括additional word features和additional character features。比如将词可以分为6类,包括全是大写字母,全是小写字母,全是数字,部分数字等等。

additional word features包括:

  • Capitalization Feature :因为Word Embedding时全部小写,所以构造了一系列特征来判断词的类别。例如:全大写,全小写,部分大写,全数字,部分数字等。
  • Lexicon features :加入了词典模板匹配模块。针对数据集,使用精确匹配的词典。

additional character features包括:一个用于输出一个四维向量的查找表,四维向量表示四个类型(大写、小写、标点、其他)。

论文Figure 1中,还要将双向LSTM前向和后向经过softmax得到的分值相加来判断类别。

在这里插入图片描述

4. NER应用:BERT-NER

Github: https://github.com/kamalkraj/BERT-NER

Github:https://github.com/xuanzebi/BERT-CH-NER

在这里插入图片描述

5. 总结

  1. 做NER需要分词吗?

    可以做分词也可以不做分词。如果分词:可能存在分词错误,模型的效果也会有受影响。不分词,即按字符进行,可以结合CNN对字符级别信息做抽取。

  2. 在中文电子病历的NER任务,特征工程还可以考虑的方面?

    分词,对词级别信息进行RNN;不分词,对字符进行CNN;构造特征:拆分偏旁部首(例如“腹”–>“月,复”,“肺”–>“月,市”等),重新编码表示;构造特征:根据拼音来统计。

6. 参考

一文看懂命名实体识别

Named Entity Recognition with Bidirectional LSTM-CNNs论文阅读

论文翻译及理解

字符级NLP优劣分析:在某些场景中比词向量更好用

详解BiLSTM及代码实现

欢迎各位关注我的个人公众号:HsuDan,我将分享更多自己的学习心得、避坑总结、面试经验、AI最新技术资讯。

### 实现 BERT-BiLSTM-CRF 的推理过程 为了完成基于 BERT-BiLSTM-CRF 模型的命名实体识别(NER)任务的推理,可以按照以下方式构建流程: #### 1. 数据准备与预处理 在进行推理之前,需要将输入文本转换为模型可接受的形式。这通常涉及分词、编码以及张量化操作。 - **分词**:利用 `transformers` 库中的 `BertTokenizer` 对输入文本进行分词并转化为 token ID 列表。 - **填充与截断**:确保所有输入序列长度一致,通过填充或截断到固定的最大长度。 - **注意力掩码**:生成注意力掩码以区分有效 token 和填充部分。 以下是数据预处理的一个简单示例代码: ```python from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') text = "李华去了北京大学" tokens = tokenizer.tokenize(text) input_ids = tokenizer.convert_tokens_to_ids(tokens) # 添加特殊标记 [CLS] 和 [SEP] input_ids = [tokenizer.cls_token_id] + input_ids + [tokenizer.sep_token_id] attention_mask = [1] * len(input_ids) # 填充至最大长度 (假设 max_length=10) max_length = 10 padding_length = max_length - len(input_ids) input_ids += [tokenizer.pad_token_id] * padding_length attention_mask += [0] * padding_length ``` 此步骤中使用的 `BertTokenizer` 是由 Hugging Face 提供的标准工具[^2]。 --- #### 2. 加载已训练好的模型 加载经过微调后的 BERT-BiLSTM-CRF 模型权重文件,并将其设置为评估模式。 - **模型定义**:结合 PyTorch 定义一个包含 BERT 层、BiLSTM 层和 CRF 解码器的网络结构。 - **权重加载**:从保存的 `.pt` 或 `.pth` 文件恢复模型参数。 下面是一个简单的模型加载代码片段: ```python import torch from model import BertBiLstmCrfModel # 自定义模型类 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model_path = "./saved_model/best.pth" model = BertBiLstmCrfModel(bert_dir="bert-base-chinese", num_labels=len(label_map)) model.load_state_dict(torch.load(model_path, map_location=device)) model.to(device) model.eval() ``` 上述代码依赖于自定义模块 `BertBiLstmCrfModel`,其具体实现可以在开源项目中找到[^3]。 --- #### 3. 推理阶段的具体执行 给定一条新的待预测样本,依次传递给模型各组件完成前向传播计算。 - **BERT 编码层**:提取上下文敏感的 word embedding 表征; - **BiLSTM 处理**:捕捉序列间的长期依赖关系; - **CRF 解码**:依据转移概率矩阵选出最优标签路径。 最终返回的结果即为目标实体类别列表。 下面是完整的推理逻辑展示: ```python def predict(text, model, tokenizer, label_map): tokens = tokenizer.tokenize(text) input_ids = tokenizer.convert_tokens_to_ids(["[CLS]"] + tokens + ["[SEP]"]) attention_mask = [1] * len(input_ids) max_len = 50 pad_len = max_len - len(input_ids) input_ids += [0] * pad_len attention_mask += [0] * pad_len inputs = { 'input_ids': torch.tensor([input_ids], dtype=torch.long).to(device), 'attention_mask': torch.tensor([attention_mask], dtype=torch.long).to(device) } with torch.no_grad(): logits, _ = model(**inputs) # 获取原始分数 preds = model.crf.decode(logits)[0] # 调用 CRF decode 方法得到最佳路径 labels = [label_map[i] for i in preds[:len(tokens)+2]] # 映射回真实标签名称 return list(zip(["[CLS]"] + tokens + ["[SEP]"], labels)) result = predict("李华去了北京大学", model, tokenizer, {v:k for k,v in label_map.items()}) print(result) ``` 注意这里假定了存在一个映射字典 `label_map` 将整数索引对应到实际语义标签上[^1]。 --- #### 总结 综上所述,借助 PyTorch 可轻松搭建起一套支持中文环境下的高性能 NER 系统框架——BERT-BiLSTM-CRF 结构。该方案融合了强大的语言理解能力与灵活的时间维度特征挖掘手段,在诸多场景下表现出色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值