Pytorch-BERT-CRF-NER
一个基于BERT + CRF的PyTorch韩文NER标注器实现(PyTorch v1.2 / Python 3.x)
示例
日志
请输入句子: 上月28日,居住在水原的研究员尹柱成参加了在首尔三成站Coex举行的DEVIEW 2019第一天的活动。在听LaRva团队的“超~大语言模型工厂运作器!”讲座时,他想尝试用multi-GPU和TPU来训练语言模型。
len: 90, input_token:['[CLS]', '▁上月', '▁28', '日', '▁水原', '에', '▁居住', '고', '▁있는', '▁尹', '柱', '成', '▁研究员은', '▁Co', 'ex', '▁(', '首尔', '▁三成', '站', ')', '에서', '▁举行', '되는', '▁D', 'E', 'V', 'I', 'E', 'W', '▁20', '19', '▁第', '一', '天', '的', '▁参加', '했다', '.', '▁L', 'a', 'R', 'v', 'a', '团队', '的', "▁'", '超', '~', '大', '▁语言', '模型', '▁工厂', '▁运作', '기', "!'", '▁讲座', '을', '▁听', '으며', '▁语言', '模型', '을', '▁训练', '时', '▁', 'm', 'ul', 't', 'i', '-', 'G', 'P', 'U', ',', '▁T', 'P', 'U', '▁都', '▁想', '尝试', '▁使用', '다는', '▁想法을', '▁했다', '.', '[SEP]']
len: 90, pred_ner_tag:['[CLS]', 'O', 'B-DAT', 'I-DAT', 'B-LOC', 'O', 'O', 'O', 'O', 'B-PER', 'I-PER', 'I-PER', 'O', 'B-LOC', 'I-LOC', 'O', 'B-LOC', 'B-LOC', 'I-LOC', 'O', 'O', 'O', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'O', 'O', 'B-ORG', 'I-ORG', 'I-ORG', 'I-ORG', 'I-ORG', 'I-ORG', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '[SEP]']
decoding_ner_sentence: [CLS] 上月 <28日:DAT> <水原:LOC>에 居住的 <尹柱成:PER> 研究员은 <Coex:LOC>(<首尔:LOC> <三成站:LOC>)에서 举行的 <DEVIEW 2019第一天:POH>에 参加했다. <LaRva团队:ORG>的“超~大语言模型工厂运作器!”讲座时, 他想尝试用 multi-GPU, TPU 来训练语言模型。[SEP]
请输入句子: 文在寅总统28日在首尔Coex举行的‘Deview 2019’活动上出席,鼓励了年轻的开发者们,并提出了我们政府的人工智能基本构想。 来源:媒体今天 (http://www.mediatoday.co.kr)
len: 66, input_token:['[CLS]', '▁文在寅', '▁总统은', '▁28', '日', '▁首尔', '▁Co', 'ex', '에서', '▁举行', '▁‘', 'D', 'e', 'view', '▁(', 'D', 'e', 'v', 'i', 'ew', ')', '▁20', '19', '’', '▁活动上', '▁出席', '▁年轻的', '▁开发', '者们', '을', '▁鼓励', '하면서', '▁我们', '▁政府的', '▁人', '工', '智', '能', '▁基本', '构', '想', '을', '▁提出', '았다', '.', '▁来源', '▁:', '▁媒体', '今天', '▁(', 'http', '://', 'www', '.', 'm', 'edi', 'a', 't', 'oday', '.', 'co', '.', 'kr', ')', '[SEP]']
len: 66, pred_ner_tag:['[CLS]', 'B-PER', 'O', 'B-DAT', 'I-DAT', 'B-LOC', 'I-LOC', 'I-LOC', 'O', 'O', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-POH', 'I-POH', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', '[SEP]']
decoding_ner_sentence: [CLS] <文在寅:PER> 总统은 <28日:DAT> <首尔Coex:LOC>에서 举行的‘<Deview 2019:POH>’ 活动上出席,鼓励了年轻的 개발자们,并提出了我们政府的人工智能 기본构想。 来源:<媒体今天:POH> (<http://www.mediatoday.co.kr:POH>)[SEP]
请输入句子: 感谢SKTBrain公开的KoBERT模型,让我们能够轻松开发基于BERT-CRF的命名实体识别器。
len: 39, input_token:['[CLS]', '▁S', 'K', 'T', 'Brain', '에서', '▁K', 'o', 'BER', 'T', '▁模型', '을', '▁公开', '해', '준', '▁덕분에', '▁B', 'ER', 'T', '-', 'CRF', '▁기반', '▁개', '체', '명', '인', '识', '기', '를', '▁쉽게', '▁개발', '할', '▁수', '▁있었다', '.', '[SEP]']
len: 39, pred_ner_tag:['[CLS]', 'B-ORG', 'I-ORG', 'I-ORG', 'I-ORG', 'I-ORG', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'O', 'O', 'O', 'O', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '[SEP]']
decoding_ner_sentence: [CLS] <SKTBrain:ORG>에서 <KoBERT:POH> 모델을 공개해준 덕분에 <BERT-CRF:POH> 基于的命名 개体识认器를 쉽게 开발할 수 있었다.[SEP]
请输入句子: 终结者: 黑暗命运 (Terminator: Dark Fate) 是2019年上映的美国科幻, 动作电影。 1991年电影《终结者2: 审判日》之后28年, 詹姆斯·卡梅隆以制片人的身份回归系列。 琳达·汉密尔顿作为莎拉康纳回归, 与阿诺·施瓦辛格一起担任主角。
len: 102, input_token:['[CLS]', '▁终', '结', '者', ':', '▁黑', '暗', '▁命', '运', '▁(', 'T', 'er', 'm', 'in', 'at', 'or', ':', '▁D', 'ar', 'k', '▁F', 'at', 'e', ')', '是', '▁20', '19', '年', '▁上映', '한', '▁美国的', '▁S', 'F', ',', '▁动作', '电影', '이다', '.', '▁19', '91', '年', '▁电影', '▁终', '结', '者', '▁2', ':', '▁审判', '의', '▁日', '▁之后', '▁28', '年', '▁만에', '▁詹姆스', '▁卡', '메', '론', '이', '▁回归', '者', '로서', '▁시리즈', '에', '▁复归', '한', '▁作품', '이다', '.', '▁', '琳达', '▁ 해', '밀', '兹', '은', '▁사', '라', '▁康', '纳', '▁역', '으로', '▁돌아오', '며', '▁아', '노', '德', '▁施', '瓦', '辛', '格', '와', '▁함께', '▁주연', '을', '▁맡았다', '.', '[SEP]']
len: 102, pred_ner_tag:['[CLS]', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'O', 'B-DAT', 'I-DAT', 'I-DAT', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-DAT', 'I-DAT', 'I-DAT', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'B-NOH', 'I-DUR', 'O', 'B-PER', 'I-PER', 'I-PER', 'I-PER', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'O', 'B-PER', 'I-PER', 'I-PER', 'O', 'O', 'O', 'O', 'B-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'O', 'O', 'O', 'O', 'O', 'O', '[SEP]'] decoding_ner_sentence: [CLS] <터미네이터::POH> <다크 페이트:POH> (<Terminator: Dark Fate:POH>)는 <2019년:DAT> 개봉한 미국의 SF, 액션영화이다. <1991년:DAT> 영화 <터미네이터 2: 심판의 날:POH> 이후 <28년:NOH> 만에 <제임스 카메론:PER>이 제작자로서 시리즈에 복귀한 작품이다. <린다 해밀턴:PER>이 <사라 코너:PER> 역으로 돌아오면서 <아널드 슈워제네거:PER>와 함께 주연을 맡았다.[SEP]
문장을 입력하세요: 전 세계 최고의 기대작 <어벤져스> 시리즈의 압도적 대미를 장식할 <어벤져스: 엔드게임>이 지난 4월 14일(일)과 15일(월) 양일간 진행된 대한민국 내한 행사를 성공적으로 마무리 지었다. <어벤져스: 엔드게임>의 주역 로버트 다우니 주니어, 제레미 레너, 브리 라슨, 안소니 루소&조 루소 감독, 트린 트랜 프로듀서, 케빈 파이기 마블 스튜디오 대표까지 방문하여 특별한 대한민국 사랑을 뽐냈다. len: 134, input_token:['[CLS]', '▁전', '▁세계', '▁최고의', '▁기대', '작', '▁<', '어', '벤', '져', '스', '>', '▁시리즈', '의', '▁압도적', '▁대', '미', '를', '▁장', '식', '할', '▁<', '어', '벤', '져', '스', ':', '▁엔', '드', '게임', '>', '이', '▁지난', '▁4', '월', '▁14', '일', '(', '일', ')', '과', '▁15', '일', '(', '월', ')', '▁양', '일간', '▁진행된', '▁대한민국', '▁내', '한', '▁행사를', '▁성공', '적으로', '▁마무리', '▁지', '었다', '.', '▁<', '어', '벤', '져', '스', ':', '▁엔', '드', '게임', '>', '의', '▁주', '역', '▁', '로', '버', '트', '▁다', '우', '니', '▁주', '니', '어', ',', '▁제', '레', '미', '▁레', '너', ',', '▁', '브리', '▁라', '슨', ',', '▁안', '소', '니', '▁루', '소', '&', '조', '▁루', '소', '▁감독', ',', '▁트', '린', '▁트', '랜', '▁프로', '듀', '서', ',', '▁케', '빈', '▁파', '이', '기', '▁마', '블', '▁스', '튜', '디', '오', '▁대표', '까지', '▁방문', '하여', '▁특별한', '▁대한민국', '▁사랑을', '▁뽐냈다', '.', '[SEP]'] len: 134, pred_ner_tag:['[CLS]', 'O', 'O', 'O', 'O', 'O', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'O', 'O', 'B-DAT', 'I-DAT', 'I-DAT', 'I-DAT', 'O', 'B-DAT', 'O', 'O', 'B-DAT', 'I-DAT', 'O', 'B-DAT', 'O', 'B-NOH', 'I-NOH', 'O', 'B-LOC', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'O', 'O', 'O', 'B-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'O', 'B-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'O', 'B-PER', 'I-PER', 'I-PER', 'I-PER', 'O', 'B-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'O', 'B-PER', 'I-PER', 'I-PER', 'O', 'O', 'B-PER', 'I-PER', 'I-PER', 'I-PER', 'O', 'O', 'O', 'O', 'B-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'B-ORG', 'I-ORG', 'I-ORG', 'I-ORG', 'I-ORG', 'I-ORG', 'O', 'O', 'O', '[SEP]', 'O', 'B-ORG', 'O', 'O', 'O', '[SEP]'] decoding_ner_sentence: [CLS] 전 세계 최고의 기대작 <<어벤져스:POH>> 시리즈의 압도적 대미를 장식할 <<어벤져스: 엔드게임:POH>>이 지난 <4월 14일:DAT>(<일:DAT>)과 <15일:DAT>(<월:DAT>) <양일간:NOH> 진행된 <대한민국:LOC> 내한 행사를 성공적으로 마무리 지었다. <<어벤져스: 엔드게임:POH>>의 주역 <로버트 다우니 주니어:PER>, <제레미 레너:PER>, <브리 라슨:PER>, <안소니 루소:PER>&<조 루소:PER> 감독, <트린 트랜:PER> 프로듀서, <케빈 파이기:PER> <마블 스튜디오:ORG> 대표까지 방문하여 특별한 <대한민국:ORG> 사랑을 뽐냈다.[SEP]
문장을 입력하세요: ‘모든 단점은 장점이 될수 있다' (Lionel Andres Messi)
len: 29, input_token:['[CLS]', '▁‘', '모', '든', '▁단', '점', '은', '▁장점', '이', '▁될', '수', '▁있다', "'", '▁(', 'L', 'i', 'on', 'el', '▁A', 'n', 'd', 're', 's', '▁M', 'es', 's', 'i', ')', '[SEP]']
len: 29, pred_ner_tag:['[CLS]', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-POH', 'I-POH', 'I-PER', 'I-POH', 'I-POH', 'I-POH', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'O', '[SEP]']
decoding_ner_sentence: [CLS] ‘모든 단점은 장점이 될수 있다' (
注意事项
- 在将实体标记化时,如果标记的长度比实体本身长,可能无法准确提取实体(标记器的局限性)
- 对于这种情况,可以选择排除学习,但为了覆盖更广的范围,决定包括这些情况
- 例如:以首集开始至<13日:DAT> -> ('▁13', 'B-DAT') ('일까지', 'I-DAT')(包括助词等)
- 反之,如果标记长度小于实体本身,可以通过‘I-tag’标记解决
- 因为使用的是预训练的sentencepiece,无法更改词典(此外,需要另外找方法更改sp词典)
- pytorch-crf库不支持在多GPU上运行
- 后续需要更改
- 因为BERT基于LM,对错别字有一定的鲁棒性
- 随着句子长度不同,NER结果也会有所变化
- 对于英文数据,学习效果不佳
- 注意,词典中的'▁'标记与我们常用的下划线'_'不同
- 为防止B标签的NER和I标签的NER有所不同,测试了BERT+Bi(LSTM或GRU)+CRF结构
- 优点
- 对于长实体标记效果较好
- B标签的NER和I标签的NER不同情况明显减少
- 缺点
- 模型大小增大
- 有时会抓错B标签的位置 例:应该是<12日:DAT>的,包含前一句的句号会变成<. 12日:DAT>,或需要标记为<1.83%:PNT>的被标记为1.8<3%:PNT>
- 感想
- 因为B标签位置抓错,使用起来有点尴尬(需要改进)
- GRU的学习比LSTM快1个epoch左右
- 优点
- 如果要应用到其他语言,不必更改模型架构。只需更改词汇、预训练BERT(来自huggingface)和训练数据集。
数据集
NER标签集
- 总共有8个标签
- PER: 人名
- LOC: 地名
- ORG: 机构名
- POH: 其他
- DAT: 日期
- TIM: 时间
- DUR: 时段
- MNY: 货币
- PNT: 比率
- NOH: 其他数量表达
- 实体类别
- 实体名称:人名(PER),地名(LOC),机构名(ORG),其他(POH)
- 时间表达:日期(DAT),时间(TIM),时段(DUR)
- 数量表达:货币(MNY),比率(PNT),其他数量表达(NOH)
结果
-
Epoch: 12(无提前停止)
-
训练集数量:23032,验证集数量:931
-
训练集:
00002_NER.txt
,...,EXOBRAIN_NE_CORPUS_007.txt
(共1,425个文件) -
验证集:
EXOBRAIN_NE_CORPUS_009.txt
,EXOBRAIN_NE_CORPUS_010.txt
(共2个文件) -
分类报告
- 通常DAT, PER, NOH, ORG, PNT的得分较高
- POH, LOC等的得分较低
- 以验证集为准,macro avg F1:87.56
-
混淆矩阵
- 有时会将POH预测为ORG(将其他归类为机构,我认为这是合理的)
- 同样,有时会将ORG预测为PER(需要修改)
-
训练和评估的准确率和损失图表
-
基准测试(开发集 F1 分数)
Model | MacroAvg F1 score | Epoch | Date |
---|---|---|---|
KoBERT | 0.8554 | 12 | 191129 |
KoBERT+CRF | 0.8756 | 12 | 191129 |
KoBERT+BiLSTM+CRF | 0.8659 | 12 | 191129 |
要求
pip install -r requirements.txt
模型文件链接
训练
python train_bert_crf.py
推理
python inference.py
可视化
未来工作
验证管道- NER标签概率
- RestfulAPI
- 知识蒸馏
- Apex fp16半精度
- 重构,重构,重构