Здесь есть документация по атрибутам расширения: https://spacy.io/usage/processing-pipelines#custom-components-attributes
По сути, вам нужно определить эту переменную country
как атрибут расширения, что-то вроде этого:
Token.set_extension("country", default="")
Однако в приведенном вами коде вы фактически никогда не устанавливаете атрибут _.country
для какого-либо токена (или диапазона), поэтому все они по-прежнему имеют значение по умолчанию, и сопоставитель никогда не сможет найти совпадение с ними.Приведенная вами строка:
pattern = [{"_": {"country": {"REGEX": "^[Uu](\.?|nited) ?[Ss](\.?|tates)$"}}}]
Пытается сопоставить регулярное выражение США для значений пользовательских атрибутов вместо текста документа, как вы ожидаете (я думаю).
Одно из решений - просто запустить reg-exps для текстов напрямую:
nlp = spacy.load("en_core_web_lg")
matcher = Matcher(nlp.vocab)
pattern = [{"TEXT": {"REGEX": "^[Uu](\.?|nited)$"}},
{"TEXT": {"REGEX": "^[Ss](\.?|tates)$"}}]
matcher.add("US", None, pattern)
doc = nlp(u"I'm from the United States.")
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)
Какие выходные данные
15397641858402276818 US 4 6 Соединенные Штаты
Затем вы можете использовать эти совпадения, например, для установки пользовательского атрибута на Span или Token (в данном случае на Span, потому что ваше совпадение потенциально включает несколько токенов)