Skip to content

实体消歧、关系抽取与出处 ​

“苹果投资了某公司”中的苹果可能是企业,也可能只是错误解析。图节点不是一个名字字符串,而是有类型、稳定ID和别名的实体;边不是一个动词,而是带方向、时间、来源和置信信息的断言。

python
entities = {'org:apple': {'type':'organization', 'aliases':{'Apple','苹果公司'}},
            'fruit:apple': {'type':'food', 'aliases':{'苹果'}}}
def resolve(name, kind):
    return [key for key,value in entities.items() if value['type']==kind and name in value['aliases']]
assert resolve('苹果','organization') == []
assert resolve('苹果公司','organization') == ['org:apple']
claims = [{'subject':'org:apple', 'relation':'supplies', 'object':'org:buyer',
           'source':'doc7:line12', 'valid_from':'2025-01-01'}]
assert all(c.get('source') for c in claims)
print(resolve('苹果公司','organization'))

没有匹配时不应随便取相近名字合并,否则两家公司会共享关系。先用类型、上下文、唯一标识缩小候选,再用人工或模型判断;不确定的实体保留未决状态。别名映射需要版本,错误合并后的拆分必须追踪受影响边。

抽取步骤是句子→候选实体→类型归一→关系候选→模式校验→来源绑定。Schema规定允许的关系及端点类型,例如“任职于”通常从人到组织。方向倒置会使查询语义反转。否定句“甲没有收购乙”、计划句“拟收购”和已发生事件不能都变成同一个已完成边。

多个来源支持同一关系时保留多个证据;同一来源重复抽取不该提高置信。冲突不必强行覆盖:关系可有有效时间与观测时间,查询“当时”与“现在”不同。把模型置信分数当概率需要校准,未经校准只可作为排序信号。

属性图允许节点边携带属性,RDF以三元组表达并结合词汇与查询规则;两者的数据建模与查询能力不同。先明确需要何种身份、约束和来源查询,再选存储,不能认为图数据库自动保证语义正确。

练习 ​

为同名组织新增稳定ID,设计一个无法唯一消歧的输入,要求返回两个候选而不是自动合并。

完成后查看本章答案。

下一章:带权限和时间的多跳检索。

用心记录每一步成长