Примечание. Вы можете получить актуальный код на моем Github: https://github.com/Tacosushi/Twitter-Sentiment-Naive-Bayes/
Также посетите мой личный сайт: koshu.me

Обзор части 1:

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

Из-за множества существующих онлайн-ресурсов, описывающих, что такое Наивный Байес, в этом посте я планирую продемонстрировать один метод его реализации для создания: Двоичного анализа тональности текстов Twitter, но это легко сделать. применяется к нескольким классификациям. За основу я беру: https://github.com/christian1741/Twitter-Sentiment-Analysis

Общие шаги, которые я предпринимаю для завершения этого проекта:

  1. Получите twitter API и загрузите Tweepy, чтобы получить доступ к twitter api через python
  2. Загрузите данные твита в Твиттере в зависимости от ключевого слова для поиска «счастливый» или «грустный».
  3. Отформатируйте мои твиты так, чтобы в них не было заглавных букв, знаков препинания или символов, отличных от ascii, а также разделите твит на массив, содержащий каждое слово в отдельном держателе.
  4. Создайте набор общих слов, которые будут появляться в моих твитах
  5. Составьте частотную таблицу слов, которые имеют положительные и отрицательные результаты
  6. Протестируйте мою таблицу частот, используя тестовые предложения

Реализация части 2:

Шаг 1 (получение ключа Twitter API и установка Tweepy):

Чтобы использовать API Twitter, нам нужно сначала создать учетную запись Twitter. После этого мы заходим на apps.twitter.com и создаем приложение.

После этого перейдите в «Ключи и токены доступа» и получите свой ключ API и секрет (скопируйте и сохраните их на будущее).

Затем перейдите и создайте свой токен доступа (вы найдете его, прокрутив вниз), а затем сохраните свой токен доступа и секрет токена доступа.

Эти коды позволят нам получить доступ к API твиттера через Python. Это в значительной степени ключ, необходимый для доступа к базе данных твиттера.

После этого установите «Tweepy» с помощью сценария «pip install Tweepy» в вашем терминале. Tweepy позволяет нам легче взаимодействовать с твиттером.

Шаг 2 (Получение ваших данных):

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

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

Однако, поскольку доступ к слишком большому количеству твитов за короткий промежуток времени будет ограничивать нашу программу (твиттер не может позволить нам использовать слишком много их возможностей), мы должны установить таймер того, насколько быстро мы хотим выполнять поиск по нашему запросу. Мы также устанавливаем ограничение на количество твитов, которые мы ищем. Я выбрал 15000.

Итак, первым шагом был импорт наших библиотек:

Затем мы вводим информацию о нашем токене доступа и аутентифицируем:

Если вы заметили в строке 20. В функции tweepy.API я указываю что-то под названием «wait_on_rate_limit_notify» и «wait_on_rate_limit» и устанавливаю для них значение True. По сути, это говорит моему сценарию не закрываться из программы, если меня задушил твиттер. Вместо этого сценарий будет ждать, пока дросселирование не прекратится, а затем возобновит выполнение остальной части моего сценария. В этом случае, если у меня будет достаточно времени (около 3 часов), мой скрипт сможет получить около 15000 обращений.

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

Далее мы просто повторяем и ищем наш термин запроса много раз:

В значительной степени я создаю массив под названием «текст», в котором я храню текстовые значения твита, и создаю индекс с именем secondcount, который подсчитывает, сколько «твитов» я храню. Я сделал это, потому что в строках с 74 по 85 я сделал так, чтобы я сохранял только тексты на английском языке, а не ретвиты.

Код работает, имея индекс пользователей в формате json. Таким образом, я могу получить доступ к данным для данного «пользователя», вызвав переменную user._json. Таким образом, указав text_value = user._json [‘text’], я могу получить текстовый файл от текущего пользователя, на которого я смотрю.

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

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

Затем я перенес свои массивы, в которых были твиты пользователей, преобразовал их в фрейм данных и сохранил их как файл csv, выполнив следующие действия:

Я выполнил указанную выше программу и использовал следующие термины:

1. # счастлив
2. # весело
3. # грустно
4.: (

Как мои ярлыки для чувств: счастливые и грустные чувства.

Шаг 3 (Очистка данных и получение появившихся слов):

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

Чтобы очистить данные, первое, что мы делаем, это импортируем все необходимые нам библиотеки и импортируем интересующий нас csv, а также избавляемся от любых значений «nan» (это делается в строке 10).

Затем мы создаем функцию, которая, учитывая текст, удаляет любой символ или строку символов, которые не читаются в значениях ASCII. Затем мы переводим все тексты в нижний регистр. Я использую df [‘text’], потому что это имя столбца, в котором я хранил текстовые значения в файле csv.

Df [‘text’]. Apply (lambda x: x.lower ()) в основном говорит нам применять функцию lambda x: x.lower к каждой строке в фрейме данных. (лямбда x: x.lower ()) просто утверждает, что при вводе «x» все символы в нем должны быть строчными.

Используя тот же формат, мы можем удалить любые нежелательные знаки препинания.

При этом наш фреймворк чистый.

Наша следующая цель - получить из него уникальные слова.

Строка 34 делает две вещи. Сначала он разбивает каждую строку в каждой строке фрейма данных на отдельные слова. Это делается путем разделения после каждого пробела. После этого «.stack (). Value_counts ()» находит новое / уникальное слово и подсчитывает, сколько раз оно встречается. Эти значения сохраняются в переменной, называемой «массив».

Строка 38 составляет словарь частоты, с которой появляется каждое уникальное слово, и того, что это за уникальное слово. Уникальная строка слова хранится в переменной array.index.

Строка 39 превращает словарь в фрейм данных.

Строка 42 затем проверяет каждое значение в столбце «частота» и заменяет любые значения, отличные от 10, на Nan.

Окончание сценария тогда выглядит так:

Моя цель в строке 45 состояла в том, чтобы удалить любую из строк со значением Nan.

Затем я отбросил все строки с ключевыми словами, показанными в строке 48, потому что я не хотел, чтобы в моей программе были слова, которые были слишком очевидны, потому что они включали слово, которое я искал.

Строка 51 преобразует фрейм данных в файл csv. Я повторил это для всех моих предыдущих файлов csv.

Шаг 4 (Получите пакет слов):

Теперь, когда у меня есть список слов, которые появляются в каждом отдельном файле (счастливый, веселый, грустный и: (), я хочу объединить их все в один фрейм данных и сохранить его в файл csv с именем wordbag.csv.

Как всегда, я начинаю с импорта библиотеки pandas.

Затем я читаю файлы csv со словами в сценарии.

Строка 11 затем объединяет все фреймы данных в один. Это то, что делает concat. После этого drop_duplicates избавляется от любого слова, которое встречается несколько раз. Я также сбросил index.

Строка 15 затем сохраняет это в файл wordbag.csv.

Причина, по которой мне нужен был набор слов, заключалась в том, чтобы я мог подсчитать частоту. Или, другими словами, я хотел увидеть, сколько из «счастливых» твитов упомянули данное слово из набора слов для всех слов. Я бы сделал то же самое для грустных, веселых и: (тоже.

В качестве примера я хочу создать что-то вроде следующего:

По сути, я хотел увидеть, что из счастливых твитов, сколько из них упомянули слово «я», и в данном случае это будет 20. Я бы сделал это для всех моих классификаторов и всех слов, которые были интересны мне. Слова, которые мне интересны, как вы знаете, - это набор слов, который мы создали.

Шаг 5 (разделите твиты на отдельные слова):

Чтобы нам было легче. Я вернулся к нашим файлам твитов (happy.csv, sad.csv, unsmile.csv и fun.csv) и сделал так, чтобы каждый столбец включал список слов, которые появились в твите в виде массива:

Таким образом, каждая строка представляет собой твит, а в текстовом столбце - массив слов, появившихся в твите.

Затем я сохраняю это как фрейм данных.

Как всегда, начнем с импорта панд.

Затем откройте фрейм данных и отбросьте все строки со значением «nan».

Затем я просто делаю то, что делал выше в части 3, чтобы очистить данные. Но на этот раз я сохранил фрейм данных как файл с именем «name_split.csv».

Шаг 5 (Создайте частотную таблицу):

Наш второй последний шаг - создать таблицу частот. Что касается того, почему мы хотим это сделать, обратитесь к: http://dataaspirant.com/2017/02/06/naive-bayes-classifier-machine-learning/

Итак, для начала мы импортируем библиотеки, которые будем использовать, и файлы, которые нам нужны. Здесь я импортирую модуль под названием sklearn, потому что эта библиотека поможет нам разделить наш фрейм данных на тестовый и обучающий набор.

Также импортируем список интересующих нас слов.

Строки 16–19 использовались для преобразования классификаторов «веселье» и «счастье» в положительное настроение, а классификаторы «неулыбчивый» и «грустный» - в отрицательное настроение.

Затем я добавил все данные в один большой фрейм данных, чтобы создать разделение на поезд / тест в строке 25.

Затем из набора обучающих данных я получаю свои положительные и отрицательные примеры.

Я пишу строку 35, чтобы иметь последний от 2 до последнего фрейм данных, с которым я хотел бы работать.

На данный момент у нас есть обучающий набор, в котором есть как положительные, так и отрицательные примеры.

Наша следующая цель - просмотреть банк слов и посмотреть, сколько положительных примеров содержит данное слово. Мы повторяем это для отрицательных примеров и делаем это для всех слов в нашем банке слов:

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

В каждом твите я вижу, сколько раз в нем встречается искомое слово. Если он больше 1, я добавляю 1 к своему счетчику.

Это позволяет мне видеть, сколько твитов содержало хотя бы один счетчик слов, которые я хотел.

Затем я сохраняю это значение в массиве под названием «положительный». Таким образом, у меня есть массив, который сообщает мне, сколько твитов содержало данное слово.

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

Шаг 5 (тестирование нашей наивной байесовской таблицы):

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

Как всегда, я начинаю с импорта pandas, numpy и таблицы, которую буду использовать.

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

Тест - это пример предложения, которое я планирую протестировать.

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

Затем я разбил тестовое предложение на отдельные слова. Затем я вернулся к нужным мне вероятностям, для которых вам придется проверить, как это делается.

Цикл for просматривает каждое слово в тестовом предложении и находит количество экземпляров, которые оно появляется в таблице частот, чтобы затем я мог вычислить свои вероятности.

Если вы помните, я хочу сравнить следующие вероятности:

Для счастливого случая: вероятность иметь счастливый случай * вероятность того, что слово 1 будет счастливым при условии, что предложение является счастливым * вероятность того, что слово 2 будет счастливым при условии, что предложение является счастливым * вероятность того, что слово n будет счастливым, при условии, что предложение является счастливым

В печальном случае я повторяю вышесказанное, но вместо этого заменяю счастливое на грустное.