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

使用Spacy实现代词-先行词关联时结果异常,寻求技术排查帮助

代词指代关联问题的修正方案

你的代码出现错误输出的核心原因:

  • 遍历token时,同一个代词token会同时触发先行词赋值和指代输出逻辑,比如He既是主语(nsubj)又是代词(PRON),导致先行词被错误设置为代词本身。
  • 先行词的提取逻辑完全错误,没有从上下文的前置名词中获取,反而在处理当前token时错误赋值。

方案1:基于实体识别的手动匹配

适合简单场景,先提取文本中的人名实体,再根据代词的性别/语境匹配先行词:

import spacy

nlp = spacy.load("en_core_web_md")
text = "John and Maggie walk along the street. He told her he is leaving for Paris. She was surprised"
doc = nlp(text)

# 提取所有候选人名先行词
person_candidates = []
for ent in doc.ents:
    if ent.label_ == "PERSON":
        # 拆分并列的人名(比如John and Maggie)
        person_candidates.extend([token.text for token in ent if token.pos_ == "PROPN"])

# 构建代词-先行词映射(基于常见性别指代)
pronoun_to_antecedent = {
    "He": person_candidates[0],
    "he": person_candidates[0],
    "She": person_candidates[1],
    "she": person_candidates[1],
    "her": person_candidates[1]
}

# 输出指代关系
for token in doc:
    if token.pos_ == "PRON" and token.text in pronoun_to_antecedent:
        print(f"{token.text} refers to {pronoun_to_antecedent[token.text]}")

方案2:使用Spacy官方指代消解模型

适合复杂场景,自动处理指代簇,无需手动维护映射:

  1. 先安装依赖和模型:
pip install spacy-transformers
python -m spacy download en_coreference_web_trf
  1. 代码实现:
import spacy

nlp = spacy.load("en_coreference_web_trf")
text = "John and Maggie walk along the street. He told her he is leaving for Paris. She was surprised"
doc = nlp(text)

# 遍历每个指代簇,第一个元素是先行词,后续是指代它的代词
for cluster in doc.spans["coref"]:
    antecedent = cluster[0].text
    for pronoun in cluster[1:]:
        print(f"{pronoun.text} refers to {antecedent}")

运行方案2会输出:

He refers to John
her refers to Maggie
he refers to John
She refers to Maggie

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:56:24