Совпадение на основе просторных правил не соответствует ожидаемому - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь выполнить сопоставление строки даты в пространстве, и две части совпадают по отдельности, но объединенный результат не возвращает совпадение.

rule_patterns = [

    {
        "label": "DATE_COMBINED",
        "pattern": [
            {'TEXT': {"REGEX": "^[0-9](st|nd|rd|th)", 'LENGTH': 3}},
            {'POS': 'PROPN'},
            {'IS_PUNCT': True, 'OP': '?'},
            {'IS_DIGIT': True}
        ]
    },
    {
        "label": "DATE_TEXT",
        "pattern": [
            {'POS': 'PROPN'},
            {'IS_PUNCT': True, 'OP': '?'},
            {'IS_DIGIT': True}
        ]
    },

    {
        "label": "DATE_NUM",
        "pattern": [
            {'TEXT': {"REGEX": "^[0-9](st|nd|rd|th)", 'LENGTH': 3}}
            ]
    },


]

nlp = spacy.load("en_core_web_sm", disable=["ner"]) 
ruler = EntityRuler(nlp)
matcher = Matcher(nlp.vocab)
ruler.add_patterns(rule_patterns)
nlp.add_pipe(ruler)

doc = nlp(text) 
for ent in doc.ents:
  print(ent.text, ent.label_)

Строка для сопоставления равна

4 января 2013 г.

Результат выполнения:

4th DATE_NUM
January, 2013 DATE_TEXT

Я не могу получить совпадение на DATE_COMBINED, что я делаю неправильно

ОБНОВЛЕНИЕ Я замечаю, когда я печатаю все токены, пространство между 4-м и январем также считается токеном.

[
            {'TEXT': {"REGEX": "^[0-9]{1,2}(st|nd|rd|th)$", 'LENGTH': 3}},
            {"IS_SPACE": True},
            {'POS': 'PROPN'},
            {'IS_PUNCT': True, 'OP': '?'},
            {'IS_DIGIT': True}
        ]

Это работает

1 Ответ

0 голосов
/ 08 ноября 2019

Пробел между 4th и January является неразрывным пробелом, \x0A.

Самое простое решение - нормализовать эти пробелы в обычном пространстве:

text = text.replace("\xA0", " ")

Иначе, вы можете добавить {'IS_SPACE': True, 'OP': '?'} к правилам шаблона, чтобы соответствовать необязательный пробел без сегментации:

"label": "DATE_COMBINED",
"pattern": [
     {'TEXT': {"REGEX": "^[0-9]+(?:st|[nr]d|th)$", 'LENGTH': 3}},
     {'IS_SPACE': True, 'OP': '?'},
     {'POS': 'PROPN'},
     {'IS_PUNCT': True, 'OP': '?'},
     {'IS_DIGIT': True}
]

Обратите внимание, что первый шаблон ^[0-9]+(?:st|[nr]d|th)$ теперь содержит $в конце, чтобы сопоставить токен как полную строку ($ соответствует концу строки) и означает:

  • ^ - начало токена
  • [0-9]+ - 1 или более цифр
  • (?:st|[nr]d|th) - st, n или r, за которыми следуют d или th подстроки
  • $ - конецстрока.
...