spaCy实体链接技术解析

49 阅读3分钟

spaCy实体链接技术:文本提及的实体落地

介绍

实体链接是将文本中提到的命名实体与知识库中的概念进行关联的技术。本文基于2019年比利时NLP meetup的演讲内容,详细解析了spaCy框架中的实体链接实现。

实体识别基础

  • 命名实体是一个或多个连续标记的跨度
  • 具有标签或类型,如“人物”、“地点”或“组织”
  • NER算法基于标注数据训练

实体链接框架

步骤概述

  1. 候选生成:为文本提及创建可能的WikiData ID列表
  2. 实体链接:从候选列表中选择最可能的ID

候选生成

通过解析维基百科链接构建知识库:

  • 为每个同义词推导指向特定ID的先验概率
  • 例如,"Byron"在35%的情况下指向"Lord Byron",在55%的情况下指向"Ada Lovelace"

实体链接器

比较候选实体与文本上下文的词汇线索:

  • 使用实体描述与上下文相似度进行消歧
  • 通过编码器将实体和句子转换为向量表示

技术架构

模型结构

64D实体描述 → 实体编码器 → 相似度计算 ← 句子编码器 ← 64D句子
                                     ↓
                                 损失函数
                                     ↓
                                P(E|M) [0,1]预测

知识库构建

  • 仅保留至少20个传入interwiki链接的实体(从800万减少到100万)
  • 每个别名-实体对在维基百科中至少出现5次
  • 每个别名/提及保留10个候选实体
  • 最终知识库包含约110万个实体和150万个别名

性能评估

维基百科数据测试

  • 随机基线:54.0%
  • 仅实体链接:73.9%
  • 先验概率基线:78.2%
  • 实体链接+先验概率:79.0%
  • 知识库上限:84.2%

新闻数据测试

  • 简单案例(230个实体):87.8%准确率
  • 困难案例(122个实体):27.3%准确率
  • 总体(352个实体):67.0%准确率

挑战与解决方案

数据质量问题

  • 维基百科训练数据手动整理
  • 移除不构成完整句子的情况
  • 修剪不指向命名实体的链接

新闻数据特定问题

  • 词汇变体(中间名、缩写形式)
  • 需要文章之外的背景信息
  • 转喻难以正确解析
  • 日期和数字解析困难

核心ference解析集成

  • 使用Hugging Face的neuralcoref包与spaCy配合
  • 将指向同一事物的实体链接在一起
  • 在新闻评估集上带来0.5-0.8%的性能提升

代码示例

# 创建知识库
kb = KnowledgeBase(vocab=vocab, entity_vector_length=64)
kb.add_entity(entity="Q42", prob=0.8, entity_vector=v2)

# 添加别名
kb.add_alias(alias="Douglas Adams", entities=["Q42"], probabilities=[0.9])

# 处理文本
doc = nlp("Douglas Adams made up the stories as he wrote.")
for ent in doc.ents:
    print(ent.text, ent.label_, ent.kb_id_)

未来工作方向

  • 获取更好的训练和评估数据
  • 考虑WikiData概念层次结构
  • 优化核心ference解析以提升性能
  • 提供自定义实现的可能性

该技术实现了将文本中的实体提及与结构化知识库连接,为信息提取和知识图谱构建提供了重要基础。