如何通过 Flask RESTful API 在 Web 应用程序中正确加载和使用 word2vec 模型?

How to load and use word2vec model properly in a web-application via Flask RESTful APIs?

我构建了一个小代码来使用 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做一个小的web应用,方便用户通过网页查找类比。为此我有一个基本问题

  1. 我假设我需要保存模型,然后在启动服务器时加载它。请指正我是我错了

这里是使用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 格式转换为一个临时文件。 (这可能会花费大量时间,并且可能会用相同数据的冗余副本填充临时目录。)

相反,只执行一次转换,转换到非临时位置。然后,完全忽略原来的 glove.6B.100d.txt 文件——它不再需要了。相反,只需确保转换后的文件在稳定的位置可供您的 Web 服务使用。

非常粗略地说,这意味着:

  1. 运行一次,任何地方:
glove2word2vec('glove.6B/glove.6B.100d.txt', `glove.6B.100d.word2vec.txt`)

(请注意,对 get_tmpfile() 使用 absfile() 都不是绝对必要的——您可以直接向 glove2word2vec() 函数提供字符串路径。)

  1. 确保新文件 glove.6B.100d.word2vec.txt 在您的 Web 服务的工作目录中可用。

  2. 让你的网络服务的 __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' 可能会略有不同,具体取决于您选择放置完整文件的位置。)