任务描述

现有douban、mtime、maoyan三个来源的电影,包含名称、简介、导演、演员、类型等等属性。
需要相同的电影融合为一个电影条目,其中maoyan数量很少,可以合并到mtime中。

参照实体消歧(或实体链接)的惯用语,数量最多的douban可以作为知识库中的entity,mtime(+maoyan)作为需要链接到KB的mention。

思路

事实上,这个任务也相当于文本多分类任务。类别数为KB中的entity数,那么将模型运算得到的mention hidden states输入到最后一层全连接层,哪个位置的神经元输出最高,即意味着属于该index对应类。

但是,KB中的entity数量并不是固定不变的。如果有新的entity加入,那么需要重新训练新维度的linear layer。因此,不能使用这样的池化操作来进行分类。

这个问题也可以通过计算相似度,然后取最高的来完成。

通过模型(这里使用单纯的BERT)计算得到每个mention的emb和每个entity的emb,二者计算得到余弦相似度(或者计算点积距离,不必归一化,实验中采取这种方式),再取相似度最高的作为预测结果。

架构

模型主要使用BERT来计算文本相似度,电影名和简介作为两个输入,实际会拼接为 [CLS]电影名[SEP]简介[SEP]。当然也可以使用RoBERT等transformer模型。

M=BERT(textM)M = BERT(text_M)M=BERT(textM​)
E=BERT(textE)E = BERT(text_E)E=BERT(textE​)

得到的mention的embs MMM 与entity的embs EEE 做点积,再通过softmax激活,得到评分矩阵SSS,SijS_{ij}Sij​即表示MiM_iMi​与EjE_jEj​是同一个实体的概率。

S=σ(MET)S = \sigma{(ME^T)}S=σ(MET)

sigmoid适用于二分类,softmax则适用于多分类任务。这里使用余弦相似度也未尝不可,一样能够得到小于1的scores。但是观察发现,余弦相似度最低也是0.5,相似度0.9以上的候选项非常之多,很难找到一个合适的阈值过滤无效预测。
另外,尽管KB中可能本来就有重复的entity,但这样的数量应当非常之少,绝大多数mention对应了小于等于1个entity,因此可以视作多分类任务,而非多标签任务。

损失函数使用交叉熵损失函数

L=CrossEntropyLoss(S,groundtruth)L = CrossEntropyLoss(S, groundtruth)L=CrossEntropyLoss(S,groundtruth)

实验

数据集包括完整的属性信息details.csv和真实的链接映射link.csv,按照惯例,以6:2:2分割link.csv。

与我此前做过的实验相比,特殊的是,train、valid、test三个过程差别很大。

Train

将mention和对应实体的文本成对地存入Dataloader。按batch取到一个mention_batch和entity_batch,分别送入模型计算得到MMM、EEE,然后计算损失,进行反向传播。

注:如果采用余弦相似度(我最开始的做法),没必要依前述对二者做矩阵乘,在计算损失时,事实上只用到了groundtruth对应的概率。因此,只需要按行求二者行向量的余弦相似度即可。

Valid

输入为mention对应的文本,以及所有entity的文本,形成两个DataLoader。但是将所有entity都计算一遍耗时过长,因此只计算mention对应groundtruth的文本集合。

指标

多分类任务也可以使用二分类任务常用的precision、recall、F1、AUC。但在平均上,有macro和micro之分。

如上述所说,一个entity对应的mention一般为0或1个。换句话说,类别样本比较均衡。因此使用不考虑数据数量,平等看待每一类的macro-F1即可。

实验中,我使用的Acc最高可达98%,AUC最高可达99.99%,已经相当之高了,因此没有横向的比较实验。

Test

因为只在Valid最佳时进行Test(Valid指标最佳时保存模型),次数少,因此这次的输入就应当是所有entity了。

因为数据量增加,Acc指标有所下降,但也是96%

现在需要找到一个阈值,概率大于的算有效预测,小于的不放入预测结果中,首先保证有效预测的尽可能正确(precison),其次最好预测出来的足够多(recall),这个和PR曲线的阈值不大一样,需要自己手写。

另外,既然侧重于精度precision,那么可以用β\betaβ较小(我取的0.8)的FβscoreF_\beta scoreFβ​score来衡量。

以0.01为步长,遍历0.70到0.99之间的可能阈值,precision<0.9直接不考虑,然后找什么时候F-score最大,结果就是0.7…

classify

然后对数据库中尚未确定的电影进行分类。

输出pred.csv,第一列为douban _id,第二列为other _id,第三列为概率时。共5w+条,随机选取样例发现0.7以上比较准确,以0.75为阈值筛出1.2w,以0.7为阈值筛出1.36w.

还可以改进的地方

首先,因为选取的数据集电影名称一定是相同的,虽然这符合正常的模式,但是还是有可能导致模型过分倾向于名称,简介影响变小。因此,可以加入负样本,最好为电影名相同,但并非同一电影的负样本,不过可能数据量比较少,还需要其他负样本填补。然后选择一个pairwise的loss进行优化。

其次,BERT可以接受一到两句话作为输入,并希望每句话的开头和结尾都有特殊的标记。(我使用的是transformers提供的pytorch实现)。所以我只输入了两个属性,其他属性没有用上。

其实也可以用另一个BERT来计算其他属性提供的hidden state,与之前的做一个多模态的串联,加一个attention层输出得到最终的emb表示。

导演、演员、类型为列表形式,可以直接输入字符串(但可能没有多大效果),也可以用GRU来计算。因为一般排在最前面的最重要,所以可以逆序输入。

我简单改了改做了实验,最后效果提升不大。

【创新实训】BERT4EL,基于文本相似度的实体消歧实现相关推荐

  1. 创新实训个人记录 : 个人工作总结

    创新实训个人记录 : 个人工作总结 分条目.分进度总结个人工作 阅读书籍(6.8-6.18) 近似算法设计(6.19-6.27) 程序验证(6.28-7.1) 工作难点 接触近似算法领域,学习新知识 ...

  2. 创新实训团队记录:为BR-MTC问题设计一个近似算法

    创新实训团队记录 : 为BR-MTC问题设计近似算法 阅读书籍和论文 近似算法设计思路变化总结 算法框架 改变初始顶点集 继续添加路径,作为新的初始顶点集 程序验证 近似解与最优解存在差距&& ...

  3. 【项目实训】基于人脸识别的课堂签到管理系统(python+qt5+sqlite3+百度智能云)

    [项目实训]基于人脸识别的课堂签到管理系统(python+qt5+sqlite3+百度智能云) 一.环境介绍 二.签到功能 2.1 启动签到 2.2 结束签到 三.用户组操作 3.1 添加用户组 3. ...

  4. 创新实训(2)-Scrapy 学习

    创新实训(2)-Scrapy 学习 参考资料:Scrapy 0.25 文档 1.Scrapy简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理 ...

  5. 山东大学软件学院项目实训-创新实训-SDUMeeting(一)

    山东大学软件学院项目实训-创新实训-SDUMeeting(一) 一.前言: 这个项目是山东大学视频会议项目,这个项目基于webrtc构建多人视频会议系统,我负责视频会议客户端及服务端安全防护,这个专栏 ...

  6. 山东大学软件学院项目实训-创新实训-SDUMeeting(六)

    山东大学软件学院项目实训-创新实训-SDUMeeting(六) 端对端加密与密钥交换 端到端加密(end-to-end),是一种只有参与通讯的用户可以读取信息的通信系统.它可以防止潜在的窃听者--包括 ...

  7. 创新实训个人记录:approximation factor, maximum matchingvertex cover

    创新实训个人记录:approximation factor, maximum matching&&vertex cover approximation factor(近似比) maxi ...

  8. 创新实训个人记录:P versus NP

    创新实训个人记录:P versus NP computation&&computable&& computational efficiency 一些符号 decision ...

  9. 创新实训个人记录:metric k-center

    创新实训个人记录:metric k-center 一些概念 k-center(k-中心) dominating set(支配集) independent set(独立集) 独立集&&支 ...

最新文章

  1. 嵌入式 ARM 汇编编程例题(二维数组按规律求和,求两数 gcd / lcm,求数组 min / max,字符串复制,排序)
  2. Android应用开发:网络编程-1
  3. loadrunner代理录制脚本方法介绍
  4. python爬虫教程:爬虫的基本流程
  5. 询问HTG:白噪声屏幕保护程序,有效的文件命名以及从密码泄露中恢复
  6. 教育资源数字化 计算机和通讯,《计算机网络技术课程数字化资源开发研究》.doc...
  7. mysql错误代码1怎样解决_打开网页提示mysql发生错误,错误号1194,请问下该怎么解决? 爱问知识人...
  8. xenCenter创建镜像库和挂载硬盘
  9. 18 亿美元!腾讯最大股东收购全球第三大程序员社区 Stack Overflow
  10. 我为什么离开华为加入ThoughtWorks(思特沃克)
  11. PHP设置header出现警告headers already sent by (output started at......
  12. 「模仿」是架构师的基本能力:守破离
  13. 从白嫖百度AI Studi Telsa V100 32G训练资源到使用tensorflow训练全流程(个人用)
  14. 弃全从简 转转的二手手机路好走吗?
  15. python下载迅雷资源_PYTHON实现迅雷、FLASHGET、QQ旋风转真实链接、磁链转种子文件、迅雷快传链接抓取 | 学步园...
  16. web前端面试题附答案035-关于number考点大全,走过路过不会错过
  17. 如何训练GAN?训练GAN的技巧和方法
  18. 基于WASM的H265 Web播放器
  19. adonis命令模块学习笔记
  20. matlab创建控件失败win7,Win7系统无法安装ActiveX控件的解决方法

热门文章

  1. 前端岗位一般的任职要求
  2. bufg和bufgp_Xilinx FPGA全局时钟和第二全局时钟资源的使用方法(转)
  3. Interpolator插值器
  4. linux启动mysql失败,Fatal error: Can‘t open and lock privilege tables: Table ‘mysql.host‘ doesn‘t exist
  5. Delphi 和 TMS 控件在 ERP 软件开发领域的 20 年:访谈
  6. MavenLombok
  7. VMware打开VMDK格式文件
  8. mtk平台android编译命令,MTK 常见的编译命令
  9. 区块链是如何解决慈善公益项目中存在的问题呢?
  10. 地脚螺钉直径系列_地脚螺钉的作用,地脚螺钉直径规格!