我正在尝试创建一个简单的基于烧瓶的Web应用程序,其中用户输入一些文本并接收其情感分类。我在使用Scikit-Learn训练模型后保存的泡菜文件很难。我要加载的文件是tfidf_vectorizer_train.pkl
,当我将函数调用到load_tfidf_model
时,该文件应该已加载。每当我本地运行该应用程序时,我都会收到以下错误
attributeError:'nontype'对象没有属性'变换'
我怀疑是由于模型未能加载而引起的,而全局变量tfidf_model
仍然是无类型。
如果有帮助,当前目录看起来像
├── ml_app.py
├── models
│ └── tfidf_vectorizer_train.pkl
├── templates
│ └── main.html
其中 ml_app.py
包含下面的代码
from flask import Flask, request, render_template
from sklearn.externals import joblib
app = Flask(__name__)
models_directory = 'models'
tfidf_model = None
def load_tfidf_model():
global tfidf_model
tfidf_model = joblib.load('{}/tfidf_vectorizer_train.pkl'.format(models_directory))
@app.route('/')
def my_form():
return render_template('main.html')
@app.route('/', methods=['POST'])
def my_form_post():
text = request.form['text']
# clean using tfidf
comment_term_doc = tfidf_model.transform([text])
processed_text = comment_term_doc.toarray()
return render_template('main.html', text=text, processed_text=processed_text)
if __name__ == '__main__':
try:
load_tfidf_model()
print("Model loaded")
except Exception as e:
print("Model loading failed")
print(str(e))
app.run()
显然得出结论,您需要调用load_tfidf_model
,然后才能调用my_form_post
路由方法。一个可能的结论是joblib.load
正在失败。您不会在任何地方检查返回值。
由于您不报告任何例外,所以我认为没有发生任何例外。
joblib.load
文档建议可以返回任何Python类型,因此您可能需要查看创建已加载文件的代码。
一种风格问题:与其使用全局,而是让load_tfidf_model
返回joblib.load
返回的值,并将其保存在调用代码中(您无需将其声明为全局(。全球群体不是在功能之间进行交流的好方法。