CCKS2023-面向上市公司主营业务的实体链接评测-亚军方案

news/2024/7/24 9:11:20 标签: 自然语言处理, ai, AI数据科学竞赛
aidu_pl">

赛题分析

大赛地址

https://tianchi.aliyun.com/competition/entrance/532097/information

任务描述

本次任务主要针对上市公司的主营业务进行产品实体链接。需要获得主营业务中的产品实体,将该实体链接到产品数据库中的某一个标准产品实体。产品数据库将发布在竞赛平台上。比如某一公司主营业务为“主要生产日用居家小家电,生活零售用品等相关产品”,选手从这段话中得到“日用居家小家电”这一产品实体,称为主实体;通过实体链接技术,找到产品数据库中的“生活小件家电”这一标准产品实体,称为链接实体。主实体与链接实体构成一个链接实体对,表示这两个实体是不同名称的相同实体。通过这些链接实体对,从而实现词语消歧以及数据源的融合。选手可以通过合理途径利用其他相关信息辅助任务完成,但是需要在方法描述文档中详细描述如何获取的相关信息以及如何在任务中使用该信息。

任务目标

参赛队伍需要能够准确的从公司主营业务中的出所有产品实体,即主实体,并且需要确定每个主实体在产品数据库中是否存在链接,若存在则需要在产品数据库中找到所有链接实体,形成一个或多个链接实体对,并给出权重,完成实体链接。需要注意的是,一个主实体的所有链接实体的权重相加需要为1。   
        
数据样例一:

输入:{“companyName”:“xx公司”, “主营业务描述”:“ 公司主要业务为电力、热力生产和供应。”}
输出:{“companyName”:“xx公司”,“EntityPairs”:[[(“电力生产”,“独立电力生产商”,1)],[(“电力供应”,”电力贸易”,1)],[(“热力生产”,”热力的生产和输供”,1)],[(“热力供应”,”热力的生产和输供”,1)]]}

数据样例二:

输入:{“companyName”:“xx公司”, “主营业务描述”:“ 啤酒、饮料制造和销售。”}
输出:{“companyName”:“xx公司”,“EntityPairs”:[[(“啤酒”,“啤酒”,1)],[(“饮料”,”饮料”,1)],[(“啤酒销售”,”啤酒零售”,0.5),(“啤酒销售”,”酒类分销商”,0.5)],[(“饮料销售”,”饮料零售”,1)]]}

任务描述和方案构思

本次任务主要针对上市公司的主营业务进行产品实体链接。首先需要获得主营业务中的产品实体,然后将该实体链接到产品数据库中的某一个标准产品实体。基于此,本方案将赛题任务拆解为三个阶段,如下图所示。

  • 第一阶段:对每个公司的主营文本进行实体抽取,得到待链接的产品实体;
  • 第二阶段:训练向量召回模型,利用产品数据库构建向量索引,并且对每个待链接实体进行向量召回,得到召回候选项;
  • 第三阶段:训练分类排序模型,基于上一阶段得到的召回候选项,进行二分类,得到最终的链接实体;
下面分别对每一个阶段进行详细描述。

任务方案拆解

第一阶段-实体抽取

本阶段任务是对每个公司的主营文本进行实体抽取,得到待链接的产品实体。但是观察数据发现,主营文本中产品实体错综复杂,属于 常规实体、间断实体(非连续实体)和嵌套实体的混合型实体还有一些总结性的实体,单一的实体抽取方案很难处理这种情况。基于此,最终采用采用了两种方案:基于span双指针网络的抽取方案和基于cpt模型的生成式方案。
     
span双指针网络的抽取方案

在指针标注体系中,使用span模块代替了CRF模块,加快了训练速度,以半指针-半标注的结构预测实体的起始位置,同时标注过程中给出实体类别,简单点说,就是设置两个指针start和end,分别记录每一种实体的开始和结束的位置,并且在记录位置的同时,标注该实体的类别,如上图所示,”商品零售业“和”宾馆旅游业“表示两个实体,但是同属于产品实体一类,实体类别用1表示,最后输出层分别用start dense layer和end dense layer两个指针网络标注两个实体的起始位置和所属类别,最后的损失由两个指针网络的损失累加求和。
       
训练数据
   
span双指针网络的抽取方案,在训练数据方面,做了一些数据增强,主要集中在两点:
  • 将产品数据库中的数据直接加入训练集,进行模型训练;
  • 使用链接实体替换主营业务文本中的产品实体,进行数据增广;
   
基于cpt模型的生成式方案

cpt模型是复旦nlp提出的中文生成式模型,本方案基于cpt模型,用于实体抽取。比如某一个公司的主营业务文本为:主营业务为商品零售业和宾馆旅游业,那么具体训练逻辑如下:
  • 训练集输入:主营业务为商品零售业和宾馆旅游业;
  • 训练集标签:商品零售业#宾馆旅游业;
标签使用固定格式,即:使用#进行分割,使用这种生成的方式进行实体抽取。
cpt参考链接:https://github.com/fastnlp/CPT
   
训练数据
  
基于cpt模型的生成式实体抽取方案,在训练数据方面,做了一点优化:
  • 使用链接实体替换主营业务文本中的产品实体,进行数据增广;
模型融合
   
另外,本阶段使用不同的训练参数(种子、学习率、对抗学习fgm参数、batch_size等等)、不同的初始化模型权重,训练了两个方案的多个模型,每个模型预测一次,生成多个预测文件,进行融合,并且在融合过程中,对于相似的实体,进行实体消歧。

第二阶段-向量召回

本阶段任务是训练向量召回模型,并且利用产品数据库构建向量索引,然后对实体抽取得到的实体(产品实体)进行向量召回,得到召回候选项。
向量召回模型的选择
本方案向量召回模型选择的是基于对比学习的simcse模型,结构如下图,simcse原理这里不再赘述,可自行查阅论文。

向量召回模型训练的数据准备
训练数据主要由两部分组成,正例数据和负例数据。
  • 正例数据:直接使用官方提供的训练数据,使用其中的产品实体和链接实体组成正例对;
  • 负例数据:产品实体从产品数据库中随机选择实体组成负例;
向量索引的构建
向量召回模型训练完成之后,对产品数据库中的每一个产品实体进行向量化表征,然后利用faiss工具构建向量索引库;
实体向量召回
   
基于第一阶段实体抽取得到的实体,对每一个实体进行向量召回,取top30的召回项作为候选项。

第三阶段-分类排序

经过第一阶段和第二阶段,已经得到了公司主营业务文本中的每一个产品实体及其对应的top20候选项,接下来是确定top30候选项中哪些是真正的链接实体,我们选择了二分类来做这个任务。
分类模型
分类模型选择基于bert的二分类模型,如下图所示。

分类模型训练数据
训练数据主要由两部分组成,正例数据和负例数据。
  • 正例数据:直接使用官方提供的训练数据,使用其中的产品实体和链接实体组成正例对;
  • 负例数据:从正例数据中,对产品实体进行向量召回,得到top20候选项,从top20候选项中过滤掉真正的链接实体,剩下的非链接实体与原来的产品实体,组成负例对。举个例子,官方提供的训练数据中,面类和面条分别是产品实体和链接实体,利用向量召回,对面类进行召回,得到两个候选项:面条和面料,显然面类和面料组成一对负例。
分类模型训练完成之后,便可以对公司主营业务文本中的每一个产品实体及其对应的top30候选项,进行分类,确定其真正的链接实体。

总结

最终成绩:初赛第一名,复赛第二名。
另外,感觉给标注数据整体质量不高,存在很多前后冲突、模棱两可的情况,因此榜单上的整体得分都不高。

http://www.niftyadmin.cn/n/5235391.html

相关文章

程序员日常使用Shell命令:提高工作效率的实用技巧

作为程序员,我们每天都在与代码和工具打交道。其中,Shell是一个非常重要的工具,它可以帮助我们高效地完成各种任务。本文将列举一些程序员日常使用Shell提高效率的操作,帮助大家更好地利用Shell提高工作效率。 首先,让…

微服务的应用架构

架构描述的是在更高层次将应用拆分为子系统或模块的方法,以及这些子系统之间的交互关系。在一个基于微服务架构构建的应用中,每个服务都需要有自己的架构。 事实上,单体应用在复杂度较低时,它的生产效率是要高于微服务的。只有在…

深度学习实战63-利用自适应混合金字塔网络实现人脸皮肤美颜效果,快速部署与实现一键美颜功能

大家好,我是微学AI,今天给大家介绍一下深度学习实战63-利用自适应混合金字塔网络实现人脸皮肤美颜效果,快速部署与实现一键美颜功能。在本文中,我将介绍一种新颖的自适应混合金字塔网络(ABPN),该网络可以实现对超高分辨率照片的快速局部修饰。该网络主要由两个组件组成:一…

基于Java+Swing+Mysql图书管理系统(含实训报告)

基于JavaSwingMysql图书管理系统-含实训报告 一、系统介绍二、功能展示1.用户登陆 四、其他系统实现五、获取源码 一、系统介绍 该系统实现了查看登录界面、主页界面、图书类别管理、用户借阅记录、用户图书查询、用户图书归还、用户信息修改。 运行环境:idea、jd…

共享智能指针shared_ptr

共享智能指针 在C中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针(smart pointer)。智能指针是存储指向动态分配(堆)对象指针的类,…

6-15 复制字符串

#include<stdio.h> #include<string.h> int main(){int i;char s1[80],s2[80];printf("输入的s2是&#xff1a;");scanf("%s",s2);for(i0;i<strlen(s2);i)s1[i]s2[i];printf("复制后的s1是&#xff1a;%s\n",s1); return 0;}

2024年AMC8美国初中数学竞赛最后一个月复习指南(附资料)

还有一个半月的时间&#xff0c;2024年AMC8&#xff08;大家默认都直接叫这个比赛的英文名&#xff0c;而不叫中文名美国数学竞赛或美国初中数学竞赛了&#xff09;就要开始了。 有志于在2024年AMC8的比赛中拿到奖项的孩子已经在“磨拳霍霍”了。那么最后一个半月的时间该如何…

【mysql】mysgld.log文件太大怎么办

我们有一台测试服务器。跑着一个msyq&#xff0c;发现没有空间了。差看日志文件占用了很多。 怎么破 使用下面命令 echo "" >mysqld.log 执行命令后