Регулярное выражение SpaCy Matcher не соответствует строке - PullRequest
2 голосов
/ 18 июня 2020

В моем шаблоне указан следующий код и регулярное выражение. Я пытаюсь заставить SpaCy соответствовать 24,51c / кВтч Однако возвращаемый совпадающий текст: 24,51 c

import spacy
from spacy.matcher import Matcher

nlp = spacy.load("en_core_web_sm")

matcher = Matcher(nlp.vocab)
pattern = [{"TEXT": {"REGEX": "[0-9]+[,.]?[0-9]+[Cc/KWHkwh]+"}}]
matcher.add("Usage", None, pattern)
doc = nlp(u"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)

enter image description here

Использование этого регулярного выражения работает и в других редакторах

enter image description here

Я не могу найти в Интернете какой-либо специальный тестер SpaCy c для обычных выражения. Что-то мне не хватает? Любая помощь приветствуется.

Спасибо

1 Ответ

3 голосов
/ 18 июня 2020

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 (без учета регистра).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...