如何在Spacy中标记特定符号'/'之后的全部文本?
解决Spacy中标记包含'/'的目标文本问题
你之前的规则仅针对单个token的lower属性匹配,没法覆盖跨多个token的目标文本,得调整为匹配多token序列的规则,同时覆盖两种分词场景:
方案1:使用Spacy Matcher实现
定义匹配两种常见场景的pattern:
- 场景1:token本身包含
/(比如word/),后面跟任意数量的文本token - 场景2:独立的字母token + 独立的
/token + 任意数量的文本token
代码示例:
import spacy from spacy.matcher import Matcher nlp = spacy.load("en_core_web_sm") matcher = Matcher(nlp.vocab) # 定义匹配模式 patterns = [ # 匹配带/的单个token + 后续所有文本token [{"TEXT": {"REGEX": r".*/.*"}}, {"IS_ALPHA": True, "OP": "*"}], # 匹配字母token + / token + 后续所有文本token [{"IS_ALPHA": True}, {"TEXT": "/"}, {"IS_ALPHA": True, "OP": "*"}] ] matcher.add("TARGET_PATTERN", patterns) # 测试示例1 doc1 = nlp("This is word/ year") matches = matcher(doc1) for match_id, start, end in matches: span = doc1[start:end] print(f"标记结果:{span.text}") # 输出:word/ year # 测试示例2 doc2 = nlp("This is subword / year") matches = matcher(doc2) for match_id, start, end in matches: span = doc2[start:end] print(f"标记结果:{span.text}") # 输出:subword / year
方案2:使用EntityRuler直接标记为实体
如果需要将目标文本直接标记为自定义实体,用EntityRuler更方便:
import spacy from spacy.pipeline import EntityRuler nlp = spacy.load("en_core_web_sm") ruler = EntityRuler(nlp, overwrite_ents=True) patterns = [ { "label": "TARGET_CONTENT", "pattern": [ {"IS_ALPHA": True}, {"TEXT": "/"}, {"IS_ALPHA": True, "OP": "*"} ] }, { "label": "TARGET_CONTENT", "pattern": [ {"TEXT": {"REGEX": r".*/.*"}}, {"IS_ALPHA": True, "OP": "*"} ] } ] ruler.add_patterns(patterns) nlp.add_pipe(ruler) # 测试 doc = nlp("This is subword / year") for ent in doc.ents: print(f"实体:{ent.text},标签:{ent.label_}") # 输出:subword / year,TARGET_CONTENT
关键说明
- 之前的规则仅针对单个token,而你需要匹配跨token的文本段,所以必须用多token序列的匹配模式
OP: "*"表示该位置的token可以出现0次或多次,确保能匹配/之后的所有文本- 正则
.*\/.*用于匹配本身包含/的单个token,覆盖类似word/这种分词结果
内容的提问来源于stack exchange,提问作者Barbara
相关产品推荐
相关产品推荐

