如何通过 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应用,方便用户通过网页查找类比。为此我有一个基本问题
- 我假设我需要保存模型,然后在启动服务器时加载它。请指正我是我错了
这里是使用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 服务使用。
非常粗略地说,这意味着:
- 运行一次,任何地方:
glove2word2vec('glove.6B/glove.6B.100d.txt', `glove.6B.100d.word2vec.txt`)
(请注意,对 get_tmpfile()
使用 absfile()
都不是绝对必要的——您可以直接向 glove2word2vec()
函数提供字符串路径。)
确保新文件 glove.6B.100d.word2vec.txt
在您的 Web 服务的工作目录中可用。
让你的网络服务的 __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'
可能会略有不同,具体取决于您选择放置完整文件的位置。)
我构建了一个小代码来使用 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应用,方便用户通过网页查找类比。为此我有一个基本问题
- 我假设我需要保存模型,然后在启动服务器时加载它。请指正我是我错了
这里是使用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 服务使用。
非常粗略地说,这意味着:
- 运行一次,任何地方:
glove2word2vec('glove.6B/glove.6B.100d.txt', `glove.6B.100d.word2vec.txt`)
(请注意,对 get_tmpfile()
使用 absfile()
都不是绝对必要的——您可以直接向 glove2word2vec()
函数提供字符串路径。)
确保新文件
glove.6B.100d.word2vec.txt
在您的 Web 服务的工作目录中可用。让你的网络服务的
__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'
可能会略有不同,具体取决于您选择放置完整文件的位置。)