对于非Web开发者来说,构建Web API一直是一项繁琐的任务。这不仅涉及到前端和后端平台的开发,而且通常需要处理复杂的前端任务。幸运的是,Python以其迷人的框架如Streamlit、Flask和FastAPI等,帮助优雅地构建Web API,无需担心前端问题,因为这些框架已经提供了默认的用户界面。
Streamlit是Python中用于轻松构建Web API的框架之一。使用Streamlit,不必担心前端任务,因为它可以自动处理这些任务,而无需编写任何代码。可以迅速构建所有需要的应用程序。想要了解更多关于Streamlit的信息,请访问。
创建新环境后,只需输入以下命令即可开始使用:
pip install streamlit
可能需要下载其他库以完成不同的数据建模任务。现在让开始项目。安装后,运行以下命令以检查安装是否成功:
streamlit hello
如果在浏览器中看到以下屏幕,则表示安装成功。
原始问题由Kaggle提供,要求根据推文的情感对推文进行灾难性分类。然后,将其构建为一个端到端的项目。在这篇博客中,只会使用Streamlit创建Web API。对于整个项目,可以访问。
安装Streamlit后,让开始开发Web API。首先,需要安装并导入所需的库。
import streamlit as st ## streamlit
import pandas as pd ## for data manipulation
import pickle ## For model loading
import spacy ## For NLP tasks
import time
from PIL import Image ## For image
from io import StringIO ## for text input and output from the web app
导入库后,首先需要加载已保存为pickle文件的已训练模型。
def load_model():
global nlp
global textcat
nlp = spacy.load(model_path) ## will load the model from the model_path
textcat = nlp.get_pipe(model_file) ## will load the model file
加载模型后,将使用它对推文进行分类预测。模型首先会向量化文本,然后进行预测。
def predict(tweet):
print("news = ", tweet) ## tweet
news = [tweet]
txt_docs = list(nlp.pipe(tweet))
scores, _ = textcat.predict(txt_docs)
print(scores)
predicted_classes = scores.argmax(axis=1)
print(predicted_classes)
result = ['real' if lbl == 1 else 'fake' for lbl in predicted_classes]
print(result)
return(result)
predict函数将接受推文作为输入,首先向量化推文,然后使用模型进行分类。这里有两个类别:real或fake。如果预测结果为1,则表示这是一个真实的推文,意味着它对灾难是肯定的;否则,它是假的。
def run():
st.sidebar.info('You can either enter the news item online in the textbox or upload a txt file')
st.set_option('deprecation.showfileUploaderEncoding', False)
add_selectbox = st.sidebar.selectbox("How would you like to predict?", ("Online", "Txt file"))
st.title("Predicting fake tweet")
st.header('This app is created to predict if a tweet is real or fake')
if add_selectbox == "Online":
text1 = st.text_area('Enter text')
output = ""
if st.button("Predict"):
output = predict(text1)
output = str(output[0]) # since its a list, get the 1st item
st.success(f"The news item is {output}")
st.balloons()
elif add_selectbox == "Txt file":
output = ""
file_buffer = st.file_uploader("Upload text file for new item", type=["txt"])
if st.button("Predict"):
text_news = file_buffer.read()
st_version = st.__version__ # eg 0.67.0
versions = st_version.split('.')
if int(versions[1]) > 67:
text_news = text_news.decode('utf-8')
print(text_news)
output = predict(text_news)
output = str(output[0])
st.success(f"The news item is {output}")
st.balloons()
上述run函数将通过应用程序接收用户输入的文本或文本文件,并在按下predict按钮后给出输出。
if __name__ == "__main__":
load_model()
run()
if __name__ == “main”:用于仅当文件被直接运行,而不是被导入时执行一些代码。这意味着模块正在被用户独立运行,可以执行相应的适当操作。
现在可以在本地系统上使用以下命令运行应用程序:
streamlit run app.py
运行此应用程序后,将看到进一步的网页,可以在其中输入文本并点击predict按钮后获得预测结果。