You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python人名共指消解:区分全名、部分名与非子串关联

人名共指消解问题

问题背景

我从新闻文章中提取了一组人名字符串,示例如下:

persons = [
    "John Doe",
    "John",
    "Johnson",
    "Murray Gell-Mann",
    "Mann",
    "Murray",
    "M",
]


def is_not_substring(sub, strings):
    for s in strings:
        if sub != s and sub in s:
            return False
    return True


fullnames = [
    s for s in persons if is_not_substring(s, persons)
]  # 初始全名列表
residuals = [s for s in persons if s not in fullnames]  # 剩余名称

运行这段代码后,fullnames会生成初步的全名列表,但residuals中的内容存在歧义:既可能是某个人名的组成部分(名/姓),也可能是独立人物的姓名,现有逻辑无法准确区分:

  • "John"实际指代"John Doe",而非"Johnson",不能直接用普通子串in判断
  • "Mann"是独立人物Thomas Mann的姓,不属于"Murray Gell-Mann"
  • "Murray"指代"Murray Gell-Mann"
  • "M"是虚构角色詹姆斯·邦德中的M,和"Murray Gell-Mann"无关

预期输出

最终需要得到三组结果:

  1. 准确的全名列表:
fullnames = ["John Doe", "Johnson", "Murray Gell-Mann", "Mann", "M"]
  1. 带唯一ID的全名元组:
fulltuples = [(0, "John Doe"), (1, "Johnson"), (2, "Murray Gell-Mann"), (3, "Mann"), (4,"M")]
  1. 剩余名称与对应全名ID的共指元组:
residualtuples = [(0,"John"),(2,"Murray")]

其中元组的第一个元素是fulltuples中的ID,代表该短名称对应全名的共指关系。


内容的提问来源于stack exchange,提问作者Robert Alexander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:17:12