到目前为止,我们已经开发了许多机器学习模型,对测试数据进行了数值预测,并测试了结果。实际上,生成预测只是机器学习项目的一部分,但对我来说,这是最重要的一部分。今天,我们将创建一个用于文档分类和垃圾短信过滤的自然语言处理模型,利用机器学习技术识别垃圾短信。
我们的机器学习系统工作流程如下:离线训练 -> 将模型作为服务提供 -> 在线预测。
数据集包括标记为垃圾邮件或正常邮件的短信集合。我们将使用该数据集构建预测模型,以准确分类哪些短信是垃圾邮件。朴素贝叶斯分类器是一种常用的统计技术,通常使用词袋模型来识别垃圾邮件。因此,我们将使用朴素贝叶斯定理构建一个简单的短信分类器。
```python import pandas as pd import numpy as np from sklearn.featureextraction.text import CountVectorizer from sklearn.modelselection import traintestsplit from sklearn.naivebayes import MultinomialNB from sklearn.metrics import classificationreport
df = 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)
Xtrain, Xtest, ytrain, ytest = traintestsplit(X, y, testsize=0.33, randomstate=42)
clf = MultinomialNB() clf.fit(Xtrain, ytrain) clf.score(Xtest, ytest)
ypred = clf.predict(Xtest) print(classificationreport(ytest, y_pred)) ```
训练完成后,我们需要一种方法来保存模型,以便在未来使用而无需重新训练。为此,我们使用joblib库保存模型为.pkl文件。
```python from sklearn.externals import joblib
joblib.dump(clf, 'NBspammodel.pkl') ```
加载并使用保存的模型:
python
NB_spam_model = open('NB_spam_model.pkl', 'rb')
clf = joblib.load(NB_spam_model)
在上一部分中,我们已经准备好了一个用于分类短信的代码。现在,我们将开发一个Web应用,该应用由一个简单的网页组成,包含一个允许用户输入短信的表单。提交短信后,该应用会在新页面上显示短信,并给出是否为垃圾短信的结果。
首先,我们创建一个名为SMS-Message-Spam-Detector的文件夹。该文件夹结构如下:
spam.csvapp.pytemplates/
home.htmlresult.htmlstatic/
style.cssapp.py 文件app.py 文件包含了运行Flask Web应用的主代码,以及用于分类短信的机器学习代码。
```python from flask import Flask, rendertemplate, urlfor, request import pandas as pd import pickle from sklearn.featureextraction.text import CountVectorizer from sklearn.naivebayes import MultinomialNB
app = 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) df['label'] = df['class'].map({'ham': 0, 'spam': 1}) X = df['message'] y = df['label']
cv = CountVectorizer()
X = cv.fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
clf = MultinomialNB()
clf.fit(X_train, y_train)
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) ```
home.html 文件home.html 文件包含一个表单,用户可以在其中输入短信。
```html
```
style.css 文件style.css 文件定义了网页的样式。
```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; 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; }
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; }
.btn-info:hover { background: #0b7dda; } ```
result.html 文件result.html 文件显示用户提交短信的分类结果。
```html
Results for Comment
```
通过上述步骤,我们成功创建了一个完整的端到端机器学习应用。你可以通过双击app.py或在终端中运行python app.py启动API。打开浏览器并导航到http://127.0.0.1:5000/,即可看到一个简单的网站,用于检测短信是否为垃圾短信。
本文由阿里云云栖社区组织翻译。
文章原标题《开发一个NLP模型并在Flask中部署——分步指南》
作者:Susan Li,加拿大数据科学家