如何使用Spacy Matcher匹配含双连字符的复合词?
解决Spacy Matcher匹配双连字符词汇的问题
问题出在Spacy的分词逻辑上:当处理nice-word-also这类双连字符词汇时,它会被拆成5个独立token:nice、-、word、-、also。你之前的匹配pattern只加了一个{"IS_PUNCT": True},漏掉了第二个连字符的匹配项,所以无法成功匹配。
修正后的代码
只需在pattern里补充第二个标点匹配项即可:
import spacy from spacy.matcher import Matcher nlp = spacy.load("en_core_web_sm") matcher = Matcher(nlp.vocab) # 补充第二个{"IS_PUNCT": True}匹配第二个连字符 pattern = [{"LOWER": "nice"}, {"IS_PUNCT": True}, {"LOWER": "word"}, {"IS_PUNCT": True}, {"LOWER": "also"}] matcher.add("nice-word-also", [pattern]) doc = nlp("This is a nice-word-also? Why is this a nice word") matches = matcher(doc) for match_id, start, end in matches: string_id = nlp.vocab.strings[match_id] span = doc[start:end] print(match_id, string_id, start, end, span.text)
输出结果
3367763786334420497 nice-word-also 3 8 nice-word-also
通用技巧(可选)
如果需要匹配任意数量连字符连接的同类词汇,可以用Spacy Matcher的量词语法。比如要匹配nice-xxx-xxx这类结构,可写成:
pattern = [ {"LOWER": "nice"}, {"IS_PUNCT": True, "OP": "+"}, # 匹配至少一个连字符 {"LOWER": {"IN": ["word", "also", "test"]}, "OP": "+"} # 匹配至少一个指定词汇 ]
不过这种方式会匹配更宽泛的内容,根据你的实际需求调整即可。
内容的提问来源于stack exchange,提问作者Quinten
相关产品推荐
相关产品推荐

