如何在Spacy中实现Token与句子关联及构建可溯源的关键词列表
如何在spaCy中关联Token与原句子并实现关键词反向查询?
嘿,我来帮你搞定这个问题!在spaCy里关联Token和句子其实挺直观的,而且实现关键词反向查询也不难,咱们一步步来拆解:
一、让Token和对应的句子建立关联
spaCy处理文本后生成的Doc对象里,每个Token都自带一个sent属性——直接调用这个属性就能拿到它所属的句子(类型是Span对象)。而Doc的sents属性可以遍历所有被拆分好的句子,每个句子本身也是由一串Token组成的。
给你个实操的代码例子:
import spacy # 加载预训练模型(英文用en_core_web_sm,中文换成zh_core_web_sm即可) nlp = spacy.load("en_core_web_sm") # 待处理文本 text = "SpaCy is a powerful NLP library. It makes tokenization and sentence segmentation easy. You can build keyword lists with it." doc = nlp(text) # 遍历Token,输出Token和它所属的句子 for token in doc: # 跳过停用词和标点,只看有效实词 if not token.is_stop and not token.is_punct: print(f"Token: {token.text} | 所属句子: {token.sent.text}")
运行这段代码,你就能看到每个有效Token对应的完整句子了。token.sent返回的是Span对象,用.text就能提取出句子的文本内容。
二、构建关键词列表并反向查询所属句子
要实现这个需求,咱们可以分两步走:先筛选出符合要求的关键词,再建立关键词到句子的映射字典。之后查询时,直接查字典就能快速拿到关键词对应的所有原句子。
具体实现步骤:
- 定义关键词筛选规则:比如选名词、专有名词这类实词,或者去掉停用词/标点的内容;
- 遍历每个句子,把符合规则的Token(或短语)作为关键词,将句子文本关联到关键词上;
- 用字典存储映射关系,方便后续反向查询。
看这个示例代码:
# 基于上面生成的doc对象,构建关键词-句子映射字典 keyword_sent_map = {} # 筛选规则:选取名词(NOUN)和专有名词(PROPN),排除停用词和标点 for sent in doc.sents: sent_text = sent.text for token in sent: if token.pos_ in ["NOUN", "PROPN"] and not token.is_stop and not token.is_punct: # 统一转小写,避免大小写导致的重复关键词 keyword = token.text.lower() # 初始化关键词对应的句子列表 if keyword not in keyword_sent_map: keyword_sent_map[keyword] = [] # 避免同一个句子重复添加 if sent_text not in keyword_sent_map[keyword]: keyword_sent_map[keyword].append(sent_text) # 反向查询示例 query_keyword = "library" if query_keyword in keyword_sent_map: print(f"关键词 '{query_keyword}' 所属的句子:") for idx, sent in enumerate(keyword_sent_map[query_keyword], 1): print(f"{idx}. {sent}") else: print(f"未找到包含关键词 '{query_keyword}' 的句子")
进阶优化建议:
- 如果想提取多词关键词(比如“NLP library”这类短语),可以用spaCy的
Matcher或PhraseMatcher来匹配短语,再将短语作为关键词关联句子,原理和上面一致; - 用
token.lemma_(词形还原)代替token.text,可以把“makes”和“make”这类变形词归为同一个关键词,让查询更精准——只需要把keyword = token.text.lower()改成keyword = token.lemma_.lower()就行。
内容的提问来源于stack exchange,提问作者Ravi Variar
相关产品推荐
相关产品推荐

