日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

手把手教程:用Python开发一个自然语言处理模型,并用Flask进行部署

發(fā)布時(shí)間:2024/8/23 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手把手教程:用Python开发一个自然语言处理模型,并用Flask进行部署 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

截住到目前為止,我們已經(jīng)開(kāi)發(fā)了許多機(jī)器學(xué)習(xí)模型,對(duì)測(cè)試數(shù)據(jù)進(jìn)行了數(shù)值預(yù)測(cè),并測(cè)試了結(jié)果。實(shí)際上,生成預(yù)測(cè)只是機(jī)器學(xué)習(xí)項(xiàng)目的一部分,盡管它是我認(rèn)為最重要的部分。今天我們來(lái)創(chuàng)建一個(gè)用于文檔分類、垃圾過(guò)濾的自然語(yǔ)言處理模型,使用機(jī)器學(xué)習(xí)來(lái)檢測(cè)垃圾短信文本消息。我們的ML系統(tǒng)工作流程如下:離線訓(xùn)練->將模型作為服務(wù)提供->在線預(yù)測(cè)。

1、通過(guò)垃圾郵件和非垃圾郵件訓(xùn)練離線分類器。

2、經(jīng)過(guò)訓(xùn)練的模型被部署為服務(wù)用戶的服務(wù)。

當(dāng)我們開(kāi)發(fā)機(jī)器學(xué)習(xí)模型時(shí),我們需要考慮如何部署它,即如何使這個(gè)模型可供其他用戶使用。Kaggle和數(shù)據(jù)科學(xué)訓(xùn)練營(yíng)非常適合學(xué)習(xí)如何構(gòu)建和優(yōu)化模型,但他們并沒(méi)有教會(huì)工程師如何將它們帶給其他用戶使用,建立模型與實(shí)際為人們提供產(chǎn)品和服務(wù)之間存在重大差異。

在本文中,我們將重點(diǎn)關(guān)注:構(gòu)建垃圾短信分類的機(jī)器學(xué)習(xí)模型,然后使用Flask(用于構(gòu)建Web應(yīng)用程序的Python微框架)為模型創(chuàng)建API。此API允許用戶通過(guò)HTTP請(qǐng)求利用預(yù)測(cè)功能。讓我們開(kāi)始吧!

構(gòu)建ML模型

數(shù)據(jù)是標(biāo)記為垃圾郵件或正常郵件的SMS消息的集合,可在此處找到。首先,我們將使用此數(shù)據(jù)集構(gòu)建預(yù)測(cè)模型,以準(zhǔn)確分類哪些文本是垃圾郵件。樸素貝葉斯分類器是一種流行的電子郵件過(guò)濾統(tǒng)計(jì)技術(shù)。他們通常使用詞袋功能來(lái)識(shí)別垃圾郵件。因此,我們將使用Naive Bayes定理構(gòu)建一個(gè)簡(jiǎn)單的消息分類器。

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分類器不僅易于實(shí)現(xiàn),而且提供了非常好的性能。在訓(xùn)練模型之后,我們都希望有一種方法來(lái)保持模型以供將來(lái)使用而無(wú)需重新訓(xùn)練。為實(shí)現(xiàn)此目的,我們添加以下行以將我們的模型保存為.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)

上述過(guò)程稱為“標(biāo)準(zhǔn)格式的持久模型”,即模型以特定的開(kāi)發(fā)語(yǔ)言的特定格式持久存儲(chǔ)。下一步就是將模型在一個(gè)微服務(wù)中提供,該服務(wù)的公開(kāi)端點(diǎn)用來(lái)接收來(lái)自客戶端的請(qǐng)求。

將垃圾郵件分類器轉(zhuǎn)換為Web應(yīng)用程序

在上一節(jié)中準(zhǔn)備好用于對(duì)SMS消息進(jìn)行分類的代碼之后,我們將開(kāi)發(fā)一個(gè)Web應(yīng)用程序,該應(yīng)用程序由一個(gè)簡(jiǎn)單的Web頁(yè)面組成,該頁(yè)面具有允許我們輸入消息的表單字段。在將消息提交給Web應(yīng)用程序后,它將在新頁(yè)面上呈現(xiàn)該消息,從而為我們提供是否為垃圾郵件的結(jié)果。

首先,我們?yōu)檫@個(gè)項(xiàng)目創(chuàng)建一個(gè)名為SMS-Message-Spam-Detector?的文件夾,這是該文件夾中的目錄樹(shù),接下來(lái)我們將解釋每個(gè)文件。

spam.csv app.py templates/home.htmlresult.html static/style.css

子目錄templates是Flask在Web瀏覽器中查找靜態(tài)HTML文件的目錄,在我們的例子中,我們有兩個(gè)html文件:home.html和result.html?。

app.py

app.py文件包含將由Python解釋器執(zhí)行以運(yùn)行Flask Web應(yīng)用程序的主代碼,還包含用于對(duì)SMS消息進(jìn)行分類的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、我們將應(yīng)用程序作為單個(gè)模塊運(yùn)行,因此我們使用參數(shù)初始化了一個(gè)新的Flask實(shí)例,__name__是為了讓Flask知道它可以在templates所在的同一目錄中找到HTML模板文件夾()。

2、接下來(lái),我們使用route decorator(@app.route('/'))來(lái)指定可以觸發(fā)home?函數(shù)執(zhí)行的URL?。我們的home?函數(shù)只是呈現(xiàn)home.htmlHTML文件,該文件位于templates文件夾中。

3、在predict函數(shù)內(nèi)部,我們?cè)L問(wèn)垃圾郵件數(shù)據(jù)集、預(yù)處理文本、進(jìn)行預(yù)測(cè),然后存儲(chǔ)模型。我們?cè)L問(wèn)用戶輸入的新消息,并使用我們的模型對(duì)其標(biāo)簽進(jìn)行預(yù)測(cè)。

4、我們使用該P(yáng)OST方法將表單數(shù)據(jù)傳輸?shù)洁]件正文中的服務(wù)器。最后,通過(guò)debug=True在app.run方法中設(shè)置參數(shù),進(jìn)一步激活Flask的調(diào)試器。

5、最后,我們使用run函數(shù)執(zhí)行在服務(wù)器上的腳本文件,我們需要確保使用if語(yǔ)句?__name__ == '__main__'。

home.html

以下是home.html將呈現(xiàn)文本表單的文件的內(nèi)容,用戶可以在其中輸入消息:

<!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 raw

style.css文件

在home.html的head部分,我們將加載styles.css文件,CSS文件是用于確定HTML文檔的外觀和風(fēng)格的。styles.css必須保存在一個(gè)名為的子目錄中static,這是Flask查找靜態(tài)文件(如CSS)的默認(rèn)目錄。

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

我們創(chuàng)建一個(gè)result.html文件,該文件將通過(guò)函數(shù)render_template('result.html', prediction=my_prediction)返回呈現(xiàn)predict,我們?cè)赼pp.py腳本中定義該文件以顯示用戶通過(guò)文本字段提交的文本。result.html文件包含以下內(nèi)容:

<!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文件中找不到的語(yǔ)法例如,{% if prediction ==1%},{% elif prediction == 0%},{% endif %}這是jinja語(yǔ)法,它用于訪問(wèn)從HTML文件中請(qǐng)求返回的預(yù)測(cè)。

我們就要大功告成了!

完成上述所有操作后,你可以通過(guò)雙擊appy.py?或從終端執(zhí)行命令來(lái)開(kāi)始運(yùn)行API?:

cd SMS-Message-Spam-Detector python app.py

你應(yīng)該得到以下輸出:

現(xiàn)在你可以打開(kāi)Web瀏覽器并導(dǎo)航到http://127.0.0.1:5000/,你應(yīng)該看到一個(gè)簡(jiǎn)單的網(wǎng)站,內(nèi)容如下:

恭喜!我們現(xiàn)在以零成本的代價(jià)創(chuàng)建了端到端機(jī)器學(xué)習(xí)(NLP)應(yīng)用程序。如果你回顧一下,其實(shí)整個(gè)過(guò)程根本不復(fù)雜。有點(diǎn)耐心和渴望學(xué)習(xí)的動(dòng)力,任何人都可以做到。所有開(kāi)源工具都使每件事都成為可能。

更重要的是,我們能夠?qū)⑽覀儗?duì)機(jī)器學(xué)習(xí)理論的知識(shí)擴(kuò)展到有用和實(shí)用的Web應(yīng)用程序!

完整的工作源代碼可在此存儲(chǔ)庫(kù)中找到,祝你度過(guò)愉快的一周!

?

原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。

?

?

總結(jié)

以上是生活随笔為你收集整理的手把手教程:用Python开发一个自然语言处理模型,并用Flask进行部署的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。