Я пытаюсь правильно разделить слова, чтобы соответствовать моему корпусу. Для этого я уже нашел следующее:
Специальный пользовательский токенайзер, включающий в качестве токенов только дефисные слова с использованием Infix regex
Что фиксирует дефисные слова, но я не могу понять, как сохранить слова с апострофами для сокращений вроде: не могу, не буду, нет, он и т. Д.
вместе как один знак в просторе. Более конкретно, я ищу, как это сделать для голландских слов: zo'n, auto's, massa и т. Д., Но эта проблема должна быть независимой от языка.
У меня есть следующий токенизатор:
def custom_tokenizer(nlp):
prefix_re = compile_prefix_regex(nlp.Defaults.prefixes)
suffix_re = compile_suffix_regex(nlp.Defaults.suffixes)
infix_re = re.compile(r'''[.\,\?\:\;\...\‘\’\'\`\“\”\"\'~]''')
return Tokenizer(nlp.vocab, prefix_search=prefix_re.search,
suffix_search=suffix_re.search,
infix_finditer=infix_re.finditer,
token_match=None)
nlp = spacy.load('nl_core_news_sm')
nlp.tokenizer = custom_tokenizer(nlp)
с этим токены:
'Mijn', 'собственный', 'Huis', 'Staat', зо ", "'", 'п' , 'ЗЭС', 'метр', 'Onder',' гет», 'wateroppervlak', 'ван', 'де', 'Noordzee', ''.
и токены должны быть:
'Mijn', 'собственный', 'Huis', 'Staat', "zo'n" , 'ЗЭС', 'метр', 'Onder', 'гет', 'wateroppervlak' 'ван', 'де', 'Noordzee', ''
Я знаю, что можно добавить пользовательские правила, такие как:
case = [{ORTH: "zo"}, {ORTH: "'n", LEMMA: "een"}]
tokenizer.add_special_case("zo'n",case)
Но я ищу более общее решение.
Я пытался отредактировать регулярное выражение infix_re из другого потока, но, похоже, я не имею никакого влияния на проблему. Есть ли какие-либо настройки или изменения, которые я могу сделать, чтобы это исправить? Любая помощь будет принята с благодарностью.