日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

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

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

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

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

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

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

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

構(gòu)建ML模型

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

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

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

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

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

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

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

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

app.py

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

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

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

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

5、最后,我們使用run函數(shù)執(zhí)行在服務(wù)器上的腳本文件,我們需要確保使用if語句?__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必須保存在一個名為的子目錄中static,這是Flask查找靜態(tài)文件(如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

我們創(chuàng)建一個result.html文件,該文件將通過函數(shù)render_template('result.html', prediction=my_prediction)返回呈現(xiàn)predict,我們在app.py腳本中定義該文件以顯示用戶通過文本字段提交的文本。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文件中找不到的語法例如,{% if prediction ==1%},{% elif prediction == 0%},{% endif %}這是jinja語法,它用于訪問從HTML文件中請求返回的預(yù)測。

我們就要大功告成了!

完成上述所有操作后,你可以通過雙擊appy.py?或從終端執(zhí)行命令來開始運行API?:

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

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

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

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

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

完整的工作源代碼可在此存儲庫中找到,祝你度過愉快的一周!

?

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

?

?

總結(jié)

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

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