手把手教程:用Python开发一个自然语言处理模型,并用Flask进行部署
截住到目前為止,我們已經開發了許多機器學習模型,對測試數據進行了數值預測,并測試了結果。實際上,生成預測只是機器學習項目的一部分,盡管它是我認為最重要的部分。今天我們來創建一個用于文檔分類、垃圾過濾的自然語言處理模型,使用機器學習來檢測垃圾短信文本消息。我們的ML系統工作流程如下:離線訓練->將模型作為服務提供->在線預測。
1、通過垃圾郵件和非垃圾郵件訓練離線分類器。
2、經過訓練的模型被部署為服務用戶的服務。
當我們開發機器學習模型時,我們需要考慮如何部署它,即如何使這個模型可供其他用戶使用。Kaggle和數據科學訓練營非常適合學習如何構建和優化模型,但他們并沒有教會工程師如何將它們帶給其他用戶使用,建立模型與實際為人們提供產品和服務之間存在重大差異。
在本文中,我們將重點關注:構建垃圾短信分類的機器學習模型,然后使用Flask(用于構建Web應用程序的Python微框架)為模型創建API。此API允許用戶通過HTTP請求利用預測功能。讓我們開始吧!
構建ML模型
數據是標記為垃圾郵件或正常郵件的SMS消息的集合,可在此處找到。首先,我們將使用此數據集構建預測模型,以準確分類哪些文本是垃圾郵件。樸素貝葉斯分類器是一種流行的電子郵件過濾統計技術。他們通常使用詞袋功能來識別垃圾郵件。因此,我們將使用Naive Bayes定理構建一個簡單的消息分類器。
import pandas as pd import numpy as np from sklearn.feature_extraction.text import CountVectorizer from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import classification_reportdf = pd.read_csv('spam.csv', encoding="latin-1") df.drop(['Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4'], axis=1, inplace=True) df['label'] = df['class'].map({'ham': 0, 'spam': 1}) X = df['message'] y = df['label'] cv = CountVectorizer() X = cv.fit_transform(X) # Fit the Data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42) #Naive Bayes Classifier clf = MultinomialNB() clf.fit(X_train,y_train) clf.score(X_test,y_test) y_pred = clf.predict(X_test) print(classification_report(y_test, y_pred))Naive Bayes分類器不僅易于實現,而且提供了非常好的性能。在訓練模型之后,我們都希望有一種方法來保持模型以供將來使用而無需重新訓練。為實現此目的,我們添加以下行以將我們的模型保存為.pkl文件供以后使用。
from sklearn.externals import joblib joblib.dump(clf, 'NB_spam_model.pkl')我們加載并使用保存的模型:
NB_spam_model = open('NB_spam_model.pkl','rb') clf = joblib.load(NB_spam_model)上述過程稱為“標準格式的持久模型”,即模型以特定的開發語言的特定格式持久存儲。下一步就是將模型在一個微服務中提供,該服務的公開端點用來接收來自客戶端的請求。
將垃圾郵件分類器轉換為Web應用程序
在上一節中準備好用于對SMS消息進行分類的代碼之后,我們將開發一個Web應用程序,該應用程序由一個簡單的Web頁面組成,該頁面具有允許我們輸入消息的表單字段。在將消息提交給Web應用程序后,它將在新頁面上呈現該消息,從而為我們提供是否為垃圾郵件的結果。
首先,我們為這個項目創建一個名為SMS-Message-Spam-Detector?的文件夾,這是該文件夾中的目錄樹,接下來我們將解釋每個文件。
spam.csv app.py templates/home.htmlresult.html static/style.css子目錄templates是Flask在Web瀏覽器中查找靜態HTML文件的目錄,在我們的例子中,我們有兩個html文件:home.html和result.html?。
app.py
app.py文件包含將由Python解釋器執行以運行Flask Web應用程序的主代碼,還包含用于對SMS消息進行分類的ML代碼
from flask import Flask,render_template,url_for,request import pandas as pd import pickle from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.externals import joblibapp = Flask(__name__)@app.route('/') def home():return render_template('home.html')@app.route('/predict',methods=['POST']) def predict():df= pd.read_csv("spam.csv", encoding="latin-1")df.drop(['Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4'], axis=1, inplace=True)# Features and Labelsdf['label'] = df['class'].map({'ham': 0, 'spam': 1})X = df['message']y = df['label']# Extract Feature With CountVectorizercv = CountVectorizer()X = cv.fit_transform(X) # Fit the Datafrom sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)#Naive Bayes Classifierfrom sklearn.naive_bayes import MultinomialNBclf = MultinomialNB()clf.fit(X_train,y_train)clf.score(X_test,y_test)#Alternative Usage of Saved Model# joblib.dump(clf, 'NB_spam_model.pkl')# NB_spam_model = open('NB_spam_model.pkl','rb')# clf = joblib.load(NB_spam_model)if request.method == 'POST':message = request.form['message']data = [message]vect = cv.transform(data).toarray()my_prediction = clf.predict(vect)return render_template('result.html',prediction = my_prediction)if __name__ == '__main__':app.run(debug=True)1、我們將應用程序作為單個模塊運行,因此我們使用參數初始化了一個新的Flask實例,__name__是為了讓Flask知道它可以在templates所在的同一目錄中找到HTML模板文件夾()。
2、接下來,我們使用route decorator(@app.route('/'))來指定可以觸發home?函數執行的URL?。我們的home?函數只是呈現home.htmlHTML文件,該文件位于templates文件夾中。
3、在predict函數內部,我們訪問垃圾郵件數據集、預處理文本、進行預測,然后存儲模型。我們訪問用戶輸入的新消息,并使用我們的模型對其標簽進行預測。
4、我們使用該POST方法將表單數據傳輸到郵件正文中的服務器。最后,通過debug=True在app.run方法中設置參數,進一步激活Flask的調試器。
5、最后,我們使用run函數執行在服務器上的腳本文件,我們需要確保使用if語句?__name__ == '__main__'。
home.html
以下是home.html將呈現文本表單的文件的內容,用戶可以在其中輸入消息:
<!DOCTYPE html> <html> <head><title>Home</title><!-- <link rel="stylesheet" type="text/css" href="../static/css/styles.css"> --><link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/styles.css') }}"> </head> <body><header><div class="container"><div id="brandname">Machine Learning App with Flask</div><h2>Spam Detector For SMS Messages</h2></div></header><div class="ml-container"><form action="{{ url_for('predict')}}" method="POST"><p>Enter Your Message Here</p><!-- <input type="text" name="comment"/> --><textarea name="message" rows="4" cols="50"></textarea><br/><input type="submit" class="btn-info" value="predict"></form></div> </body> </html> view rawstyle.css文件
在home.html的head部分,我們將加載styles.css文件,CSS文件是用于確定HTML文檔的外觀和風格的。styles.css必須保存在一個名為的子目錄中static,這是Flask查找靜態文件(如CSS)的默認目錄。
body{font:15px/1.5 Arial, Helvetica,sans-serif;padding: 0px;background-color:#f4f3f3; }.container{width:100%;margin: auto;overflow: hidden; }header{background:#03A9F4;#35434a;border-bottom:#448AFF 3px solid;height:120px;width:100%;padding-top:30px;}.main-header{text-align:center;background-color: blue;height:100px;width:100%;margin:0px;} #brandname{float:left;font-size:30px;color: #fff;margin: 10px; }header h2{text-align:center;color:#fff;}.btn-info {background-color: #2196F3;height:40px;width:100px;} /* Blue */ .btn-info:hover {background: #0b7dda;}.resultss{border-radius: 15px 50px;background: #345fe4;padding: 20px; width: 200px;height: 150px; }style.css文件
result.html
我們創建一個result.html文件,該文件將通過函數render_template('result.html', prediction=my_prediction)返回呈現predict,我們在app.py腳本中定義該文件以顯示用戶通過文本字段提交的文本。result.html文件包含以下內容:
<!DOCTYPE html> <html> <head><title></title><link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/styles.css') }}"> </head> <body><header><div class="container"><div id="brandname">ML App</div><h2>Spam Detector For SMS Messages</h2> </div></header><p style="color:blue;font-size:20;text-align: center;"><b>Results for Comment</b></p><div class="results">{% if prediction == 1%}<h2 style="color:red;">Spam</h2>{% elif prediction == 0%}<h2 style="color:blue;">Not a Spam (It is a Ham)</h2>{% endif %}</div> </body> </html>result.html
從result.htm文件我們可以看到一些代碼使用通常在HTML文件中找不到的語法例如,{% if prediction ==1%},{% elif prediction == 0%},{% endif %}這是jinja語法,它用于訪問從HTML文件中請求返回的預測。
我們就要大功告成了!
完成上述所有操作后,你可以通過雙擊appy.py?或從終端執行命令來開始運行API?:
cd SMS-Message-Spam-Detector python app.py你應該得到以下輸出:
現在你可以打開Web瀏覽器并導航到http://127.0.0.1:5000/,你應該看到一個簡單的網站,內容如下:
恭喜!我們現在以零成本的代價創建了端到端機器學習(NLP)應用程序。如果你回顧一下,其實整個過程根本不復雜。有點耐心和渴望學習的動力,任何人都可以做到。所有開源工具都使每件事都成為可能。
更重要的是,我們能夠將我們對機器學習理論的知識擴展到有用和實用的Web應用程序!
完整的工作源代碼可在此存儲庫中找到,祝你度過愉快的一周!
?
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
?
?
總結
以上是生活随笔為你收集整理的手把手教程:用Python开发一个自然语言处理模型,并用Flask进行部署的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里重磅开源Blink:为什么我们等了这
- 下一篇: 安排!活动素材的亿级用户精准投放