# el-baseline **Repository Path**: zetingh/el-baseline ## Basic Information - **Project Name**: el-baseline - **Description**: 千言-中文短文本实体链指Baseline - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: https://aistudio.baidu.com/aistudio/projectdetail/1308392 - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2021-08-09 - **Last Updated**: 2021-08-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 依赖环境 + loguru + paddlepaddle1.8.0 ### 一、比赛介绍 近年来,随着深度学习的重燃以及海量大数据的支撑,NLP 领域迎来了蓬勃发展,百度拥有全球最大的中文知识图谱,拥有数亿实体、千亿事实,具备丰富的知识标注与关联能力,不仅构建了通用知识图谱,还构建了汉语语言知识图谱、关注点图谱、以及包含业务逻辑在内的行业知识图谱等多维度图谱。我们希望通过开放百度的数据,邀请学界和业界的青年才俊共同推进算法进步,激发更多灵感和火花。 面向中文短文本的实体链指,简称 EL(Entity Linking),是NLP领域的基础任务之一,即对于给定的一个中文短文本(如搜索 Query、微博、对话内容、文章/视频/图片的标题等),EL将其中的实体与给定知识库中对应的实体进行关联。 传统的实体链指任务主要是针对长文档,长文档拥有在写的上下文信息能辅助实体的歧义消解并完成链指。相比之下,针对中文短文本的实体链指存在很大的挑战,主要原因如下: 1. 口语化严重,导致实体歧义消解困难; 2. 短文本上下文语境不丰富,须对上下文语境进行精准理解; 3. 相比英文,中文由于语言自身的特点,在短文本的链指问题上更有挑战。 本次评测任务旨在借助实体链指技术,拓展其对应的AI智能应用需求,并将技术成果实践于更多的现实场景。 + [进入比赛网页查看数据集、赛题任务等详细介绍](https://aistudio.baidu.com/aistudio/competition/detail/58) + [数据集链接](https://aistudio.baidu.com/aistudio/datasetdetail/60899) 本aistudio项目已默认挂载该数据集。 ### 二、目录说明 + 项目根目录: `work/el-baseline/` + 模型、预测文件保存目录: `work/el-baseline/outputs` + 代码目录`work/el-baseline/src` + `ernie/`: 百度`ERNIE1.0`动态图源代码 + `myReader/`: 数据预处理 + `myModel/`: 模型 + `train.py`和`predict.py` + 运行入口 + `run_train.sh`以及`run_predict.sh` ### 三、 赛题任务解析 + 实体链指任务通常是识别出一段文本中出现的**实体提及**(实体指称、Entity mention),并尝试将该实体指称链接到知识库中的目标实体。实体链指在知识图谱构建和使用中都具有重要作用。 + 本比赛提供的短文本数据集中,已经标注好了实体提及的位置,需要参赛者利用上下文以及知识库中的实体描述信息,尝试将每一个实体提及链接到知识库中的目标实体。如果知识库中不存在目标实体,则将该实体标记为NIL实体,并对实体进行分类。因此参赛者实际上需要实现**实体链接**和**实体分类**两个子任务。 ### 五、基线方案说明 #### 5.1 数据预处理说明 1. 先对知识库进行预处理,生成两个查找字典,即`id2entity.json`和`mention2id.json`,首次运行时这两个字典会保存在项目根目录的`dicts`文件夹下。其中两个字典的作用分别为: + `id2entity.json`: 在知识库中通过实体id查找对应的实体对象。 + `mention2id.json`: 通过实体提及名称查找对应的实体对象,用于初步召回候选实体。该字典的键为实体名称,值为同名实体的id构成的集合。 2. 对短文本中出现的每一个实体提及,通过`mention2id.json`以及`id2entity.json`两个查询字典进行候选实体集的初步召回。 3. 如果召回的候选实体集为空,则当前的实体提及就是一个NIL实体。否则对每一个候选实体,提取实体中的所有属性predicate和属性值object,将它们首位相连构成实体描述文本。例如对于实体 > `{'alias': [], 'subject_id': '58650', 'data': [{'predicate': '摘要', 'object': '《锦鲤》是中国邮政计划发行的一套邮票。'}, {'predicate': '义项描述', 'object': '邮票'}], 'type': 'Other', 'subject': '锦鲤'}` $\to$*摘要,《锦鲤》是中国邮政计划发行的一套邮票。,义项描述,邮票* 4. 分别对各个实体提及添加位置标记`#`,并将添加标记后的短文本与候选实体表述文本构成输入对,输入到ERNIE模型中,并通过训练二分类器的方式对候选实体集进行排序。训练过程中,通过负采样的方式,每个实体提及正负样本比例为1:2。 5. 分别对各个实体提及添加位置标记`#`后,同时训练一个24类别的分类器,24是NIL实体的上位概念类别数。输入样例为: > [CLS]火箭少女献唱西虹市首富:燃烧我的卡路里!#锦鲤#杨超越在哪呢?[SEP]摘要,《锦鲤》是中国邮政计划发行的一套邮票。,义项描述,邮票[SEP] #### 5.2 模型结构 + 两个子任务进行联合训练,对每一个输入样本,通过ERNIE编码后,使用模型计算得到两个loss,分别对应候选实体排序的二分类loss和实体上位概念分类的24分类loss,将两个loss相加后进行反向传播。如下图所示 + 模型构建代码在`src/myModel/models.py`中 ### 七、训练 + 当前脚本中已经给出了模型需要的参数,大家可以仔细阅读`src/train.py`以及`src/myUtils/args.py`下的代码查看或添加更多的参数配置。 + `args.py`下除了用于读取命令行参数的`get_parser()`工具外,还有一个`VersionConfig`类,这是用来保存模型训练阶段的参数,以便于在预测阶段加载模型时确保与训练参数一致,例如最大序列长度`max_seq_len` + `!cd el-baseline/ && bash run_train.sh` ### 八、预测 + 训练完成后进行预测,脚本中的load_from参数表示加载训练完成的模型路径 + 预测结果保存到run_predict.sh中的--load_from对应的文件夹中,命名为result_test.json或result_dev.json + --mode参数表示预测dev数据集还是test数据集 + `!cd el-baseline/ && bash run_predict.sh` ### 九、dev集本地评测 + 注意需要先确保修改`run_predict.sh`中的mode参数,并完成dev数据集的预测 `# 验证集评测 + !cd el-baseline/ && python src/eval.py output/combine/step_20000/result_dev.json ../../data/data60899/dev.json` ### 十、结果提交 + 从`run_predict.sh`中`--load_from`参数对应的目录中下载`result_test.json`文件,并重命名为`result.json`,即可到比赛提交页面上传提交.