Флаг spaCy 'IS_SPACE' не работает

Пытался сопоставить что-то вроде «125,00 долларов США за акцию» на spaCy, используя сопоставление на основе правил, как упомянуто здесь https://github.com/explosion/spaCy/issues/882. Однако при испытании

nlp = en_core_web_sm.load()
matcher = Matcher(nlp.vocab)

doc = nlp(u'$125.00/share, $ 125 / share, $ 125.00 / share, $ 125 . 00 / share')

token_pattern = [{'NORM': '$'}, {'IS_DIGIT': True}, {'ORTH': '.', 'OP': '?'}, 
             {'IS_DIGIT': True, 'OP': '?'}, {'ORTH': '/'}, {'LOWER': 'share'}]

def matched_pattern (matcher, doc, i, matches):
    match_id, start, end = matches[i]
    span = doc[start: end]
    print ('matched!', span)

matcher.add('SharePrice', matched_pattern, token_pattern)

matches = matcher(doc)

Я вернусь,

(«совпадает!», 125 долл. / акция)
(«совпадает!», 125,00 долл. / акция)

Вместо этого я хочу сопоставить такие шаблоны, как «125,00 долларов за акцию», без пробелов между ними. Пытаясь,

 token_pattern = [{'NORM': '$'}, {'IS_SPACE': False}, {'IS_DIGIT': True}, {'IS_SPACE': False},{'ORTH': '.', 'OP': '?'}, {'IS_SPACE': False}, 
             {'IS_DIGIT': True, 'OP': '?'}, {'IS_SPACE': False}, {'ORTH': '/'}, {'IS_SPACE': False}, {'LOWER': 'share'}]

Мое выражение лица не соответствует ни одному образцу. Пожалуйста помоги!


person hkr    schedule 20.11.2017    source источник


Ответы (1)


Проблема здесь в том, что каждый словарь в шаблоне соответствия описывает фактический существующий токен, поэтому {'IS_SPACE': False} будет соответствовать любому токену, который не является пробельным символом (например, токен с текстом "собака" или «123» или что-то в этом роде). Средство сопоставления не может сопоставить отсутствие токена.

Я только что попробовал ваш пример, и по умолчанию токенизатор spaCy разделяет «125,00 долларов на акцию» всего на два токена: ['$', '125.00/share']. По мере того, как сопоставитель перебирает токены, он не будет соответствовать, так как он ищет символ валюты + непробельный символ + цифру + кучу других токенов.

Таким образом, чтобы соответствовать более конкретным частям токена «125.00 / доля», таким как число, косая черта и «доля», вы должны убедиться, что spaCy разделяет их на отдельные токены. Вы можете сделать это, настроив правила токенизации и добавив новое инфиксное правило, которое разбивает токены на / символа. В результате получится "125,00 долл. США на акцию" ['$', '125.00', '/', 'share'], что будет соответствовать вашему шаблону.

Кстати, некоторые сведения о пробельных символах: во время токенизации spaCy разбивает токены на отдельные пробельные символы. Эти символы не будут доступны как отдельные токены (но чтобы убедиться, что никакая информация не потеряна, к ним можно получить доступ через атрибут .text_with_ws_). Однако, если присутствует более одного символа пробела, spaCy сохранит их как токены, которые вернут True для IS_SPACE. Все остальные токены вернут False за IS_SPACE.

person Ines Montani    schedule 20.11.2017