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"无关
预期输出
最终需要得到三组结果:
- 准确的全名列表:
fullnames = ["John Doe", "Johnson", "Murray Gell-Mann", "Mann", "M"]
- 带唯一ID的全名元组:
fulltuples = [(0, "John Doe"), (1, "Johnson"), (2, "Murray Gell-Mann"), (3, "Mann"), (4,"M")]
- 剩余名称与对应全名ID的共指元组:
residualtuples = [(0,"John"),(2,"Murray")]
其中元组的第一个元素是fulltuples中的ID,代表该短名称对应全名的共指关系。
内容的提问来源于stack exchange,提问作者Robert Alexander
相关产品推荐
相关产品推荐

