基于bert的中文实体识别,并使用字形嵌入和拼音嵌入。
本博文提供了完整的Python代码和使用教程,适合新入门的朋友参考,完整代码资源文件请转至文末的下载链接。
基于BERT(Bidirectional Encoder Representations from Transformers)的中文实体识别是一种先进的自然语言处理技术,结合了深度学习和预训练模型的优势,特别适用于处理复杂的语言任务,如实体识别。在这种方法中,字形嵌入(Character Embeddings)和拼音嵌入(Pinyin Embeddings)是两个重要的技术手段,用于进一步提升模型在中文实体识别任务上的性能和鲁棒性。
BERT简介与预训练模型
BERT是由Google提出的一种预训练语言模型,其核心思想是通过大规模无监督学习从文本数据中学习通用的语言表示。BERT的预训练过程包括两个阶段:Masked Language Model(MLM)和Next Sentence Prediction(NSP),通过这些任务学习句子中各个位置的语境化表示。
中文实体识别任务
实体识别是指从文本中识别出具有特定类型的实体,例如人名、地名、组织名等。在中文实体识别任务中,由于中文的复杂性和灵活性,传统的基于规则或词典的方法往往难以达到理想的效果。因此,引入BERT等预训练模型进行端到端的学习和预测成为一种有效的解决方案。
字形嵌入(Character Embeddings)
字形嵌入是指将每个汉字或其他字符映射到一个低维向量空间中的表示形式。在中文中,每个汉字都有其独特的字形特征,包括笔画、结构和组成部件等。字形嵌入通过捕获这些特征,为模型提供了更多细粒度的信息,有助于区分不同的实体类型。在BERT模型中,字形嵌入通常作为输入的一部分,与词级别的嵌入共同构成模型的输入表示。
拼音嵌入(Pinyin Embeddings)
拼音嵌入则是将汉字转换为其拼音形式,并将拼音映射到嵌入向量空间中。拼音是汉字的音韵符号,它能够帮助模型理解汉字之间的语音关系和发音相似性。拼音嵌入在处理模型遇到生僻字或者同音字时尤为重要,它提供了一种基于音韵层面的辅助信息,有助于提高模型对于语义和语境的理解能力。
结合BERT进行中文实体识别
在实践中,结合字形嵌入和拼音嵌入与BERT模型进行中文实体识别可以有以下几个步骤:
-
预处理阶段:将输入文本分割成字符级别或词级别,并为每个汉字生成对应的字形嵌入和拼音表示。
-
输入表示构建:将字形嵌入和拼音嵌入与BERT模型的词级别嵌入拼接或融合,形成最终的输入表示。
-
模型微调:在预训练的BERT基础上,通过在带标注实体的数据集上进行有监督微调,调整模型参数以适应特定的实体识别任务。
-
实体识别预测:使用微调后的BERT模型对新的文本进行实体识别预测,输出每个实体的类别和位置信息。
优势与挑战
结合BERT进行中文实体识别的方法具有以下优势:
-
语境感知能力:BERT能够全面理解句子的语境和复杂的语义信息,有助于提高实体识别的准确性。
-
泛化能力:预训练模型能够在大规模文本数据上学习通用的语言表示,具备较强的泛化能力,适用于不同风格和领域的文本。
-
多样化输入支持:字形嵌入和拼音嵌入为模型提供了多样化的输入支持,特别适用于处理包含生僻字或同音字的复杂文本。
然而,结合BERT进行实体识别也面临一些挑战,如计算资源消耗较大、对大规模标注数据依赖较强等。
综上所述,基于BERT的中文实体识别在字形嵌入和拼音嵌入的支持下,不仅提高了模型对于中文复杂文本的处理能力,还通过预训练模型的优势有效地解决了传统方法难以克服的问题,是当前领域内的前沿技术之一。
# pytorch_bert_chinese_ner
基于bert的中文实体识别,并使用字形嵌入和拼音嵌入。
# 依赖
transformers==4.5.0
torch==1.6.0+
pypinyin
# 运行
1、hugging face上下载模chinese-bert-wwm-ext模型文件到model_hub/chinese-bert-wwm-ext/下。
2、需要生成字形嵌入所需的文件,运行:```python get_glyph.py```
3、训练验证、测试和预测。
单纯的bert实体识别:
python main.py
【eval】 precision=0.9651 recall=0.9511 f1_score=0.9580
['ORG', 'TITLE', 'CONT', 'NAME', 'PRO', 'LOC', 'RACE', 'EDU']
precision recall f1-score support
ORG 0.95 0.93 0.94 551
TITLE 0.95 0.95 0.95 762
CONT 1.00 1.00 1.00 28
NAME 1.00 1.00 1.00 112
PRO 1.00 0.94 0.97 33
LOC 1.00 1.00 1.00 6
RACE 1.00 1.00 1.00 14
EDU 0.98 0.98 0.98 112
micro-f1 0.96 0.95 0.95 1618
text= 陈学军先生:1967年5月出生,大学毕业,高级经济师。
{'ORG': [], 'TITLE': [('高级经济师', 21)], 'CONT': [], 'NAME': [('陈学军', 0)], 'PRO': [], 'LOC': [], 'RACE': [], 'EDU': [('大学', 16)]}
加上字形嵌入和拼音嵌入:
python main2.py
【eval】 precision=0.9591 recall=0.9501 f1_score=0.9546
【best f1】 0.9546
['ORG', 'TITLE', 'CONT', 'NAME', 'PRO', 'LOC', 'RACE', 'EDU']
precision recall f1-score support
ORG 0.93 0.93 0.93 551
TITLE 0.95 0.94 0.95 762
CONT 1.00 1.00 1.00 28
NAME 0.99 1.00 1.00 112
PRO 0.97 0.86 0.91 33
LOC 0.67 0.80 0.73 6
RACE 0.93 0.93 0.93 14
EDU 0.97 0.94 0.96 112
micro-f1 0.95 0.94 0.94 1618
text= 陈学军先生:1967年5月出生,大学毕业,高级经济师。
{'ORG': [], 'TITLE': [('高级经济师', 21)], 'CONT': [], 'NAME': [('陈学军', 0)], 'PRO': [], 'LOC': [], 'RACE': [], 'EDU': [('大学', 16)]}
# 总结
1、加入字形和拼音,训练速度没有原始的快,而且效果也没原始的好,可能的原因是:
- 不适合该数据集;
- 可能需要调整参数或者训练策略;
2、如果想要训练其他的数据集,可参考resume数据集的格式。
代码地址
https://download.csdn.net/download/mohen_777/89485996?spm=1001.2014.3001.5503