Я создал небольшой код для поиска аналогий с помощью word2vec, и он отлично работает как отдельное приложение. Вот рабочий код
import numpy as np
# Get the interactive Tools for Matplotlib
%matplotlib notebook
from gensim.test.utils import datapath, get_tmpfile
from gensim.models import KeyedVectors
from gensim.scripts.glove2word2vec import glove2word2vec
import os
glove_file = os.path.abspath('glove.6B/glove.6B.100d.txt')
word2vec_glove_file = get_tmpfile("glove.6B.100d.word2vec.txt")
glove2word2vec(glove_file, word2vec_glove_file)
model = KeyedVectors.load_word2vec_format(word2vec_glove_file)
def analogy(x1, x2, y1):
result = model.most_similar(positive=[y1, x2], negative=[x1])
return result[0][0]
analogy('woman', 'queen', 'man')
Теперь я планирую использовать flask для создания небольшого веб-приложения, чтобы пользователи могли находить аналогии через веб-страницу. Для этого у меня есть основной вопрос
Вот код, который работает с использованием Flask, но не могли бы вы предложить, требуется ли здесь сохранение модели? 2. Любые предложения по улучшению этого кода приветствуются!
import numpy as np
from gensim.test.utils import datapath, get_tmpfile
from gensim.models import KeyedVectors
from gensim.scripts.glove2word2vec import glove2word2vec
import os
from flask import Flask, request
app = Flask(__name__)
@app.route("/", methods=['GET'])
def welcome():
return "Welcome to our Machine Learning REST API!"
@app.route("/analogy", methods=['GET'])
def analogy_route():
word1 = request.args.get("word1")
word2 = request.args.get("word2")
word3 = request.args.get("word3")
result = model.most_similar(positive=[word3, word2], negative=[word1])
return str(result[0][0])
if __name__ == "__main__":
glove_file = os.path.abspath('glove.6B/glove.6B.100d.txt')
word2vec_glove_file = get_tmpfile("glove.6B.100d.word2vec.txt")
glove2word2vec(glove_file, word2vec_glove_file)
model = KeyedVectors.load_word2vec_format(word2vec_glove_file)
app.run(host='0.0.0.0', port=5000, debug=True)
Вы, вероятно, не хотите выполнять преобразование формата GLoVe в word2vec во временный файл каждый раз при запуске службы. (Вероятно, это занимает заметное количество времени и может привести к заполнению временного каталога избыточными копиями одних и тех же данных.)
Вместо этого выполните преобразование только один раз, во временное местоположение. Затем полностью игнорируйте исходный файл glove.6B.100d.txt
— он больше не нужен. Вместо этого просто убедитесь, что преобразованный файл доступен для вашей веб-службы в стабильном месте.
Очень грубо это означает:
glove2word2vec('glove.6B/glove.6B.100d.txt', `glove.6B.100d.word2vec.txt`)
(Обратите внимание, что использование absfile()
вместо get_tmpfile()
не является строго обязательным — вы можете указать пути к строке непосредственно в функцию glove2word2vec()
.)
Убедитесь, что новый файл glove.6B.100d.word2vec.txt
доступен в рабочем каталоге вашего веб-сервиса.
Пусть ветка __main__
вашего веб-сервиса просто загрузит уже преобразованный файл, избегая избыточной повторной работы по преобразованию:
if __name__ == "__main__":
model = KeyedVectors.load_word2vec_format('glove.6B.100d.word2vec.txt')
app.run(host='0.0.0.0', port=5000, debug=True)
(Точный путь 'glove.6B.100d.word2vec.txt'
может немного отличаться в зависимости от того, куда вы решите поместить полный файл.)