Токенизируйте в Spacy с аннотациями, исключая специальные символы - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь получить простоту для токенизации своего текста, который включает в себя некоторые аннотации, которые я хочу сохранить в целости и обрабатывать их как токены, однако после добавления регулярного выражения, соответствующего токенам такого типа, полученные токены включают специальные символы, такие как ?

Как я могу избавиться от этих специальных символов в токене, сохраняя нужный мне токенизацию?

например, фраза Can I have a {@pet}? получает токенизацию как

can = can - (VERB) i = i - (PRON) have = have) a = a - (DET) {@pet}? (NOUN)

Обратите внимание, что мой токен остался нетронутым, но знак вопроса остался, даже если он не соответствует моему регулярному выражению.

Вот как я это делаю

def custom_tokenizer(nlp):
    annotations = r"(\{\@[a-z]+\})"
    annotation_pattern = re.compile(annotations)
    all_prefixes_re = spacy.util.compile_prefix_regex(nlp.Defaults.prefixes)
    infix_re = spacy.util.compile_infix_regex(nlp.Defaults.infixes)
    suffix_re = spacy.util.compile_suffix_regex(nlp.Defaults.suffixes)
    return Tokenizer(nlp.vocab, nlp.Defaults.tokenizer_exceptions,
                     prefix_search=all_prefixes_re.search,
                     infix_finditer=infix_re.finditer, suffix_search=suffix_re.search,
                     token_match=annotation_pattern.match)

и запуск моего токенизатора, например

nlp = spacy.load('en_core_web_lg', disable=['ner'])
nlp.tokenizer = custom_tokenizer(nlp)

Я использую суффикс по умолчанию re, так как символ ? обычно токенизируется очень хорошо

...