Лучший способ изучать науку о данных - это делать это, и другой альтернативы нет. В этом посте я собираюсь отразить свои знания о том, как я разработал модель машинного обучения, которая может классифицировать обзоры фильмов как положительные или отрицательные, и как я встраиваю эту модель в веб-приложение Python Flask. Конечная цель - реализовать проект от начала до конца. Я твердо уверен, что в конце этого поста вы будете вооружены всеми необходимыми навыками, необходимыми для встраивания модели машинного обучения в веб-приложение. Я наткнулся на этот конец, чтобы работать над книгой Машинное обучение Python: машинное обучение и глубокое обучение с Python, scikit-learn и TensorFlow, 2-е издание »[1] Себастьяна Рашки и Вахида Мирджалили. Я считаю эту книгу отличным вложением в свой путь к науке о данных, и я рекомендую вам попробовать эту книгу.

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

Пристегнись, это будет потрясающее путешествие: D

Этот пост состоит из двух основных частей

  1. Разработка классификатора обзоров фильмов (этот пост)
  2. Разработайте веб-приложение Python Flask и интегрируйте классификатор обзоров фильмов (скоро выйдет!)

Разработать классификатор обзоров фильмов

Я установил свою среду разработки в Paperspace, который является поставщиком облачной инфраструктуры (могут быть другие применения, но я использую только в качестве PaaS), который предоставляет вычислительные мощности на основе графического процессора для разработки моделей машинного обучения и глубокого обучения. Я создал отдельную папку проекта Анализ настроений в выбранном мной месте. Это корневой каталог проекта.

Загрузить данные обзоров фильмов

Сначала давайте загрузим необходимые данные фильма. Я создал отдельный файл «download_data.ipynb». Это загрузит и извлечет обзоры фильмов в папку data. Перейдя в папку «data», вы увидите папку с именем «acllmdb». Внутри папки acllmdb есть папки train и test. Папки «train» и «test» содержат две подпапки с именами «pos», которые содержат положительные отзывы, и «neg», содержащие отрицательные отзывы (Изображение [1]).

Обратите внимание, что эти обзоры в папках «pos» и «neg» представлены в виде текстовых файлов. Чтобы мы могли легко обрабатывать данные и манипулировать ими, наш следующий шаг - создать фрейм данных Python Pandas.

Создание фрейма данных Pandas из текстовых файлов

Вышеупомянутый сценарий создает фрейм данных Pandas 'df', который содержит обзоры фильмов из текстовых файлов из подкаталогов 'pos' и 'neg' в папках 'train' и 'test' (этот шаг займет около 10– 20 минут в зависимости от производительности вашего ПК). Если отзыв о фильме положительный, мы помечали оценку как «1», а если она была отрицательной, - как «0». В нашем фрейме данных «df» у нас есть два столбца: столбец «обзор», который содержит обзор в виде текстовых строк, и столбец «тональность», который содержит тональность обзора как «1» или «0» в зависимости от положительность и отрицательность настроения. Изображение [2] содержит первые пять строк фрейма данных «df».

На изображении [2] мы можем видеть только положительные отзывы о фильмах. Причина в том, что когда мы создавали фрейм данных, функция упорядочивала обзоры в отсортированном порядке. Чтобы мы могли лучше и эффективнее обрабатывать данные, нам необходимо рандомизировать порядок обзоров фильмов (т. Е. Мы должны видеть «0» и «1» неравномерно, без сортировки). Для этого мы можем использовать встроенные функции «permutation» и «random» библиотеки NumPy.

Произвести случайное изменение фрейма данных и сохранить как файл CSV

Как вы видите на изображении [3], теперь у нас есть случайный фрейм данных, и мы сохранили данные в CSV-файл с именем «movie_data.csv».

Очистка текстовых данных

«Обзор» в нашем фрейме данных содержит текст. Чрезвычайно важно очень внимательно посмотреть на этот текст. Давайте продолжим и визуализируем последние 999 символов из фрейма данных, который мы подготовили на предыдущем шаге.

Очевидно, что столбец «обзор» содержит разметку HTML. Такая разметка не добавляет к отзывам никакой полезной информации. Итак, как часть процесса очистки текста, мы должны убедиться, что удалили эту нежелательную пометку, прежде чем использовать эти обзоры для разработки модели.

Хотя разметка HTML не содержит много полезной семантики, знаки препинания могут представлять полезную дополнительную информацию в контексте НЛП. Для простоты удалим знаки препинания, за исключением таких смайлов, как :), поскольку эти смайлы, безусловно, полезны для семантического анализа. Для выполнения этой задачи мы будем использовать регулярные выражения (regex) Python.

Эти обзоры - огромный кусок слов. Чтобы мы могли анализировать отзывы, нам нужно разбить их на отдельные элементы. В контексте НЛП этот процесс известен как токенизация [2]. Существуют различные методы токенизации данной текстовой строки. Самый простой способ - использовать split () во встроенной функции Python. Ниже приводится простая иллюстрация использования функции split () для токенизации набора строк для их отдельных элементов, как показано на рисунке [5].

На изображении [5] вы можете видеть, что мы успешно разметили текст по отдельным элементам. В результате мы видим, что слова бег и бег. В НЛП есть метод преобразования слов в их корневую форму. Этот прием называется « корень слова » [3]. Портер Стеммер [4] довольно популярен среди исследователей в области НЛП. В приведенном ниже фрагменте кода вы можете увидеть, как мы можем использовать PorterStemmer пакета NLTK для получения корневой формы слов (Изображение [6).

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

Еще одна важная концепция на этапе очистки и предварительной обработки данных - это концепция, известная как удаление стоп-слова. Стоп-слова - это слова, которые обычно встречаются во всех формах текстов и, вероятно, не несут никакой полезной информации. Несколько стоп-слов: is, и, has, are, have , like… Удаление стоп-слова делает наш механизм обработки текста эффективным, так как сокращает количество слов, которые нам нужно анализировать. Python NLTK предоставляет эффективный механизм для удаления стоп-слов из заданного текстового корпуса. Вы можете обратиться к приведенному ниже фрагменту кода и изображению [7], чтобы получить представление о механизме удаления стоп-слов.

Примечание. В приведенном выше фрагменте кода мы использовали функцию tokenizer_porter, которая была определена в предыдущем фрагменте кода.

Как показано на изображении [7], пакет "стоп-слов" удалил наиболее часто встречающиеся слова, такие как "a", "и". Это уменьшит размер нашего «мешка слов» (который будет проиллюстрирован позже в этом посте) и, следовательно, сделает вычисления более эффективными.

К настоящему времени вы знаете ряд важных шагов по очистке текстовых данных.

  • удалить нежелательную разметку HTML (с помощью регулярных выражений)
  • токенизация (с помощью метода Python split ())
  • стебель (например, Porter Stemmer)
  • удаление стоп-слова (через стоп-слова NLTK)

Создание классификатора обзоров фильмов

Теперь, имея эти базовые знания, мы можем приступить к разработке классификатора настроений. Мы собираемся применить описанные выше шаги (кроме стемминга) к нашему созданному файлу movie_data.csv.

Есть два подхода к разработке классификатора. Один из них - использовать сразу весь набор данных или, другими словами, прочитать весь файл movie_data.csv сразу, создать набор для обучения и тестирования и подогнать под модель. Недостатком этого подхода является то, что нам необходимо иметь высокопроизводительный ПК / вычислительную мощность. Несмотря на то, что я использовал Paperspace, пробуя это руководство, мне потребовалось почти два часа, чтобы построить мой классификатор с этим подходом. Это очень обременительный опыт. Итак, в этом посте я перейду ко второму подходу.

При работе с большими объемами данных специалисты по машинному обучению используют алгоритмы онлайн-обучения. Точно так же в нашем случае мы также собираемся использовать один из алгоритмов онлайн-обучения, известный как внешнее обучение [5]. Проще говоря, здесь мы используем часть набора данных в определенный момент времени и создаем модель из этой части данных. Мы собираемся обновлять модель с каждой новой порцией данных, которую мы скармливаем. Следуя этому подходу, мы можем легко построить нашу модель с разумными временными рамками. Кроме того, мы собираемся определить ряд функций для выполнения следующих действий:

  • stream_docs - read_csv (по одному документу за раз)
  • get_minibatch - создать документ меньшего размера, добавив документы

и, наконец, создайте классификатор с использованием двух вышеуказанных функций. Вы можете обратиться к изображению [8] и приведенному ниже фрагменту кода, чтобы получить более полное представление о процессе построения классификатора.

Это все, что вам нужно для создания классификатора фильмов. Возможно, сейчас это может показаться немного сложным, поэтому позвольте мне показать вам код. При необходимости вы можете сослаться на Изображение [8].

Согласно изображению [8], наш первый шаг - прочитать файл csv, который мы создали в самом начале. В приведенном выше фрагменте кода строка №16 читает файл csv. Он читает одну строку (документ) за раз, и этот документ затем передается (строка 53) функции get_minibatch () для создания мини-документа. Мы создаем мини-документ, пока размер мини-документа не достигнет 1000 (строка №53). После того, как этот мини-пакет создан внутри функции get_minibatch (), он возвращает мини-пакет для дальнейшей обработки (от строки № 36 до строки № 53). Мы используем этот мини-пакет и создаем переменные обучающего набора X_train и y_train.

Эта переменная X_train затем передается для создания пакета слов (строка № 56). Поскольку мы используем метод внепрограммного обучения, мы использовали HashingVectorizer от scikit-learn. HashingVectorizer отвечает за создание пакета слов. При создании пакета слов он выполняет предварительную обработку над X_train,, который содержит обзоры фильмов, и удаляет ненужную разметку HTML при удалении стоп-слов ( или часто встречающиеся слова, которые не добавляют никакой ценности нашему текстовому корпусу, такие как 'a', 'like' 'is' и т. д.) (строка № 49 и строка № 38–44).

Мы инициализировали HashingVectorizer функцией tokenizer и установили количество функций на 2 ** 21. Кроме того, мы повторно инициализировали классификатор логистической регрессии, установив для параметра loss в SGDClassifier значение 'log '. Причина выбора большого количества функций в HashingVectorizer заключается в том, чтобы уменьшить вероятность возникновения хэш-коллизий при увеличении количества коэффициентов в модели логистической регрессии.

Используя цикл for (строка № 52), мы перебирали 45 мини-пакетов документов, каждый из которых состоит из 1000 документов. Завершив процесс инкрементального обучения, мы будем использовать 5000 документов для оценки эффективности нашей модели. Ниже я привел фрагмент кода для генерации тестового набора и расчета точности. Это в значительной степени говорит само за себя :) (вы можете обратиться к приведенному выше подробному объяснению, чтобы углубить свое понимание).

Мы видим, что наша модель показала точность 86,7%, что вполне нормально. К настоящему времени мы завершили наиболее важный шаг, следующим шагом будет сохранение этой модели для использования в будущем. В противном случае нам нужно выполнить все эти шаги снова, чтобы добраться до этой точки. Не закрывайте текущий сеанс Python.

PS: Наш файл csv содержит 50 КБ записей, мы используем 45 КБ в качестве обучающего набора и 5 КБ в качестве тестового набора. Вы можете использовать функцию Pandas «info», чтобы увидеть количество записей в нашем csv.

Для нас будет довольно беспокойной задачей обучать нашу модель каждый раз, когда мы завершаем сеанс Python. Итак, мы собираемся сохранить обученный и построенный классификатор. Для этой цели мы используем встроенный в Python модуль pickle, который позволяет нам сериализовать и десериализовать объекты Python для сжатия байтового кода. Мы можем сразу же перезагрузить эти объекты, когда захотим классифицировать новые образцы.

В приведенном выше сегменте кода мы создали папку с именем movieclassifier и подкаталог pkl_objects для сохранения сериализованных объектов Python. Метод dump сериализует обученную модель логистической регрессии, а также стоп-слово, установленное из библиотеки NLTK. Я рекомендую вам прочитать Документацию Python pickle [6], чтобы узнать больше о пакете (если я хочу объяснить здесь, это будет еще одна запись в блоге: D)

Наш следующий шаг - создать новый скрипт Python, который мы можем использовать для импорта векторизатора в существующий сеанс Python. Давайте продолжим и создадим новый скрипт Python, vectorizer.py в каталоге movieclassifier, который мы создали на предыдущем шаге.

Теперь, на этом этапе, мы должны иметь возможность использовать сериализованные объекты Python, которые мы создали, даже из нового сеанса Python (хлопот с обучением больше не будет! Уга !!!). Давайте продолжим и протестируем. Перейдите в папку «movieclassifier». Остановите текущий сеанс Python. Давайте начнем новый сеанс Python и посмотрим, сможем ли мы загрузить нашу модель с жесткого диска. Скрещенные пальцы !!!

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

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

Разработка веб-приложения Python Flask

Это будет Часть-2 этого сообщения. Я рекомендую вам познакомиться с разработкой веб-приложений Python Flask. Достаточно приличного количества Python Flask, чтобы следить за второй частью этого поста. Если вы новичок, то можете посмотреть серию Flask Web App Development от Traversy Media.

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

Предоставлено: Я хотел бы выразить огромную благодарность Себастьяну Рашке и Вахиду Мирджалили. Я многому научился у них и все еще учусь. Я никогда не думал, что книги могут быть отличным ресурсом для изучения программирования, поскольку я сильно полагался на онлайн-видеоуроки. Теперь я чувствую, что книги - тоже отличный способ обучения программированию, и для того, чтобы написать книгу, нужно приложить огромные усилия. Вы можете делать выделение, делать свои собственные заметки во время обучения. Это большой плюс, поэтому потратить деньги на книгу, которая вам нравится, - действительно большое вложение времени.

Использованная литература:

[1] https://www.amazon.com/Python-Machine-Learning-scikit-learn-TensorFlow/dp/1787125939
[2] https://nlp.stanford.edu/IR- book / html / htmledition / tokenization-1.html
[3] https://nlp.stanford.edu/IR-book/html/htmledition/stemming-and-lemmatization-1.html
[4] http://snowball.tartarus.org/algorithms/porter/stemmer.html
[5] https://simplyml.com/hunt-for-the-higgs-boson- using-out-of-core-machine-learning /
[6] https://docs.python.org/3/library/pickle.html