spaCy: Слово в словаре

Я пытаюсь исправлять опечатки с помощью spaCy, и для этого мне нужно знать, существует ли слово в словаре или нет. Если нет, идея состоит в том, чтобы разделить слово на две части, пока все сегменты не будут существовать. Например, «ofthe» не существует, «of» и «the» существуют. Поэтому мне сначала нужно знать, существует ли слово в словаре. Вот тут и начинаются проблемы. Я попробую:

for token in nlp("apple"):
    print(token.lemma_, token.lemma, token.is_oov, "apple" in nlp.vocab)
apple 8566208034543834098 True True

for token in nlp("andshy"):
    print(token.lemma_, token.lemma, token.is_oov, "andshy" in nlp.vocab)
andshy 4682930577439079723 True True

Понятно, что это не имеет смысла, в обоих случаях "is_oov" равно True, и оно есть в словаре. Я ищу что-то простое, например

"andshy" in nlp.vocab = False, "andshy".is_oov = True
"apple" in nlp.vocab = True, "apple".is_oov = False

И на следующем этапе также какой-нибудь метод исправления слов. Я могу использовать библиотеку проверки орфографии, но это не соответствует словарному запасу spaCy.

Эта проблема является частым вопросом, и любые предложения (код) приветствуются.

Благодарность,

AHe


person user9165100    schedule 29.12.2019    source источник
comment
Кажется, здесь нет вопроса.   -  person erip    schedule 30.12.2019
comment
Вопрос: как вы это делаете? Обобщение вопроса имеет гораздо больше смысла, чем написание большого количества кода, который не работает (имхо).   -  person user9165100    schedule 30.12.2019
comment
Хотя я до сих пор не знаю, что это такое. Какой у Вас вопрос? Советы о том, как задать вопрос, см. на этой странице.   -  person erip    schedule 30.12.2019
comment
Вопрос заключался в следующем: как мне найти слово в словаре spaCy. Извините за путаницу и амбивалентность   -  person user9165100    schedule 30.12.2019


Ответы (2)


Краткий ответ: модели spacy не содержат списков слов, подходящих для исправления орфографии.

Более длинный ответ:

vocab Spacy не является фиксированным списком слов на определенном языке. Это просто кеш с лексической информацией о токенах, которые были замечены при обучении и обработке. Проверка того, находится ли токен в nlp.vocab, просто проверяет, находится ли токен в этом кеше, поэтому это бесполезная проверка для исправления орфографии.

Token.is_oov имеет более конкретное значение, которое не очевидно из его краткого описания в документации: оно сообщает, содержит ли модель дополнительную лексическую информацию об этом токене, например Token.prob. Для небольшой пространственной модели, такой как en_core_web_sm, которая не содержит никаких вероятностей, is_oov по умолчанию будет равно True для всех токенов. Модели md и lg содержат лексическую информацию о более чем 1 млн токенов, а векторы слов содержат более 600 тыс. токенов, но эти списки слишком велики и зашумлены, чтобы их можно было использовать для исправления орфографии.

person aab    schedule 06.01.2020
comment
Спасибо. Я буду использовать средство проверки орфографии (pypi.org/project/pyspellchecker) с некоторыми личными хитростями. Например, обширный список опечаток, встречающихся в вашем корпусе... - person user9165100; 08.01.2020

Для проверки орфографии вы можете попробовать spacy_hunspell. Вы можете добавить это в конвейер.

Дополнительная информация и пример кода находятся здесь: https://spacy.io/universe/project/spacy_hunspell

person piernik    schedule 20.04.2020