spaCy实体链接:将文本提及与知识库关联

4 阅读6分钟

spaCy实体链接:将文本提及与知识库关联

实体识别基础

命名实体是一个由单个或多个标记组成的连续片段,具有"人物"、"地点"或"组织"等标签类型。命名实体识别算法需要在标注数据(如OntoNotes)上进行训练。

实体链接概念

"联合国世界气象组织"这个例子中:

  • 通过分词、词嵌入、依赖树解析等技术定义词语之间的关系
  • 实体链接:将命名实体解析为知识库中的概念
  • 将词汇信息"落地"到"现实世界"
  • 允许将数据库事实与文本信息完全集成

实体链接框架

步骤0:假设原始文本已完成NER,因此已有实体及其标签

步骤1:候选实体生成 - 为提及创建可能的WikiData ID列表

步骤2:实体链接 - 从这些候选项中消歧,选出最可能的ID

示例:"Ms Byron would become known as the first programmer."中的Byron(人物)可能对应的候选ID包括:

  • Q7259(Ada Lovelace)
  • Q5679(Lord George Gordon Byron)
  • Q272161(Anne Isabella Byron)

候选实体生成

任务:给定文本提及,生成候选ID列表

方法:构建知识库以查询候选实体,通过解析维基百科链接实现:

  • "William King"是"William King-Noel, 1st Earl of Lovelace"的同义词(其他同义词还包括"Earl of Lovelace"、"8th Baron King"等)
  • 对于每个同义词,通过将配对频率归一化为先验概率,推断它们指向特定ID的可能性
  • 例如:"Byron"在35%的情况下指向"Lord Byron",在55%的情况下指向"Ada Lovelace"

实体链接器

任务:给定候选ID列表和文本上下文,产生最可能的标识符

方法:比较候选实体与上下文之间的词汇线索

示例:

  • Q5679(Lord Byron):英国诗人,浪漫主义运动领军人物 - 上下文相似度0.1
  • Q272161(Anne Isabella Byron):Byron的妻子 - 上下文相似度0.3
  • Q7259(Ada Lovelace):英国数学家,被认为是第一位计算机程序员 - 上下文相似度0.9

Q7259的描述与原始句子最相似,因此被选为正确答案。

技术架构

  • 使用64维实体描述编码器
  • 句子通过编码器生成64维向量
  • 计算句子向量与实体向量之间的相似度
  • 通过损失函数优化,使模型输出P(E|M)概率值
  • 与知识库提供的黄金标签(0或1)进行比较

知识库构建与限制

为保持知识库在内存中可管理,需要进行剪枝:

  • 仅保留至少有20个传入跨语言链接的实体(从800万减少到100万)
  • 每个别名-实体对在维基百科中至少出现5次
  • 每个别名/提及保留10个候选实体
  • 最终结果:约110万实体和150万别名
  • 存储100万实体和150万别名及预训练的64维实体向量需要350MB文件

知识库仅存储了所有WikiData概念的14%!即使使用理想的实体消歧步骤,实体链接的最高准确率也只能达到84.2%。

实体链接准确率评估

在20万条维基百科文章提及上训练(2小时),在5000条不同维基百科文章提及上测试:

  • 随机基线(从候选集中随机选择):54.0%
  • 仅使用EL算法:73.9%
  • 先验概率基线(忽略上下文,选择同义词最可能的实体):78.2%
  • EL + 先验概率:79.0%
  • 理想KB上限:84.2%

EL算法显著优于随机基线,并略优于先验概率基线。

错误分析

  • "Banteay Meanchey, Battambang, Kampong Cham, ... and Svay Rieng." → 预测为"柬埔寨城市",黄金链接为"柬埔寨省份"
  • "Societies in the ancient civilizations of Greece and Rome preferred small families." → 预测为"Greece",黄金链接为"Ancient Greece"
  • "Agnes Maria of Andechs-Merania (died 1201) was a Queen of France." → 预测为"987至1791年的西欧王国",黄金链接为"current France"(黄金标签有误!)

维基百科数据问题

手动筛选500个案例发现:

  • 7.4%不构成完整句子
  • 8.2%不指向合适实体 在剩余422个案例中:
  • 87.7%的预测与黄金标签一致
  • 5.2%不一致
  • 7.1%存在歧义或需要句子外的上下文

其他问题:

  • 无句子上下文的实体(如枚举、表格、"参见"部分)→ 需要从数据集中移除
  • 有些链接不是真正的命名实体,而是指向"隐私"等其他概念 → 需要修剪WikiData KB
  • 维基百科注释不一定与实体类型对齐:"斐济近年来经历了多次政变,1987年、2000年和2006年。" → 应链接到"2000年斐济政变"还是年份"2000"?
  • "巴黎、里昂和马赛都有完整的地铁系统运行" → 维基百科链接指向"Marseille Metro"而非"Marseille"

新闻数据评估

在352个实体上的准确率:

  • 随机基线:29.6%
  • 仅EL:44.7%
  • 先验概率基线:64.4%
  • EL+先验概率:67.0%
  • 理想KB上限:77.2%

发现:

  • 16%不是合适的实体/句子或是日期实体(如"近两个月")
  • 9%指向WikiData中不存在的概念
  • 2%难以解决
  • 新闻数据集上,EL相比先验概率基线的提升更为显著

核心消除指代解析

核心消除指代将指向同一事物/人物的实体链接在一起(如"他"指代"Nader")。Hugging Face的neuralcoref包可与spaCy配合使用。

核心消除指代有助于跨句子链接概念,整个指代链应链接到同一WikiData ID。当前EL算法针对句子级别预测进行训练。

评估结果:

  • 维基百科开发集:准确率下降0.3%(维基百科链接有偏差:通常只链接首次出现且有最多上下文的实体)
  • 新闻评估集:准确率提升0.5-0.8%("简单"从87.8到88.3,"困难"从27.3到28.1,"全部"从67.0到67.5)

正在进行的工作

  • 获取更好的训练和评估数据以更好地基准测试模型选择
  • 考虑WikiData概念的层次结构(预测省份而非其首府城市比预测无关城市更好,在损失函数中考虑这一点可使训练更稳健)
  • 利用核心消除指代提升实体链接性能,并丰富训练数据

代码示例

# 禁用除entity_linker外的其他管道
other_pipes = [pipe for pipe in nlp.pipe_names if pipe != "entity_linker"]
with nlp.disable_pipes(*other_pipes):
    optimizer = nlp.begin_training()
    nlp.update(...)

# 创建实体链接器管道
el_pipe = nlp.create_pipe(name='entity_linker', config={"context_width": 128})
el_pipe.set_kb(kb)
nlp.add_pipe(el_pipe, last=True)

# 构建知识库
kb = KnowledgeBase(vocab=vocab, entity_vector_length=64)
kb.add_entity(entity="Q1004791", prob=0.2, entity_vector=v1)
kb.add_entity(entity="Q42", prob=0.8, entity_vector=v2)
kb.add_alias(alias="Douglas", entities=["Q1004791", "Q42"], probabilities=[0.6, 0.1])

# 使用实体链接
text = "Douglas Adams made up the stories as he wrote."
doc = nlp(text)
for ent in doc.ents:
    print(ent.text, ent.label_, ent.kb_id_)
```FINISHED