Skip to content

taishan1994/pytorch_bert_entity_linking

Repository files navigation

pytorch_bert_entity_linking

基于bert的中文实体链接
在hugging face上下载好预训练的权重:chinese-bert-wwm-ext
已经训练好的模型以及数据:
链接:https://pan.baidu.com/s/17y29cBIqIuVzUMub60E53w
提取码:g7og
这里在预测的时候选择用修改后的jieba分词+自定义实体词典的方式来获取候选实体,需要注意的地方是对英文词组的切分方式。

目录说明

--checkpoints:模型保存
--data:数据
--logs:日志
--my_jieba:修改后的结巴分词,解决jieba分词不能将知识库中的kg ls正确分词
--utils:辅助函数,里面值得注意的是tokenization,主要解决的是进行token化的时候将英文、数字等分开。
--el_config.py:配置信息
--el_dataset.py:转换数据为pytorch的格式
--el_main.py:主运行文件,训练、验证测试和预测
--el_main.sh:运行指令
--el_models.py:模型
--el_preprocess.py:处理数据为bert需要的格式
--el_process.py:处理原始训练数据和知识库,得到一些中间文件
--el_processor.py:测试el_preprocess中的处理器
--el_service.py:进行起服务
--service.log:服务日志
--service_main.py:抽离主程序,用于起服务
--start_service.sh:开始服务
--stop_servie.sh:终止服务
--test_jieba.py:测试my_jieba
--test_service.py:测试调用起的服务
--test_tokenizer.py:测试tokenizer
同时,我们要注意数据的一些文件:在/data/ccks2019/下
alias_and_subjects.txt:知识库中的实体名
develop.json:用于预测
entity_to_ids.json:实体以及对应知识库中的id
entity_type.txt:实体的类型
kb_data:知识库
subject_id_with_info.json:知识库中实体id及其对应的相关信息
test.pkl:测试二进制文件
train.json:训练数据
train.pkl:训练二进制文件

流程

首先是el_process.py里面生成一些我们所需要的中间文件。然后是el_processor.py测试数据处理器。接着在el_preprocess.py里面处理数据为bert所需要的格式,并划分训练集和测试集,存储为相关二进制文件。在el_dataset.py里面转换为pytorch所需要的格式,最后在el_main.py里面调用。

依赖

pytorch==1.6
transformers
sklearn

命令

python el_main.py \
--bert_dir="../model_hub/chinese-bert-wwm-ext/" \
--data_dir="./data/ccsk2019/" \
--log_dir="./logs/" \
--output_dir="./checkpoints" \
--num_tags=2 \
--seed=123 \
--gpu_ids="0" \
--max_seq_len=256 \
--lr=2e-5 \
--other_lr=2e-4 \
--train_batch_size=32 \
--train_epochs=1 \
--eval_batch_size=32

训练和测试

2021-09-06 15:06:50,504 - INFO - el_main.py - train - 103 -trainepoch0 step:15038/15267 loss0.345154
2021-09-06 15:06:51,283 - INFO - el_main.py - train - 103 -trainepoch0 step:15039/15267 loss0.409021
2021-09-06 15:06:52,007 - INFO - el_main.py - train - 103 -trainepoch0 step:15040/15267 loss0.313814
2021-09-06 15:06:52,859 - INFO - el_main.py - train - 103 -trainepoch0 step:15041/15267 loss0.328172
========进行测试========
2021-09-06 16:04:21,522 - INFO - el_main.py - <module> - 252 -testloss1076.141372 accuracy0.9367 precision0.9133 recall0.9144 micro_f10.9367
2021-09-06 16:04:21,974 - INFO - el_main.py - <module> - 254 -               
              precision    recall  f1-score   support

           0       0.95      0.95      0.95    132491
           1       0.91      0.91      0.91     76887

    accuracy                           0.94    209378
   macro avg       0.93      0.93      0.93    209378
weighted avg       0.94      0.94      0.94    209378

预测

text = '《仙剑奇侠三》紫萱为保护林业平被迫显出原型'
====================================
2021-09-07 11:35:54,624 - INFO - el_main.py - <module> - 394 - 候选实体名:《
2021-09-07 11:35:54,624 - INFO - el_main.py - <module> - 395 - 知识库实体名书名号
2021-09-07 11:35:54,624 - INFO - el_main.py - <module> - 396 - 知识库ID219092
2021-09-07 12:12:46,730 - DEBUG - __init__.py - initialize - 118 - Building prefix dict from the default dictionary ...
2021-09-07 12:12:46,730 - DEBUG - __init__.py - initialize - 138 - Loading model from cache /tmp/jieba.cache
2021-09-07 12:12:47,425 - DEBUG - __init__.py - initialize - 170 - Loading model cost 0.695 seconds.
2021-09-07 12:12:47,425 - DEBUG - __init__.py - initialize - 171 - Prefix dict has been built successfully.
2021-09-07 12:13:14,608 - INFO - el_main.py - <module> - 393 - ====================================
2021-09-07 12:13:14,608 - INFO - el_main.py - <module> - 394 - 候选实体名:《
2021-09-07 12:13:14,608 - INFO - el_main.py - <module> - 395 - 知识库实体名书名号
2021-09-07 12:13:14,608 - INFO - el_main.py - <module> - 396 - 知识库ID219092
2021-09-07 12:13:14,608 - INFO - el_main.py - <module> - 397 - 置信分数0.1311657
2021-09-07 12:13:14,608 - INFO - el_main.py - <module> - 398 - 类型Thing
2021-09-07 12:13:14,608 - INFO - el_main.py - <module> - 399 - 描述摘要书名号是用于标明书名篇名报刊名文件名戏曲名歌曲名图画名等的标点符号亦用于歌曲电影电视剧等与书面媒介紧密相关的文艺作品书名号分为双书名号(《》)和单书名号(〈〉),书名号里还有......
2021-09-07 12:13:14,608 - INFO - el_main.py - <module> - 400 - ====================================
2021-09-07 12:13:14,609 - INFO - el_main.py - <module> - 393 - ====================================
2021-09-07 12:13:14,609 - INFO - el_main.py - <module> - 394 - 候选实体名仙剑奇侠
2021-09-07 12:13:14,609 - INFO - el_main.py - <module> - 395 - 知识库实体名仙剑奇侠传
2021-09-07 12:13:14,609 - INFO - el_main.py - <module> - 396 - 知识库ID39813
2021-09-07 12:13:14,609 - INFO - el_main.py - <module> - 397 - 置信分数0.38944265
2021-09-07 12:13:14,609 - INFO - el_main.py - <module> - 398 - 类型Game
2021-09-07 12:13:14,609 - INFO - el_main.py - <module> - 399 - 描述摘要,《仙剑奇侠传是由中国台湾大宇资讯股份有限公司(简称大宇资讯大宇”)旗下发行的系列电脑游戏仙剑故事以中国古代的仙妖神鬼传说为背景以武侠和仙侠为题材迄今已发行八款单机角色扮演游戏......
2021-09-07 12:13:14,609 - INFO - el_main.py - <module> - 400 - ====================================
2021-09-07 12:13:14,609 - INFO - el_main.py - <module> - 393 - ====================================
2021-09-07 12:13:14,609 - INFO - el_main.py - <module> - 394 - 候选实体名
2021-09-07 12:13:14,609 - INFO - el_main.py - <module> - 395 - 知识库实体名
2021-09-07 12:13:14,609 - INFO - el_main.py - <module> - 396 - 知识库ID254618
2021-09-07 12:13:14,609 - INFO - el_main.py - <module> - 397 - 置信分数0.3548399
2021-09-07 12:13:14,609 - INFO - el_main.py - <module> - 398 - 类型Vocabulary
2021-09-07 12:13:14,609 - INFO - el_main.py - <module> - 399 - 描述摘要数名二加一(在钞票和单据上常用大写)。三维空间三部曲三国(中国古代一个历史时期)。外文名ㄙㄢ three 3 词性数词名词拼音san笔画数3五笔dggg。......
2021-09-07 12:13:14,609 - INFO - el_main.py - <module> - 400 - ====================================
2021-09-07 12:13:14,609 - INFO - el_main.py - <module> - 393 - ====================================
2021-09-07 12:13:14,610 - INFO - el_main.py - <module> - 394 - 候选实体名:》
2021-09-07 12:13:14,610 - INFO - el_main.py - <module> - 395 - 知识库实体名书名号
2021-09-07 12:13:14,610 - INFO - el_main.py - <module> - 396 - 知识库ID219092
2021-09-07 12:13:14,610 - INFO - el_main.py - <module> - 397 - 置信分数0.08161632
2021-09-07 12:13:14,610 - INFO - el_main.py - <module> - 398 - 类型Thing
2021-09-07 12:13:14,610 - INFO - el_main.py - <module> - 399 - 描述摘要书名号是用于标明书名篇名报刊名文件名戏曲名歌曲名图画名等的标点符号亦用于歌曲电影电视剧等与书面媒介紧密相关的文艺作品书名号分为双书名号(《》)和单书名号(〈〉),书名号里还有......
2021-09-07 12:13:14,610 - INFO - el_main.py - <module> - 400 - ====================================
2021-09-07 12:13:14,610 - INFO - el_main.py - <module> - 393 - ====================================
2021-09-07 12:13:14,610 - INFO - el_main.py - <module> - 394 - 候选实体名紫萱
2021-09-07 12:13:14,610 - INFO - el_main.py - <module> - 395 - 知识库实体名紫萱
2021-09-07 12:13:14,610 - INFO - el_main.py - <module> - 396 - 知识库ID141031
2021-09-07 12:13:14,610 - INFO - el_main.py - <module> - 397 - 置信分数0.8763746
2021-09-07 12:13:14,610 - INFO - el_main.py - <module> - 398 - 类型FictionalHuman
2021-09-07 12:13:14,610 - INFO - el_main.py - <module> - 399 - 描述摘要紫萱改编自同名单机游戏的电视剧仙剑奇侠传三中的第三女主角由内地著名女演员唐嫣饰演冯骏骅配音她是女娲族后裔与徐长卿情牵三世不离不弃饱受情爱煎熬三生三世之苦爱情是她的执着等待是......
2021-09-07 12:13:14,610 - INFO - el_main.py - <module> - 400 - ====================================
2021-09-07 12:13:14,610 - INFO - el_main.py - <module> - 393 - ====================================
2021-09-07 12:13:14,610 - INFO - el_main.py - <module> - 394 - 候选实体名保护
2021-09-07 12:13:14,611 - INFO - el_main.py - <module> - 395 - 知识库实体名保护
2021-09-07 12:13:14,611 - INFO - el_main.py - <module> - 396 - 知识库ID179940
2021-09-07 12:13:14,611 - INFO - el_main.py - <module> - 397 - 置信分数0.9528888
2021-09-07 12:13:14,611 - INFO - el_main.py - <module> - 398 - 类型Vocabulary
2021-09-07 12:13:14,611 - INFO - el_main.py - <module> - 399 - 描述摘要保护指尽力照顾使自身(或他人或其他事物)的权益不受损害语出书·毕命》“分居里   :“分别民之居里异其善恶成定 东周 郊境使有保护近义词保卫注音bǎo h......
2021-09-07 12:13:14,611 - INFO - el_main.py - <module> - 400 - ====================================
2021-09-07 12:13:14,611 - INFO - el_main.py - <module> - 393 - ====================================
2021-09-07 12:13:14,611 - INFO - el_main.py - <module> - 394 - 候选实体名林业平
2021-09-07 12:13:14,611 - INFO - el_main.py - <module> - 395 - 知识库实体名林业平
2021-09-07 12:13:14,611 - INFO - el_main.py - <module> - 396 - 知识库ID32716
2021-09-07 12:13:14,611 - INFO - el_main.py - <module> - 397 - 置信分数0.93222207
2021-09-07 12:13:14,611 - INFO - el_main.py - <module> - 398 - 类型FictionalHuman
2021-09-07 12:13:14,611 - INFO - el_main.py - <module> - 399 - 描述摘要林业平是电视剧仙剑奇侠传三角色长安玄道观掌门道长一心向道但遇到紫萱之后动了情愫作品将其设定为一个性格十分坚韧的正面角色女儿林青儿饰演霍建华其他名称顾留芳徐长卿业平......
2021-09-07 12:13:14,611 - INFO - el_main.py - <module> - 400 - ====================================
2021-09-07 12:13:14,611 - INFO - el_main.py - <module> - 393 - ====================================
2021-09-07 12:13:14,611 - INFO - el_main.py - <module> - 394 - 候选实体名原型
2021-09-07 12:13:14,611 - INFO - el_main.py - <module> - 395 - 知识库实体名原型
2021-09-07 12:13:14,612 - INFO - el_main.py - <module> - 396 - 知识库ID290312
2021-09-07 12:13:14,612 - INFO - el_main.py - <module> - 397 - 置信分数0.9565517
2021-09-07 12:13:14,612 - INFO - el_main.py - <module> - 398 - 类型CreativeWork
2021-09-07 12:13:14,612 - INFO - el_main.py - <module> - 399 - 描述摘要原型汉语词语读音为yuán xíng指原来的类型或模型特指文学艺术作品中塑造人物形象所依据的现实生活中的人注释指原来的类型或模型外文名modelprototypearchet......

起服务

nohup python -u el_service.py --ip '0.0.0.0' --port '1080' > service.log 2>&1 &

测试服务

import requests

text = '恶魔猎手吧-百度贴吧--《魔兽世界》恶魔猎手职业贴吧...'
text = text.encode('utf-8')
url = 'http://0.0.0.0:1080/entity_linking'
result = requests.post(url, data=text)
result = result.text
print(result)

终止服务

最后面要多一个空格。

ps -ef|grep "el_service.py --ip ${ip}"|grep -v grep|awk '{print $2}'|xargs kill -9 

讲在最后

  • 该项目是对实体链接的一种尝试,采用的是BERT的句子对模式,即[CLS]实体描述[SEP]查询句子[SEP],利用二分类的思想,取出实体所对应的向量和CLS进行拼接后再分类。在预测的时候采用的直接分词的方式,并判断每个词是否在实体库中,因此可能不大准确,可以利用命名实体识别的方式进行改进。
  • 记得修改相关位置的路径为自己的路径。

About

基于bert的中文实体链接

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published