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č
相关产品推荐
相关产品推荐

