Я пытаюсь получить простоту для токенизации своего текста, который включает в себя некоторые аннотации, которые я хочу сохранить в целости и обрабатывать их как токены, однако после добавления регулярного выражения, соответствующего токенам такого типа, полученные токены включают специальные символы, такие как ?
Как я могу избавиться от этих специальных символов в токене, сохраняя нужный мне токенизацию?
например, фраза 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, так как символ ?
обычно токенизируется очень хорошо