Сквозной проект НЛП до развертывания

Согласно статье в Forbes, мы производим около 2,5 квинтиллионов байтов данных каждый день, и в следующие пять лет эти цифры увеличатся до 5 раз. Из этого огромного количества данных почти 90% данных без ярлыков и бесполезны. Это бесполезно, потому что мы не знаем, как им пользоваться. Здесь выступают специалисты по анализу данных и эксперты по машинному обучению. Специалист по данным имеет все возможности преобразовать эти непригодные для использования данные в какую-либо полезную форму, чтобы каждый мог их понять.

Одна из огромных частей этих данных - это текстовые данные, будь то отзывы, сообщения, жалобы и т. Д. В настоящее время одной из основных задач является разработка какой-то техники, с помощью которой мы могли бы легко классифицировать данные и лучше их понимать. А вот роль Обработка естественного языка. Обработка естественного языка позволяет нам очень хорошо понимать текстовые данные. Это дает нам возможность классифицировать текст по разным категориям. Если вы занимаетесь компьютерными науками, вам необходимо очень хорошо изучить эти вещи и их концепции.

Не ждите подходящего времени, когда вы начнете, это время станет для вас подходящим временем.

Когда вы начинаете изучать и входить в область ИИ, вы часто будете видеть множество руководств и блогов, объясняющих вам различные алгоритмы и методы, но вы вряд ли найдете блоги или учебники, которые научат вас концепциям с использованием какого-либо проекта. ну, я не из всех этих людей.

В этом блоге мы собираемся реализовать классификатор спама с нуля. Сначала мы обучаем нашу модель, затем тестируем нашу модель, а после этого, используя flask и journal HTML и CSS, мы создаем веб-приложение для нашей модели, а позже мы также собираемся развернуть его с помощью Heroku.

Итак, если мы ничего не знаем об обработке естественного языка, сначала прочитайте мой блог об этом.



Мы собираемся завершить наш проект в четыре этапа.

  1. Создание модели с использованием машинного обучения и НЛП
  2. Создание веб-приложения с помощью Flask и соединение его с моделью
  3. Зафиксировать проект в Github
  4. Разверните нашу модель с помощью Heroku

Перед началом работы Давайте сначала
настроим нашу среду

  1. Загрузить последнюю версию Python


2. Установите необходимые пакеты

все пакеты можно установить с помощью pip из cmd (терминала).

pip install pandas,numpy,scikit-learn,matplotlib,nltk,seaborn

3. Установите блокнот Jupyter.

pip install jupyter-notebook
jupyter notebook ## For running

Выполнив все три шага, приступим к работе над нашим проектом.

Откройте новую записную книжку в jupyter, выполните следующие действия.

1. Создание модели с использованием ML и NLP.

Импорт необходимых библиотек

import numpy as np ## scientific computation
import pandas as pd ## loading dataset file
import matplotlib.pyplot as plt ## Visulization
import nltk  ## Preprocessing our text
from nltk.corpus import stopwords ## removing all the stop words
from nltk.stem.porter import PorterStemmer ## stemming of words

NLTK: Natural Language Processing Toolkit - это библиотека Python, которая используется для выполнения всех задач NLP, таких как выделение стеблей, лемматизация или удаление стоп-слов и т. д.

Porter Stemmer: это тип стеммера, который используется для стемминга. Основание - это в основном метод преобразования слова в его корневое слово.
Пример: обучение → учиться

Набор данных

Набор данных, который мы собираемся использовать, представляет собой набор данных с открытым исходным кодом, доступный на Kaggle.

Набор данных: spam_ham_dataset.csv

О наборе данных

Набор данных содержит три столбца. Размер набора данных составляет около 5,65 МБ. Всего в нем около 5000 строк.

Столбцы

Ярлык: ветчина, спам
Текст: набор текста или электронных писем
Номер_метки: 0 для ветчины и 1 для спама.

Задача

Наша задача - создать модель машинного обучения, которая может точно предсказать, является ли электронное письмо спамом.

Загрузите наш набор данных в блокнот

df = pd.read_csv("spam_ham_dataset.csv")

EDA в наборе данных

print(data.shape)  ### Return the shape of data 
print(data.ndim)   ### Return the n dimensions of data
print(data.size)   ### Return the size of data 
print(data.isna().sum())  ### Returns the sum fo all na values
print(data.info())  ### Give concise summary of a DataFrame
print(df.head())  ## top 5 rows of the dataframe
print(df.tail()) ## bottom 5 rows of the dataframe

После выполнения вышеуказанного блока кода вы увидите, что в нашем наборе данных нет нулевых значений. Также следует отметить, что только один столбец нашего столбца имеет числовые значения, поэтому мы можем визуализировать только этот столбец.

Давайте визуализируем столбец label_num

Мы можем только визуализировать количество обеих категорий в столбце.

df["label_num"].value_counts().plot(kind="bar",figsize=(12,6))
plt.xticks(np.arange(2), ('Non spam', 'spam'),rotation=0);

На графике видно, что почти 3500 сообщений не относятся к спаму, а около 1500 - к спам-сообщениям.

Очистка текста

В любой задаче НЛП самый важный шаг - очистить текст. очистка текста означает удаление всех знаков препинания, удаление игнорируемых слов, выполнение выделения корней, лемматизацию и преобразование текста в векторы.

import re
corpus = []
length = len(df)
for i in range(0,length):
    text = re.sub("[^a-zA-Z0-9]"," ",df["text"][i])
    text = text.lower()
    text = text.split()
    pe = PorterStemmer()
    stopword = stopwords.words("english")
    text = [pe.stem(word) for word in text if not word in set(stopword)]
    text = " ".join(text)
    corpus.append(text)
print(corpus)

Пояснение:

Строка 1: мы импортируем библиотеку re, которая используется для выполнения регулярных выражений в python.
Строка 2: Определите пустой список корпуса, который можно использовать для хранения всего текста после очистки.
Строка 3: инициализация длины переменной длины фрейма данных.
Строка 4: выполнение цикла от 0 до длины нашего фрейма данных.
Строка 5: удаление всех символов, кроме нижнего алфавита, больших алфавитов, и цифры.
Строка 6: преобразование текста в нижний.
Строка7: разделение текста пробелами.
Строка 8: создание объекта стеммера портера.
Строка9: инициализация всего стоп-слово в английском словаре для var stopword
Строка 10: Запуск цикла по длине предложения, а затем для каждого слова в предложении проверка его в стоп-слове, и если оно не находит в стоп-слове, примените Stemming к текст и добавьте его в список.
Строка 11: просто объединение всех слов в предложение
Строка 12: добавление предложения в список корпуса
Строка 13: печать список корпуса.

Следующим шагом в процессе очистки является преобразование списка предложений (корпуса) в векторы, чтобы мы могли передать эти данные в нашу модель машинного обучения. для преобразования текста в векторы мы собираемся использовать набор слов, который будет преобразовывать текст в двоичную форму ».

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(max_features=35000)
X = cv.fit_transform(corpus).toarray()

Строка 1: мы импортируем CountVectorizer из sklearn.
Строка 2: создание объекта для векторизатора подсчета с максимальными характеристиками как 35000 означает, что мы выбираем только верхние 35000 столбцов.
Строка 3: Использование CV мы подгоняем корпус и тоже преобразуем его в векторы.

Сброс резюме для использования в будущем

Для прогнозирования новых писем нам нужно сохранить как нашу модель, так и векторизатор подсчета.

import pickle ## importing pickle used for dumping models
pickle.dump(cv, open('cv.pkl', 'wb')) ## saving to into cv.pkl file

Моделирование и обучение

Разделение данных на наборы для обучения и проверки с помощью train_test_split

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = 0)
##train size 80% and test size 20%

Создание модели с помощью MultinomialNaiveBayes

from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB()

Подгонка модели под тренировочные наборы

model.fit(X_train, y_train)

Прогноз

y_pred=model.predict(X_test)
y_pred

Оценка модели

мы собираемся оценить нашу модель, используя матрицу путаницы и показатель точности.

from sklearn.metrics import confusion_matrix,accuracy_score
cm = confusion_matrix(y_test, y_pred)
score = accuracy_score(y_test,y_pred)
print(cm,score*100)

OutPut:

[[716  16]
 [ 18 285]] 96.71497584541063

Отлично, точность составляет 96,71%

Сохранение нашей модели

Для сохранения модели воспользуемся рассолом.

import pickle
pickle.dump(model, open("spam.pkl", "wb"))

Теперь давайте протестируем нашу модель сохранения, загрузив ее и проверив на тестовых данных.

loaded_model = pickle.load(open("spam.pkl", "rb"))
loaded_model.predict(X_test)
loaded_model.score(X_test,y_test)
#####OUTPUT######
96.71497584541063

Прогноз для нового письма

def new_review(new_review):
  new_review = new_review
  new_review = re.sub('[^a-zA-Z]', ' ', new_review)
  new_review = new_review.lower()
  new_review = new_review.split()
  ps = PorterStemmer()
  all_stopwords = stopwords.words('english')
  all_stopwords.remove('not')
  new_review = [ps.stem(word) for word in new_review if not word in   set(all_stopwords)]
  new_review = ' '.join(new_review)
  new_corpus = [new_review]
  new_X_test = cv.transform(new_corpus).toarray()
  new_y_pred = loaded_model.predict(new_X_test)
return new_y_pred
new_review = new_review(str(input("Enter new review...")))
if new_review[0]==1:
  print("SPAM")
else :
  print("NOT SPAM")

Попробуйте запустить приведенный выше код и введите случайное электронное письмо и проверьте, насколько правильно наша модель будет определять, будет ли спам или нет.

Enter new review...
IMPORTANT - You could be entitled up to £3,160 in compensation from mis-sold PPI on a credit card or loan. Please reply PPI for info or STOP to opt out. 
SPAM
Enter new review...
hi scott, i was wondering you have submitted your project or not
NOT SPAM

2. Создание веб-приложения с использованием фляги и соединение его с моделью.

Итак, чтобы создать веб-приложение, давайте сначала подготовим структуру папок, как показано ниже.

email_spam(root)
    |____templates
            |___index.html  ## homepage file
            |___result.html ## to show prediction
    |____static
            |____style.css  ## css file 
    |____app.py  ## main flask file
    |_____spam.pkl ## ml model
    |______cv.pkl  ## count vectorizer

Index.html:
создайте поле ввода для пользователей, чтобы вводить новые электронные письма, и кнопку для отправки текста на сервер.

result.html:
по вашему желанию, хотите ли вы показывать гифку или просто текст или и то, и другое вместо СПАМА и НЕ СПАМА.

style.css
- это файл css, который используется для улучшения внешнего вида веб-страницы. Вам решать, просто проектировать по своему усмотрению.

Вы всегда можете скачать и использовать мои шаблоны и статический каталог из моей учетной записи Github.



app.py:

Теперь давайте запустим наш код на наш локальный хост

Откройте CMD и перейдите в корневую папку (email_spam), а затем запустите app.py, используя python app.py, тогда вы увидите такое сообщение👇

Просто откройте URL-адрес (http://127.0.0.1:5000/) в любом браузере и протестируйте веб-приложение, используя новые случайные электронные письма.

3. Зафиксируйте проект на Github.

Перед тем, как передать проект на Github, мы также создадим еще два файла.

1. Профиль: приложения Heroku включают файл Procfile, в котором указаны команды, выполняемые приложением при запуске.

web: gunicorn app:app

2. Requirments.txt: требования. txt используется для указания того, какие пакеты python необходимы для запуска проекта.

Flask==1.1.1
gunicorn==19.9.0
itsdangerous==1.1.0
Jinja2==2.10.1
MarkupSafe==1.1.1
Werkzeug==0.15.5
numpy>=1.9.2
scipy>=0.15.1
scikit-learn>=0.18
matplotlib>=1.4.3
pandas>=0.19

Теперь после этого перейдите в свою учетную запись Github и загрузите файлы, а затем выполните фиксацию в ветке.

Если вы не знаете, как это сделать, выполните следующие действия.

4. Разверните модель с помощью Heroku.

Посетите Heroku и создайте бесплатную учетную запись, а затем войдите в свою учетную запись.

После входа в систему создайте новое приложение и подключите его к Github, после чего выполните развертывание вручную. вы увидите URL-адрес, который используется для доступа к вашему приложению.

если вы не знаете, как это сделать, просто следуйте инструкциям на картинке.

Вы можете найти весь исходный код в моем профиле Github Abhayparashar31

Спасибо за чтение😃

об авторе

Я Абхай Парашар, любитель питонов, увлеченный искусственным интеллектом. Я изучаю информатику. писатель-энтузиаст и программист. Я публикую статьи о питоне, машинном обучении, НЛП и многом другом, связанном с ИИ. Я также публикую разные виды сквозных проектов по машинному обучению.

Будущие чтения