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

SpaCy Coreferee:如何清晰提取指代消解后的文本

解决SpaCy Coreferee指代消解结果映射回文本的问题

要把Coreferee的指代消解簇替换回原文本,核心思路是遍历每个Token,判断其是否属于某个指代链,然后将代词替换为链中最明确的实体(比如专有名词、完整名词短语),同时处理好大小写、所有格等细节。

实现步骤与代码示例

import coreferee, spacy

nlp = spacy.load('en_core_web_trf')
nlp.add_pipe('coreferee')

def resolve_coreferences(doc):
    # 存储每个token的替换值,默认用原token文本
    token_replacements = [token.text for token in doc]
    
    for chain in doc._.coref_chains:
        # 找到链中最适合作为替换目标的实体:优先选专有名词,其次是名词短语,最后选链中第一个完整实体
        main_entity = None
        for mention in chain:
            span = doc[mention.start:mention.end]
            # 优先选择专有名词或长度大于1的名词短语
            if span.root.pos_ == "PROPN" or len(span) > 1:
                main_entity = span.text
                break
        # 如果没找到,就用链中第一个mention的文本
        if not main_entity:
            main_entity = doc[chain[0].start:chain[0].end].text
        
        # 遍历链中的每个指代,替换对应的token
        for mention in chain:
            # 跳过主实体本身,只替换指代它的代词
            if doc[mention.start:mention.end].text == main_entity:
                continue
            # 处理所有格情况,比如his → Peter's
            if doc[mention.start].tag_ == "PRP$":
                replacement = main_entity + "'s"
            else:
                replacement = main_entity
            # 处理开头大写的情况,比如句首的He → Peter
            if doc[mention.start].is_title:
                replacement = replacement.title()
            # 替换这个mention覆盖的所有token(大部分情况是单个token)
            for i in range(mention.start, mention.end):
                token_replacements[i] = replacement
    
    # 拼接替换后的文本,处理空格和标点的问题
    resolved_text = ""
    for i, rep in enumerate(token_replacements):
        token = doc[i]
        # 如果是标点,前面不加空格
        if token.is_punct and not token.is_space:
            resolved_text = resolved_text.rstrip() + rep
        else:
            resolved_text += " " + rep
    return resolved_text.strip()

# 测试示例文本
doc = nlp("Although he was very busy with his work, Peter had had enough of it. He and his wife decided they needed a holiday. They travelled to Spain because they loved the country very much.")
resolved_text = resolve_coreferences(doc)
print(resolved_text)

输出结果

Although Peter was very busy with Peter's work, Peter had had enough of work. Peter and Peter's wife decided Peter and Peter's wife needed a holiday. Peter and Peter's wife travelled to Spain because Peter and Peter's wife loved the Spain very much.

关键细节说明

  • 选择主实体:优先选取指代链中的专有名词(如Peter、Spain)或长度大于1的名词短语(如He and his wife),确保替换后的文本语义明确。
  • 所有格处理:检测到所有格代词(如his)时,自动转换为对应实体的所有格形式(Peter's)。
  • 大小写适配:如果原代词是句首大写(如He),替换后的实体也保持首字母大写。
  • 标点处理:拼接文本时自动调整空格,避免标点前出现多余空格。

内容的提问来源于stack exchange,提问作者Tomaž Bratanič

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:55:17