SpaCy использует обычную библиотеку re
. Ваш текст токенизируется таким образом, что /
разделяется на другой токен, 24.51c/kWh
разбивается на 24.51c
, /
и kWh
.
Чтобы правильно сопоставить строку, которую вы при необходимости вы можете использовать
pattern = [{"TEXT": {"REGEX": "(?i)[0-9]+(?:[,.][0-9]+)?[ckwh]+"}},
{'ORTH': '/'}, {"LOWER": {"REGEX": "(?i)^[ckwh]+$"}}]
matcher.add("Usage", None, pattern)
Полный фрагмент:
import spacy
from spacy.matcher import Matcher
nlp = spacy.load("en_core_web_sm")
matcher = Matcher(nlp.vocab)
pattern = [{"TEXT": {"REGEX": "(?i)[0-9]+(?:[,.][0-9]+)?[ckwh]+"}},
{'ORTH': '/'}, {"LOWER": {"REGEX": "(?i)^[ckwh]+$"}}]
matcher.add("Usage", None, pattern)
doc = nlp("Peak Usage 409 24.51c/kWh $100.25")
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)
Вывод:
17478281289916104085 Usage 3 6 24.51c/kWh
Итак, (?i)[0-9]+(?:[,.][0-9]+)?[ckwh]+
соответствует 1+ цифрам, затем необязательная последовательность точки или запятой, а затем 1+ цифр, а затем 1+ c
, k
, w
или h
букв без учета регистра. Затем должен следовать токен /
. Затем токен, который равен c
, k
, w
или h
(без учета регистра).