Несколько мыслей:
Если kv_model
является вашей KeyedVectors
моделью, вы можете сделать 'to' in kv_model
, чтобы проверить, присутствует ли слово, вместо того, чтобы пытаться, но потом ловитьKeyError
.Но быть оптимистом и ловить ошибку - это тоже распространенная идиома!
Ваша рекурсия не обязательно завершится: если предоставленный текст не содержит известных слов, он будет продолжать рекурсивные попытки бесконечно (или, возможно, когда достигнут некоторый предел реализации глубины вызова).Кроме того, он может попробовать одно и то же слово много раз.
Я бы предложил использовать цикл, а не рекурсию, и использовать метод random.shuffle()
Python для создания единственной случайной перестановки всех потенциальных индексов.Затем попробуйте выполнить каждый из них по очереди, вернувшись, как только замена возможна, или указав сбой, если замена невозможна.
Сохранение подписи возврата того же метода:
def similar_word(sentence):
indexes = range(len(sentence))
random.shuffle(indexes)
for i in indexes:
if sentence[i] in kv_model:
return model.most_similar(sentence[i], topn=1)[0][0], i
return None, -1 # no replacement was possible
(НоОтдельно от вашего вопроса: если бы 100% времени результат функции использовался для выполнения замены, я просто переместил бы замену внутри функции, поменяв переданный sentence
. И функция могла бы сообщить, какон произвел много замен: 0
для отказа, 1
для обычного случая - и, возможно, в будущем может принять параметр для запроса более 1 замены.)