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