Категория > Новости > Нескучный Data Science. Пишем на языке R собственный детектор спама - «Новости»
Нескучный Data Science. Пишем на языке R собственный детектор спама - «Новости»17-07-2020, 20:03. Автор: Mansfield |
Работать в Data Science, как ты мог слышать, — престижно и денежно. В этой статье я познакомлю тебя с азами языка R, который используют в «науке о данных». Мы напишем так называемый наивный байесовский классификатор, который будет детектить в почте спам. Конструируя программу, ты увидишь, как сухая скучная математика может быть вполне наглядной и полезной. Ты сможешь написать и понять эту программу, даже если никогда не сталкивался ни с чем подобным. Сначала, впрочем, должен предупредить, что для полного понимания будет хорошо, если ты уже знаком с азами статических методов. Я, конечно, постараюсь изложить материал так, чтобы у вдумчивого читателя, незнакомого со статистикой, тоже был шанс вникнуть в тему, но теоретические основы статистики останутся за рамками этой статьи. Плюс я исхожу из того, что ты, с одной стороны, хорошо подкован в теории и практике программирования, разбираешься в алгоритмах и структурах данных, но, с другой стороны, еще не сталкивался с языком R. Я познакомлю тебя с ним в том объеме, которого тебе хватит, чтобы комфортно написать, запустить и понять первую программу. Знакомимся с языком R и готовим рабочее местоДля начала посмотрим, как установить R и как в нем запускать и отлаживать программы, как искать и устанавливать нужные библиотеки (в мире R они называются пакетами), как удобно искать документацию к разным функциям. Язык R чрезвычайно мощный в том, что касается обработки и анализа данных. Де-факто это стандарт в Data Science. Язык создан математиками-статистиками для математиков-статистиков. В нем, как и в других инструментах, предназначенных для наукоемких вычислений, самый ходовой тип данных — это вектор. Самая популярная структура данных в R — это data frame (срез данных). Срез данных представляет собой матрицу с атрибутами, которая по виду очень похожа на реляционную БД. IDE для R качай с официального сайта. Доступны версии для трех ОС: Linux, Mac и Windows. Установка должна пройти легко, но если что-то пойдет не так, попробуй первым делом заглянуть в FAQ. Теперь запускаем IDE. Выглядеть она будет примерно так. Подсветка синтаксиса здесь, конечно, так себе — вернее, ее вообще нет, — так что код можно спокойно писать в каком-нибудь другом редакторе, а IDE использовать только для запуска уже готового кода. Лично я пишу на R в онлайновом редакторе на rextester.com. Чтобы установить нужный пакет (библиотеку), используй функцию Р’РѕС‚ тебе для удобства СЃРєСЂРёРїС‚, который проверяет, установлены ли нужные тебе пакеты. Если какие-то РёР· РЅРёС… РЅРµ установлены, СЃРєСЂРёРїС‚ подгружает Рё устанавливает РёС…. Перепечатай Рё сохрани СЃРєСЂРёРїС‚ РІ файл
Скачиваем спамСначала давай подготовим наборы данных для тренировки и проверки будущего детектора. Предлагаю взять их из архива Apache SpamAssassin. По ссылке ты найдешь подборку писем, расфасованную по трем категориям: spam (собственно, спам), easy_ham (правомерные письма, которые легко отличить от спама), hard_ham (правомерные письма, которые тяжело отличить от спама). Создай в своей рабочей директории папку
РџРѕ папкам Как ты уже наверно догадался, письмами из папок Но почему тогда мы не создали папку Конструируем признакиТеперь, когда у нас есть исходные данные для тренировки и проверки, нам нужно «сконструировать признаки», которые наш детектор будет выискивать в сырых текстовых файлах с письмами. Умение конструировать признаки — один из базовых навыков в Data Science. Залог успеха здесь — профессиональная интуиция, которая приходит с годами практики. Компьютеры пока еще не могут делать эту работу автомагически, вместо нас. И, скорее всего, никогда не смогут. С другой стороны, компьютеры могут облегчить нашу работу по конструированию признаков. В частности, у R есть пакет tm (от слов Text Mining), предназначенный для анализа текстов. С его помощью мы подсчитаем, какие слова чаще всего встречаются в спаме и в не-спаме, и будем использовать их частотность в качестве признаков. Современные детекторы спама делают значительно больше, чем подсчитывание частоты слов, но, как ты скоро убедишься, даже наш простенький детектор будет весьма неплохо отделять спам от не-спама. В основу нашего детектора положим наивный байесовский классификатор. Логика его работы такая: если видим слово, которое в спаме встречается чаще, чем в не-спаме, то кладем его в копилку спам-признаков. По такому же принципу формируем копилку признаков для не-спама. Как эти признаки помогут нам отделять спам от не-спама? Мы ищем в анализируемом письме оба вида признаков. Если в итоге получается, что признаков спама больше, чем признаков не-спама, значит письмо спамное, иначе — правомерное. Вычисляя вероятности того, спам ли наше письмо, мы не учитываем, что какие-то слова могут быть взаимозависимыми. Мы оцениваем каждое слово в отрыве от всех остальных слов. На статистическом сленге такой подход называется «статистической независимостью». Когда математики-статистики исходят из такого предположения, не будучи до конца уверенными в том, что оно здесь правомерно, они говорят: «Наша модель наивная». Отсюда и название: наивный байесовский классификатор, а не просто байесовский классификатор. Пишем функцию чтения писем из файловСначала подгружаем библиотеки, которые нам понадобятся, и прописываем пути к папкам, в которых хранятся файлы с письмами. Каждый отдельно взятый файл с письмом состоит из двух блоков: заголовок с метаданными и содержание письма. Первый блок отделен от второго пустой строкой (это особенность протокола электронной почты описана в RFC822). Метаданные нам не нужны. Нас интересует только содержимое письма. Поэтому напишем функцию, которая считывает его из файла с письмом. Что мы тут делаем? В языке R файловый ввод/вывод осуществляется точно так же, как и в большинстве других языков программирования. Функция Обрати внимание, здесь мы используем кодировку Latin-1. Зачем? Потому что во многих письмах есть символы, которых нет в кодировке ASCII. Функция После того как мы прочитали из файла все строки, ищем первую пустую, а затем извлекаем все строки после нее. Результат помещаем в вектор Наконец, сворачиваем весь вектор Считываем все письма со спамомСейчас создадим вектор, который будет содержать текстовые сообщения из всех спамных писем. Каждый отдельно взятый элемент вектора — это отдельное письмо. Зачем нам такой вектор? Мы будем с его помощью тренировать свой детектор. Сначала мы получаем список всех файлов из папки со спамом. Но там, помимо писем, еще хранится файл Чтобы создать нужный нам вектор, воспользуемся функцией Обрати внимание, здесь РјС‹ передаем РІ Готовим корпус текстов для спамных писемТеперь нам надо создать корпус текстов. С его помощью мы сможем манипулировать термами в письмах (в корпусной лингвистике составные части текста, в том числе слова, называют термами). Зачем нам это? Чтобы сконструировать признаки спама для нашего детектора. Технически это значит, что нам надо создать терм-документную матрицу (TDM), у которой ![]() Функция Пакет РќРѕ прежде чем конструировать РєРѕСЂРїСѓСЃ, РјС‹ должны сказать пакету Как видишь, РјС‹ здесь используем четыре опции.
Перейти обратно к новости |