如何使用SpaCy为SpeechRecognition识别的字符串构建匹配模式提取信息
解决方案
核心思路
你当前遇到的多词提取失败问题,根源是DependencyMatcher默认基于单个token匹配,没有把你预置的固定多词短语(比如right arm、large penetration)识别为独立匹配单元。调整方案用PhraseMatcher + DependencyMatcher组合实现:PhraseMatcher专门匹配你有完整词表的多词字段(攻击类型、击中部位),DependencyMatcher负责匹配句子主干的结构类字段(敌人标识、vulnerability数值、伤害数值),适配你固定句式的输入场景。
具体实现步骤
第一步:预处理多词短语匹配
先把你预置的身体部位、攻击类型词表喂给PhraseMatcher,匹配到的多词组合会被标记为自定义实体,避免被拆分为单个token:
from spacy.matcher import PhraseMatcher # 初始化PhraseMatcher phrase_matcher = PhraseMatcher(nlp.vocab, attr="LOWER") # 把词表转成doc格式喂给匹配器 body_patterns = [nlp.make_doc(text) for text in body_list_words] attack_patterns = [nlp.make_doc(text) for text in attack_type_words] phrase_matcher.add("BODY_PART", body_patterns) phrase_matcher.add("ATTACK_TYPE", attack_patterns) # 匹配多词短语并添加为doc的实体 matches = phrase_matcher(doc) spans = [] for match_id, start, end in matches: span = doc[start:end] span.label_ = nlp.vocab.strings[match_id] spans.append(span) # 去重重叠匹配 doc.set_ents(spans, default="unmodified")
第二步:调整DependencyMatcher匹配规则
原来的位置、攻击类型匹配规则,改为直接匹配你刚打好的实体标签,就能直接拿到完整多词短语:
# 击中部位匹配规则改为抓实体标签 {"LEFT_ID": "anchor_verbo", "REL_OP": ">>", "RIGHT_ID": "location", "RIGHT_ATTRS": {"ENT_TYPE": "BODY_PART"}}, # 攻击类型匹配规则改为抓实体标签 {"LEFT_ID": "attack", "REL_OP": ">>", "RIGHT_ID": "type_attack", "RIGHT_ATTRS": {"ENT_TYPE": "ATTACK_TYPE"}},
第三步:处理敌人标识的多词匹配
敌人标识(如zombie one)没有固定词表,你可以在抓到type_enemy的token后,直接提取该token及其右侧相邻的序号token拼接:
# 拿到type_enemy的token位置后 enemy_token = doc[token_ids[2]] # 拼接后面的数字/序号词 enemy_name = enemy_token.text if enemy_token.i + 1 < len(doc) and doc[enemy_token.i + 1].like_num: enemy_name += " " + doc[enemy_token.i + 1].text # 转成zombie_1格式 enemy_id = enemy_name.lower().replace(" ", "_")
适配意大利语的注意点
- 加载意大利语模型
it_core_news_sm替换英语模型 - PhraseMatcher的
attr可以根据需求调整为LEMMA适配意大利语的词形变化 - 依赖关系标签和意大利语模型保持一致即可
内容的提问来源于stack exchange,提问作者Simone De Bellis
相关产品推荐
相关产品推荐

