Как исправить UserWarning и DeprecationWarning в Python - PullRequest
0 голосов
/ 28 июня 2019

Я запускаю некоторый код, который обучает, сохраняет и загружает модель Word2Vec (это часть загруженной мной библиотеки, созданной пользователем на github как часть опубликованной статьи).После запуска две части кода кажутся проблематичными, хотя на самом деле код выполняется до конца.

Первая ошибка возникает из method, называемого train_word2vec() (который вызывается как частьосновной метод программы).

Вторая ошибка возникает из строки позже в основной method.

Проблемная строка 1 - в методе train_word2vec ():

if exists(model_name):

embedding_model = word2vec.Word2Vec.load(model_name) #This line causes a UserWarning.

Проблемная строка 2 - Позже в программе, в основном методе:

x_train, x_val, x_test, vocabulary, vocabulary_inv, sentences = load_data() #This line seems to run fine.

embedding_weights = train_word2vec(sentences, vocabulary_inv) #This line causes two DeprecationWarnings. 

DeprecationWarnings специально создается следующей строкой в ​​train_word2Vec:

embedding_weights = [np.array([embedding_model[w] if w in embedding_model else np.random.uniform(-0.25,0.25,embedding_model.vector_size) for w in vocabulary_inv])]

При выполнении кода первая проблемная строка вызывает предупреждение пользователя:

"C: \ Users \ User1 \ Anaconda3 \ lib\ site-packages \ smart_open \ smart_open_lib.py398: UserWarning: эта функция устарела, вместо нее используйте smart_open.open. Подробности см. в примечаниях по миграции: https://github.com/RaRe-Technologies/smart_open/blob/master/README.rst#migrating-to-the-new-open-function "

Вторая проблемная строка вызывает двеDeprecationWarnings:

"load_w2v.py:91: DeprecationWarning: вызов устаревшего ' содержит ' (метод будет удален в 4.0.0, используйте self.wv. содержит () вместо). embedding_weights = [np.array ([embedding_model [w] если w в embedding_model else np.random.uniform (-0.25,0.25, embedding_model.vector_size) для w в vocabulary_inv])] "" load_w2v.py: 91: АмортизацияnВнимание: вызов устаревшего ' getitem ' (метод будет удален в 4.0.0, используйте self.wv. getitem ()).embedding_weights = [np.array ([embedding_model [w], если w в embedding_model else np.random.uniform (-0.25,0.25, embedding_model.vector_size) для w в vocabulary_inv])] "

Я смотрелв REReME технологий RaRe. Что сбивает с толку, так это то, что нигде в моем коде я не использую функцию «smart_open», поэтому я не понимаю, почему было выдано первое предупреждение. smart_open даже не импортируется в началефайл Python.

Что касается DeprecationWarnings, я не использую в своем коде ни метод «Содержит», ни метод «getitem», поэтому не уверен, откуда поступают эти предупреждения.

КакНасколько я могу судить, кажется, что код работает правильно, и окончательный файл, кажется, был успешно создан. Однако, поскольку я воссоздаю некоторый код, который написал кто-то другой, я не уверен, что файл был создан правильно.

Do DeprecationWarnings и UserWarnings фактически указывают на то, что программа не была успешно выполнена? Или они просто как «предупреждения»?Т.е. возможно ли, чтобы код работал нормально, а «предупреждения» по-прежнему выдавались?

Если кто-нибудь может увидеть, как я могу изменить код, чтобы избежать этих ошибок, это было бы полезно.Я новичок в Python, поэтому, пожалуйста, укажите на любые ошибки.Спасибо.

1 Ответ

0 голосов
/ 28 июня 2019

В общем, вы часто можете игнорировать различные «предупреждения». Если бы они остановили работу или испортили результаты, они бы выглядели как более серьезные ошибки или исключения, которые необходимо обработать для продолжения выполнения.

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

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

Уведомление о smart_open по существу является проблемой, которую gensim необходимо исправить в следующем выпуске. Пакет smart_open изменил предпочтительный способ сделать что-то, gensim все еще использует более старый (все еще работающий, но «устаревший») подход. Вы не звоните smart_open напрямую, так что это не ваше дело.

Уведомления о contains и getitem могут находиться под вашим контролем - они запускаются строками в файле load_w2v.py - которого нет в gensim и чей код вы не показывали , В частности, gensim теперь поощряет доступ к слово-вектору через свойство .wv модели Word2Vec, а не через модель верхнего уровня (где будут генерироваться эти предупреждения). (Тем не менее, старый метод работает и будет работать до тех пор, пока gensim не решит внести критические изменения.)

Если отображение предупреждений действительно вас беспокоит, и вы не хотите углубляться в свой код, чтобы избежать их запуска, то вы также можете просто отключить их отображение, как описано в комментарии и ссылке @ tom-dalton.

...