空间匹配条件或/和Python



我想对以下关键字进行分类:

import spacy
from spacy.matcher import PhraseMatcher
nlp = spacy.load("en_core_web_sm")
phrase_matcher = PhraseMatcher(nlp.vocab)
cat_patterns = [nlp(text) for text in ('cat', 'cute', 'fat')]
dog_patterns = [nlp(text) for text in ('dog', 'fat')]
matcher = PhraseMatcher(nlp.vocab)
matcher.add('Category1', None, *cat_patterns)
matcher.add('Category2', None, *dog_patterns)
doc = nlp("I have a white cat. It is cute and fat; I have a black dog. It is fat,too")
matches = matcher(doc)
for match_id, start, end in matches:
rule_id = nlp.vocab.strings[match_id]  # get the unicode ID, i.e. 'CategoryID'
span = doc[start : end]  # get the matched slice of the doc
print(rule_id, span.text)
#Output
#Category1 cat
#Category1 cute
#Category1 fat
#Category2 fat
#Category2 dog
#Category1 fat
#Category2 fat

然而,我期望的输出是,如果文本包含cat和cute或cat和fat在一起,它将属于第一类;如果文本同时包含dog和fat,那么它将属于第二类。

#Category1 cat cute
#Category1 cat fat
#Category2 dog fat

是否有可能使用类似的算法?谢谢你

从匹配器(https://spacy.io/usage/rule-based-matching)上的spaCy文档中,没有办法检测由任意数量的令牌分隔的两个不同的令牌。如果你知道在"猫"one_answers"猫"之间有多少代币还有"fat",例如,那么您可以使用通配符模式(https://spacy.io/usage/rule-based-matching#adding-patterns-wildcard),但从您的示例中看起来,标记之间的距离可以变化。

我认为有两种方法可以解决你的问题:

  1. 使用某种数据结构跟踪for循环中的匹配。如果您正在寻找的所有令牌最终都被找到,那么将该匹配添加到最终结果中。
  2. 使用正则表达式来检测您正在查找的内容。space确实有很棒的基于规则的匹配工具,但是看起来您没有使用正在搜索的单词的任何语言方面。像/cat.*?fat/这样的简单正则表达式将找到您正在寻找的匹配。

最新更新