파이톤으로 스팸메일 필터 모델 개발 및 Django 배치
소개하다.
스팸메일은 인터넷상의 현실이다.웹 사이트에서 논평이나 연락처를 사용하면 스팸메일 발송자를 처리해야 합니다.당신의 사이트가 나쁜 첫인상을 남기지 않도록 스팸메일을 막는 방법을 찾아야 합니다.만약 Wordpress와 같은 내용 관리 시스템이 없는 사이트를 개발하고 있다면, 이 점은 특히 중요하다. 왜냐하면 스팸메일 필터 플러그인과 연결되어 있기 때문이다.Akismet와 같은 API를 사용할 수도 있지만, 이것은 대가가 있기 때문에 자신의 상대적으로 정확한 모델을 실현함으로써 피할 수 있다.
Kaggle과 다른 데이터 과학 훈련 캠프는 모델을 구축하고 최적화하는 방법을 배우기에 매우 적합하지만 현실 세계 장면에서 이러한 모델을 실제로 사용하는 방법을 가르치지 않았다. 현실 세계 장면에서 모델을 구축하고 배치하여 최종 사용자가 인터넷에서 사용할 수 있도록 하는 데 중대한 차이가 존재한다.
이 자습서에서는 SMS 스팸 감지 웹 응용 프로그램을 구축합니다.이 프로그램은 Django 프레임워크를 사용하여 Python에 구축되며, 깊이 있는 학습 모델을 포함합니다. 소박한 베일스의 정리를 이용하여 이 모델을 훈련시켜 SMS 스팸메일을 검출할 것입니다.
소박 베일스 분류
소박 베일스 분류는 간단한 확률 알고리즘으로 모든 모델 특징이 독립적이라는 사실을 바탕으로 한다.우리는 메시지의 모든 단어가 스팸메일 필터의 상하문에 있는 모든 다른 단어와 독립된다고 가정하고, 상하문을 모르는 상황에서 그것들을 계산한다.
현재 용어집의 상태에 따라 우리의 분류 알고리즘이 스팸메일로 메시지를 생성할 확률이 있습니다.확률 추정은 베일스 공식을 바탕으로 하고 공식 분량은 전체 메시지 패키지의 단어 주파수를 바탕으로 한다.
모형 제작
이 데이터는 스팸메일이나 햄으로 표시된 문자메시지의 집합으로 찾을 수 있다here.우선, 우리는 이 데이터 집합을 이용하여 예측 모델을 구축할 것이다. 이 모델은 어떤 텍스트가 스팸메일이고, 어떤 텍스트가 스팸메일이 아닌지 정확하게 분류한 다음에 이 모델을 저장하여 나중에 예측할 수 있도록 할 것이다.
데이터 집합의 탐색
가장 먼저 해야 할 일은 의존항을 가져오는 것이다.라이브러리가 설치되어 있지 않으면 계속하기 전에 설치하십시오.
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_report
import joblib
import pickle
그런 다음 판다를 사용하여 데이터 세트를 로드합니다.df = pd.read_csv('https://raw.githubusercontent.com/paulwababu/datasets/main/spam.csv', encoding = 'latin-1')
print(df.head())
다음과 같이 필요 없는 열을 삭제합니다.df.drop(['Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4'], axis=1, inplace=True)
pandasmap () 함수를 사용하여 비수치열'spam'과'ham'을 수치로 변환해야 합니다df['label'] = df['v1'].map({'ham': 0, 'spam': 1})
그런 다음 피쳐 열(인수)과 대상 열(변수로 인한)을 분리해야 합니다.기능열은 우리가 그 중에서 예측하려고 하는 열이고 목표열은 우리가 예측하려고 하는 값을 포함하는 열이다.
X = df['v2']
y = df['label']
ML 모델 구성
이제 우리의 실제 모델을 구축하기 시작합시다.
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)
model = MultinomialNB()
model.fit(X_train,y_train)
#model.score(X_test,y_test)
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
precision recall f1-score support
0 0.99 0.99 0.99 1587
1 0.93 0.92 0.92 252
accuracy 0.98 1839
macro avg 0.96 0.95 0.96 1839
weighted avg 0.98 0.98 0.98 1839
소박 베일러 분류기는 실현하기 쉬울 뿐만 아니라 좋은 결과를 제공했다.위 코드에서, 우리는 벡터화 함수를 만들었는데, 이 함수는 전체 텍스트에 나타나는 모든 단어의 주파수 (계수) 에 따라 주어진 텍스트를 벡터로 변환한다.그리고 우리는 계속해서 데이터를 훈련과 테스트 변수로 나누고 이러한 변수를 사용하여 모델의 분류 보고서를 얻는다.그리고 우리는 다항식 소박 베일스 모델이라고 부른다. 이 모델은 이산적 특징을 가진 분류(예를 들어 텍스트 분류의 글자수)에 적용된다.
모형과 벡터의 지속성.
모델에 대한 교육을 실시한 후에 우리는 더 이상 교육을 필요로 하지 않는 상황에서 모델을 보류하여 장래에 사용할 수 있는 방법이 있어야 한다.이를 위해서는 나중에 사용할 수 있도록 모델을 저장해야 한다.다음 코드 행을 추가합니다.
# Save the model
joblib_file = "MultinomialNaiveBayesModel.joblib"
joblib.dump(model, joblib_file)
이전에 만든 벡터화 함수를 저장해야 합니다. 그렇지 않으면 벡터화기가 만들어지면 벡터화 함수의 생명주기 이후에 존재하지 않기 때문에 버릴 것입니다.# Save the vectorizer
vec_file = 'MultinomialNaiveBayesModelVectorizer.pickle'
pickle.dump(cv, open(vec_file, 'wb'))
만약 우리가 모델을 다시 훈련하려고 한다면, 우리는 모델이 시간에 따라 퇴화하는 상황에서 모델을 계속 개선할 수 있도록 부분적인 의합 함수를 사용할 수 있다.잠시 후 나는 블로그를 발표하여 오류를 어떻게 식별하고 바로잡는지 토론할 것이다dataset shift in machine learning스팸 분류기를 Django 웹 응용 프로그램으로 변환
이전 절에서, 우리는 SMS 메시지 분류 모델을 훈련하고 저장했다. 우리는 웹 응용 프로그램을 개발할 것이다. 이 응용 프로그램은 간단한 웹 페이지로 구성되어 있으며, 그 중에는 메시지를 입력할 수 있는 폼 필드가 포함되어 있다.웹 프로그램에 메시지를 제출하면 스팸메일이나 비스팸메일의 결과를 제공하는 새 페이지에 이 메시지를 보여 줍니다.
다음은 최종적으로 실현된 스냅샷이다
파이썬의 최선의 실천에 따라 프로젝트를 위한 가상 환경을 만들고 필요한 패키지를 설치할 것입니다.
먼저 프로젝트 디렉토리를 만듭니다.
$ mkdir djangoapp
$ cd djangoapp
이제 가상 환경을 만들고 필요한 패키지를 설치합니다.macOS 및 Unix 시스템의 경우:
$ python3 -m venv myenv
$ source myenv/bin/activate
(myenv) $ pip install django requests numpy joblib scikit-learn
Windows의 경우:$ python3 -m venv myenv
$ myenv\Scripts\activate
(myenv) $ pip install django requests numpy joblib scikit-learn
Django 응용 프로그램 설정
우선, 우리가 만든 디렉터리djangoapp로 이동하여 Django 프로젝트를 만듭니다.
(myenv) $ django-admin startproject mainapp
이렇게 하면 프로젝트 프레임에 대한 파일이 자동으로 생성됩니다.mainapp/
manage.py
mainapp/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
현재, 새로 만든 디렉터리 (관리자.py와 같은 디렉터리에 있는지 확인하기) 로 이동하여 프로그램 디렉터리를 만듭니다.(myenv) $ python manage.py startapp monitor
이렇게 하면 다음이 작성됩니다.monitor/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
주 프로그램/설정에 있습니다.py 파일, 다음 줄을 찾아서 우리가 방금 만든 프로그램을 추가합니다.INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'monitor', #new line
]
모니터 디렉터리에 있는 다음templates라는 새 디렉터리를 만들고 URL이라는 새 파일을 만듭니다.피야.모니터 프로그램의 디렉터리 구조는 다음과 같아야 한다monitor/
__init__.py
admin.py
apps.py
migrations/
templates/
__init__.py
models.py
tests.py
urls.py
views.py
mainapp/URL을 확인하십시오.py 파일, 모니터링 응용 프로그램 URL을 추가하여 다음 모니터링 응용 프로그램에서 작성할 URL을 포함합니다.from django.contrib import admin
from django.urls import path, include
urlpatterns = [
#path('admin/', admin.site.urls),
path('', include('monitor.urls')),#monitor app url
]
이제 모니터/URL에 있습니다.py 파일, 거기에 우리 사이트를 추가:from django.urls import path
from .views import *
urlpatterns = [
path('', views.sms, name = 'sms'),
path('inbox/', views.inbox, name='inbox')
]
기계 학습 모형을 저장하기 위해 다른 디렉터리를 만듭니다.나는 또한 전체 데이터 집합을 실현하고자 하는 사람들을 위해 데이터 집합을 프로젝트에 추가할 것이다.데이터 폴더를 강제로 만들지 않습니다.벡터 파일과 우리가 전에 만든 joblib 파일을 ml/model 폴더로 이동하는 것을 확보하십시오(venv)$ mkdir ml
(venv)$ mkdir ml/models
(venv)$ mkdir ml/data
우리는 Django에게 우리의 기계 학습 모형과 벡터 파일의 위치를 알려야 한다.이러한 행을 설정에 추가합니다.py 파일:import os
MODELS = os.path.join(BASE_DIR, 'ml/models')
응용 프로그램으로 모형과 벡터를 불러옵니다.py
응용 프로그램에 기계 학습 모형과 벡터를 불러옵니다.따라서 프로그램이 시작될 때 훈련을 받은 모델을 한 번만 불러옵니다.그렇지 않으면 노드를 호출할 때마다 훈련된 모델을 불러오고 응답 시간이 느려집니다.
응용 프로그램을 업데이트합시다.py
import os
import joblib
from django.apps import AppConfig
from django.conf import settings
class ApiConfig(AppConfig):
name = 'api'
MODEL_FILE = os.path.join(settings.MODELS, "MultinomialNaiveBayesModel.joblib")
model = joblib.load(MODEL_FILE)
class VectorizerConfig(AppConfig):
name = 'api2'
MODEL_FILE = os.path.join(settings.MODELS, "MultinomialNaiveBayesModelVectorizer.pickle")
model = joblib.load(MODEL_FILE)
모델을 편집합니다.py
분류 모델을 저장하는 데이터베이스 모델을 만듭니다.모니터/모형에 있습니다.py 파일:
from django.db import models
# Create your models here.
class Monitor2(models.Model):
message = models.CharField(max_length=50, blank=True, null=True)
SPAM = 1
HAM = 0
IS_SPAM_OR_NAH = [(SPAM, 'spam'), (HAM, 'not_spam')]
messageClassified = models.IntegerField(choices=IS_SPAM_OR_NAH, null=True)
contact = models.CharField(max_length=50, blank=True, null=True)
뷰를 편집합니다.py
이러한 관점은 주로 두 가지 임무를 맡을 것이다.
import os
from datetime import datetime
from .models import *
from django.shortcuts import render, redirect
def sms(request):
if request.method == 'POST':
number = request.POST['contact']
message = request.POST['message']
# datetime object containing current date and time
now = datetime.now()
now = now.strftime("%d/%m/%Y %H:%M:%S")
naiveModel = ApiConfig.model
naiveVect = VectorizerConfig.model
convertString = str(message)
message = convertString
data = [message]
vect = naiveVect.transform(data).toarray()
my_prediction = naiveModel.predict(vect)
print(my_prediction)
saveNow = Monitor2(
message=message,
messageClassified=my_prediction,
contact=number
)
saveNow.save()
return render(request, 'sms.html')
#inbox view
def inbox(request):
dataSaved = Monitor2.objects.all()
data = {
"dataSaved": dataSaved,
}
print(data)
return render(request, 'inbox.html', data)
모니터/templates 폴더에 sms를 만듭니다.html과 수신함.html 웹 페이지 및 다음 행을 추가합니다.모니터링/템플릿/문자 메시지html 파일:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form id="myform" method="POST">
{% csrf_token %}
<div class="row">
<div class="col-6 form-group">
<input type="text" name="name1" class="form-control p-4" placeholder="Your Name" required="required">
</div>
<div class="col-6 form-group">
<input type="text" name="contact" class="form-control p-4" placeholder="Your Contact" required="required">
</div>
</div>
<div class="form-group">
<textarea class="form-control py-3 px-4" name="message" rows="5" placeholder="Message" required="required"></textarea>
</div>
<div>
<button class="btn btn-primary py-3 px-5" type="submit">Send Message</button>
</div>
</form>
</body>
</html>
모니터링/템플릿/받은 편지함.html 파일:<!DOCTYPE html>
<html>
<style>
table, th, td {
border:1px solid black;
}
</style>
<body>
<h2>A basic HTML table</h2>
<table style="width:100%">
<tr>
<th>#</th>
<th>From</th>
<th>Body</th>
<th>Classification</th>
</tr>
{% for x in dataSaved %}
<tr>
<td>{{ loop.index }}</td>
<td>{{ x.contact }}</td>
<td>{{ x.message }}</td>
{% if x.messageClassified == 1 %}
<td>Spam</td>
{% else %}
<td>Non Spam</td>
{% endif %}
</tr>
{% endfor %}
</table>
</body>
</html>
필요한 마이그레이션을 수행합니다.(myenv) $ python manage.py makemigrations
(myenv) $ python manage.py migrate
(myenv) $ python manage.py runserver
그것이 유효한지 테스트하세요!
찾아보기http://127.0.0.1:8000 및 스팸 및 비스팸으로 양식 작성
http://127.0.0.1:8000/inbox 로 이동하여 기밀 데이터를 보십시오!다음은 제가 실현한 스냅 사진입니다. 죄송합니다. 제가 CSS를 만들 수 없습니다.(
시청해 주셔서 감사합니다!
Reference
이 문제에 관하여(파이톤으로 스팸메일 필터 모델 개발 및 Django 배치), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/paulwababu/develop-a-spam-filtering-model-in-python-deploy-it-with-django-2pco텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)