Как процитировать некоторые специальные слова (регистрационные номера), чтобы их нельзя было использовать в Spacy? - PullRequest
2 голосов
/ 27 марта 2019

У меня есть несколько цифр внутри текста, которые я хотел бы оставить одним предложением.Некоторые из них:

7-2017-19121-B
7-2016-26132
wd/2012/0616
JLG486-01
H14-0890-12

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

То, что я уже сделал, - это использование этих «защитников дефисов».Для 7-2014-1721-Y я получил токены [7,-,2014,-,1721-Y], поэтому последняя фраза не разделена, а предыдущая.Как я уже сказал, код сложен и хотел бы добавить то же самое, чтобы включить такое действие для сущности номер-номер.

Это функция:

def custom_tokenizer(nlp):
    prefix_re = compile_prefix_regex(nlp.Defaults.prefixes)
    suffix_re = compile_suffix_regex(nlp.Defaults.suffixes)
    # changing default infixed
    def_infx = nlp.Defaults.infixes    
    cur_infx = (d.replace('-|–|—|', '') for d in def_infx)
    infix_re = compile_infix_regex(cur_infx)

    return Tokenizer(nlp.vocab, prefix_search=prefix_re.search, suffix_search=suffix_re.search,
                                infix_finditer=infix_re.finditer, token_match=None)

Может быть, есть и более простой способ, кроме модификации?Я пытался процитировать эти "таблички" с помощью некоторых escape-символов, таких как {7-2017-19121-B}, но это не работает.

Кстати, есть регулярное выражение, которое соответствует этим специальным "числам".Возможно, для меня обходным путем будет просто удалить их из текста (что я попробую позже), но теперь я спрашиваю, есть ли у меня здесь какие-либо шансы.

["(?=[^\d\s]*\d)(?:[a-zA-Z\d]+(?:/[a-zA-Z\d]+)+)", "(?:[[A-Z\d]+(?:[-][A-Z\d]+)+)"]

Подсказка.Я обнаружил, что переход с 7-2017-19121-B на 7/2017/19121/B работает по мере необходимости.Вопрос (для меня, чтобы проверить), как я могу приспособить это к моему текущему коду и остаться с производительностью, которую я имею сейчас.

1 Ответ

1 голос
/ 27 марта 2019

Вы можете добавить их как «особые случаи» :

nlp.tokenizer.add_special_case("7-2017-19121-B", [{ORTH: "7-2017-19121-B"}])
...
nlp.tokenizer.add_special_case("H14-0890-12", [{ORTH: "H14-0890-12"}])

Тест:

print([w.text for w in nlp("Got JLG486-01 and 7-2017-19121-B codes.")]) 
# => ['Got', 'JLG486-01', 'and', '7-2017-19121-B', 'codes', '.']
...