Рубрики
Без рубрики

Как сделать свой собственный анализатор настроений, используя API Python и Google натурального языка

Автор оригинала: Dzaky Widya Putra.

Представьте себе, что вы являетесь владельцем продукта, который хочет знать, что люди говорят о вашем продукте в социальных сетях. Возможно, ваша компания запустила новый продукт, и вы хотите знать, как люди отреагировали на него. Возможно, вы захотите использовать интернет-анализатор, например Монкелеар или Talkwalker Отказ Но не было бы неплохо, если бы мы могли сделать наши собственные настроения Analyzer? Давайте сделаем это тогда!

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

Если это ваше впервые построение телеграммы бота, вы можете прочитать Это пост первый.

Начиная

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

Мы собираемся использовать Tweepy собрать данные Tweet. Мы будем использовать NLTK Чтобы помочь нам очистить твиты. Google натуральный язык API сделает анализ настроений. Python-Telegram-Bot отправит результат через Telegram Chat.

pip3 install tweepy nltk google-cloud-language python-telegram-bot

2. Получите ключи API Twitter

Чтобы иметь возможность собрать твиты из Twitter, нам нужно создать учетную запись разработчика, чтобы сначала получить ключи API Twitter.

Перейти к Разработчик Twitter Сайт и создайте учетную запись, если у вас нет одного.

Открыть Приложения Страница, нажмите «Создать приложение», заполните форму и нажмите «Создать».

Нажмите на вкладку «Клавиши и токенс», скопируйте клавишу API и секретный ключ API в разделе «Клавиши API потребителей».

Нажмите кнопку «Создать» в разделе «Token Token & Access Token Token». Скопируйте токен доступа и доступ к секрету доступа, которые были созданы.

Большой! Теперь у вас должна быть четыре ключа – ключ API, секретный ключ API, токен доступа и секрет токена доступа. Сохраните эти ключи для последующего использования.

3. Включить API Google натурального языка

Нам нужно включить API Google Natural язык сначала, если мы хотим использовать услугу.

Перейти к Консоль разработчиков Google и создать новый проект (или выберите тот, который у вас есть).

На панели инструментов проекта нажмите «Включить APIS и Services» и найдите API облачного натурального языка.

Нажмите «Включить», чтобы включить API.

4. Создание ключа учетной записи службы

Если мы хотим использовать службы Google Cloud, такие как Google Natural Language, нам нужен ключ учетной записи услуг. Это похоже на наши учетные данные для использования услуг Google.

Перейти к Консоль разработчиков Google , нажмите «Учетные данные» вкладку, выберите «Создать учетные данные» и нажмите «Ключ учетной записи службы».

Выберите «Учет службы службы по умолчанию приложений по умолчанию» и JSON в качестве типа клавиши, затем нажмите «Создать».

Есть файл .json, который будет автоматически загружен, назовите его Credsss.json Отказ

Установите Google_application_credentials С пути нашего Credsss.json Файл в терминале.

export GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Если все хорошо, то пришло время написать нашу программу.

Напишите программу

Эта программа соберет все твиты, содержащие определенное ключевое слово в последние 24 часа максимум 50 твитов. Затем он проанализирует настроения твитов один за другим. Мы вышлем результат (среднее значение настроения) через чат Telegram.

Это простой рабочий процесс нашей программы.

Давайте сделаем одну функцию для определения каждого потока.

1. Подключитесь к API Twitter

Первое, что нам нужно сделать, это собрать данные твитов, поэтому мы должны сначала подключиться к Twitter API.

Импортируйте Tweepy Library.

import tweepy

Определите ключи, которые мы генерировали ранее.

ACC_TOKEN = 'YOUR_ACCESS_TOKEN'
ACC_SECRET = 'YOUR_ACCESS_TOKEN_SECRET'
CONS_KEY = 'YOUR_CONSUMER_API_KEY'
CONS_SECRET = 'YOUR_CONSUMER_API_SECRET_KEY'

Сделать функцию под названием Аутентификация Для подключения к API с четырьмя параметрами являются все клавиши.

def authentication(cons_key, cons_secret, acc_token, acc_secret):
    auth = tweepy.OAuthHandler(cons_key, cons_secret)
    auth.set_access_token(acc_token, acc_secret)
    api = tweepy.API(auth)
    return api

2. Поиск в твитах

Мы можем искать твиты с двумя критериями, основанными на времени или количестве. Если он основан на времени, мы определяем интервал времени, и если он основан на количестве, мы определяем общие твиты, которые мы хотим собрать. Поскольку мы хотим собрать твиты из последних 24 часов с максимальными твитамими 50, мы будем использовать оба критерия.

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

from datetime import datetime, timedelta

today_datetime = datetime.today().now()
yesterday_datetime = today_datetime - timedelta(days=1)
today_date = today_datetime.strftime('%Y-%m-%d')
yesterday_date = yesterday_datetime.strftime('%Y-%m-%d')

Подключите к API Twitter с помощью функции, которую мы определены ранее.

api = authentication(CONS_KEY,CONS_SECRET,ACC_TOKEN,ACC_SECRET)

Определите наши параметры поиска. Q Где мы определяем наше ключевое слово, С Является ли дата начала нашего поиска, RESLACT_TYPE = «недавнее» означает, что мы собираемся взять новейшие твиты, lang = 'en' собирается взять только английские твиты, а Предметы (Total_tweets) Где мы определяем максимальные твиты, которые мы собираемся взять.

search_result = tweepy.Cursor(api.search, 
                              q=keyword, 
                              since=yesterday_date,
                              result_type='recent', 
                              lang='en').items(total_tweets)

Оберните эти коды в функции под названием search_tweets с ключевое слово . и total_tweets как параметры.

def search_tweets(keyword, total_tweets):
    today_datetime = datetime.today().now()
    yesterday_datetime = today_datetime - timedelta(days=1)
    today_date = today_datetime.strftime('%Y-%m-%d')
    yesterday_date = yesterday_datetime.strftime('%Y-%m-%d')
    api = authentication(CONS_KEY,CONS_SECRET,ACC_TOKEN,ACC_SECRET)
    search_result = tweepy.Cursor(api.search, 
                                  q=keyword, 
                                  since=yesterday_date, 
                                  result_type='recent', 
                                  lang='en').items(total_tweets)
    return search_result

3. Очистите твиты

Прежде чем мы проанализируем настроение Tweets, нам нужно немного очистить твиты, поэтому API Google Natural Language может их лучше определить.

Мы будем использовать библиотеки NLTK и REGEX, чтобы помочь нам в этом процессе.

import re
from nltk.tokenize import WordPunctTokenizer

Мы удаляем имя пользователя в каждом Tweet, поэтому в основном мы можем удалить все, что начинается с @ И мы используем Regex, чтобы сделать это.

user_removed = re.sub(r'@[A-Za-z0-9]+','',tweet.decode('utf-8'))

Мы также удаляем ссылки в каждом Tweet.

link_removed = re.sub('https?://[A-Za-z0-9./]+','',user_removed)

Числа также удаляются со всех твитов.

number_removed = re.sub('[^a-zA-Z]',' ',link_removed)

Последнее, преобразуйте все символы в нижнее пространство, затем удалите каждое ненужное пространство.

lower_case_tweet = number_removed.lower()
tok = WordPunctTokenizer()
words = tok.tokenize(lower_case_tweet)
clean_tweet = (' '.join(words)).strip()

Оберните эти коды в функцию, называемую Clean_tweets с Tweet как наш параметр.

def clean_tweets(tweet):
    user_removed = re.sub(r'@[A-Za-z0-9]+','',tweet.decode('utf-8'))
    link_removed = re.sub('https?://[A-Za-z0-9./]+','',user_removed)
    number_removed = re.sub('[^a-zA-Z]', ' ', link_removed)
    lower_case_tweet= number_removed.lower()
    tok = WordPunctTokenizer()
    words = tok.tokenize(lower_case_tweet)
    clean_tweet = (' '.join(words)).strip()
    return clean_tweet

4. Получить настроение Tweet

Чтобы иметь возможность получить настроение Tweet, мы будем использовать API Google натурального языка.

API предоставляет анализ настроения, анализ объектов и анализ синтаксиса. Мы будем использовать только анализ настроений для этого руководства.

В анализе настроений Google есть Оценка и величина Отказ Оценка Является ли оценка чувств настроения от -1,0 (очень отрицательно) до 1,0 (очень положительного). Величина это сила настроения и колеблется от 0 до бесконечности.

Ради простоты этого урока, мы только рассмотрим Оценка Отказ Если вы думаете о том, чтобы сделать глубокий анализ NLP, вы должны рассмотреть величина тоже.

Импортируйте библиотеку Google натуральной языки.

from google.cloud import language
from google.cloud.language import enums
from google.cloud.language import types

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

def get_sentiment_score(tweet):
    client = language.LanguageServiceClient()
    document = types\
               .Document(content=tweet,
                         type=enums.Document.Type.PLAIN_TEXT)
    sentiment_score = client\
                      .analyze_sentiment(document=document)\
                      .document_sentiment\
                      .score
    return sentiment_score

5. Проанализировать твиты

Давайте сделаем функцию, которая будет петить список твитов, которые мы получаем от search_tweets функция и получите оценку настроения каждого твита, используя get_sentiment_score функция. Затем мы рассчитаем среднее значение. Средний балл определит, имеет ли данное ключевое слово положительное, нейтральное или отрицательное настроение.

Определить Оценка равна 0 Затем используйте search_tweets Функция, чтобы получить твиты, связанные с ключевым словом, которое мы определяем.

score = 0
tweets = search_tweets(keyword, total_tweets)

Петля через список твитов и сделать очистку, используя Clean_tweets Функция, которую мы создали раньше.

for tweet in tweets:
    cleaned_tweet = clean_tweets(tweet.text.encode('utf-8'))

Получите оценку настроения, используя get_sentiment_score Функция и увеличивать Оценка Добавляя sentiment_score Отказ

for tweet in tweets:
    cleaned_tweet = clean_tweets(tweet.text.encode('utf-8'))
    sentiment_score = get_sentiment_score(cleaned_tweet)
    score += sentiment_score

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

for tweet in tweets:
    cleaned_tweet = clean_tweets(tweet.text.encode('utf-8'))
    sentiment_score = get_sentiment_score(cleaned_tweet)
    score += sentiment_score
    print('Tweet: {}'.format(cleaned_tweet))
    print('Score: {}\n'.format(sentiment_score))

Рассчитайте средний балл и передайте его на Final_score Переменная. Оберните все коды в Analyze_tweets Функция, с ключевое слово . и total_tweets как параметры.

def analyze_tweets(keyword, total_tweets):
    score = 0
    tweets = search_tweets(keyword, total_tweets)
    for tweet in tweets:
        cleaned_tweet = clean_tweets(tweet.text.encode('utf-8'))
        sentiment_score = get_sentiment_score(cleaned_tweet)
        score += sentiment_score
        print('Tweet: {}'.format(cleaned_tweet))
        print('Score: {}\n'.format(sentiment_score))
    final_score = round((score / float(total_tweets)),2)
    return final_score

6. Отправить оценку настроения Tweet

Давайте сделаем последнюю функцию в рабочем процессе. Эта функция получит ключевое слово пользователя и рассчитать среднюю оценку настроения. Тогда мы отправим его через телеграмму бота.

Получите ключевое слово от пользователя.

keyword = update.message.text

Использовать Analyze_tweets Функция, чтобы получить окончательный счет, ключевое слово . Как наш параметр, и установите total_tweets Так как мы хотим собрать 50 твитов.

final_score = analyze_tweets(keyword, 50)

Определим, считается ли данный балл отрицательным, нейтральным или положительным с использованием диапазона баллов Google, так как мы видим на рисунке ниже.

if final_score <= -0.25:
    status = 'NEGATIVE ❌'
elif final_score <= 0.25:
    status = 'NEUTRAL ?'
else:
    status = 'POSITIVE ✅'

Наконец, отправьте Final_score и Статус через телеграмму бота.

bot.send_message(chat_id=update.message.chat_id,
                 text='Average score for '
                       + str(keyword) 
                       + ' is ' 
                       + str(final_score) 
                       + ' ' 
                       + status)

Оберните коды в функцию, называемую send_the_result Отказ

def send_the_result(bot, update):
    keyword = update.message.text
    final_score = analyze_tweets(keyword, 50)
    if final_score <= -0.25:
        status = 'NEGATIVE ❌'
    elif final_score <= 0.25:
        status = 'NEUTRAL ?'
    else:
        status = 'POSITIVE ✅'
    bot.send_message(chat_id=update.message.chat_id,
                     text='Average score for '
                           + str(keyword) 
                           + ' is ' 
                           + str(final_score) 
                           + ' ' 
                           + status)

7. Основная программа

Наконец, создайте другую функцию под названием Главная Чтобы запустить нашу программу. Не забудьте изменить Your_token к токену вашего бота.

from telegram.ext import Updater, MessageHandler, Filters

def main():
    updater = Updater('YOUR_TOKEN')
    dp = updater.dispatcher
    dp.add_handler(MessageHandler(Filters.text, send_the_result))
    updater.start_polling()
    updater.idle()
    
if __name__ == '__main__':
    main()

В конце концов, ваш код должен выглядеть так

import tweepy
import re

from telegram.ext import Updater, MessageHandler, Filters
from google.cloud import language
from google.cloud.language import enums
from google.cloud.language import types
from datetime import datetime, timedelta
from nltk.tokenize import WordPunctTokenizer


ACC_TOKEN = 'YOUR_ACCESS_TOKEN'
ACC_SECRET = 'YOUR_ACCESS_TOKEN_SECRET'
CONS_KEY = 'YOUR_CONSUMER_API_KEY'
CONS_SECRET = 'YOUR_CONSUMER_API_SECRET_KEY'

def authentication(cons_key, cons_secret, acc_token, acc_secret):
    auth = tweepy.OAuthHandler(cons_key, cons_secret)
    auth.set_access_token(acc_token, acc_secret)
    api = tweepy.API(auth)
    return api
    
def search_tweets(keyword, total_tweets):
    today_datetime = datetime.today().now()
    yesterday_datetime = today_datetime - timedelta(days=1)
    today_date = today_datetime.strftime('%Y-%m-%d')
    yesterday_date = yesterday_datetime.strftime('%Y-%m-%d')
    api = authentication(CONS_KEY,CONS_SECRET,ACC_TOKEN,ACC_SECRET)
    search_result = tweepy.Cursor(api.search, 
                                  q=keyword, 
                                  since=yesterday_date, 
                                  result_type='recent', 
                                  lang='en').items(total_tweets)
    return search_result

def clean_tweets(tweet):
    user_removed = re.sub(r'@[A-Za-z0-9]+','',tweet.decode('utf-8'))
    link_removed = re.sub('https?://[A-Za-z0-9./]+','',user_removed)
    number_removed = re.sub('[^a-zA-Z]', ' ', link_removed)
    lower_case_tweet= number_removed.lower()
    tok = WordPunctTokenizer()
    words = tok.tokenize(lower_case_tweet)
    clean_tweet = (' '.join(words)).strip()
    return clean_tweet

def get_sentiment_score(tweet):
    client = language.LanguageServiceClient()
    document = types\
               .Document(content=tweet,
                         type=enums.Document.Type.PLAIN_TEXT)
    sentiment_score = client\
                      .analyze_sentiment(document=document)\
                      .document_sentiment\
                      .score
    return sentiment_score

def analyze_tweets(keyword, total_tweets):
    score = 0
    tweets = search_tweets(keyword,total_tweets)
    for tweet in tweets:
        cleaned_tweet = clean_tweets(tweet.text.encode('utf-8'))
        sentiment_score = get_sentiment_score(cleaned_tweet)
        score += sentiment_score
        print('Tweet: {}'.format(cleaned_tweet))
        print('Score: {}\n'.format(sentiment_score))
    final_score = round((score / float(total_tweets)),2)
    return final_score

def send_the_result(bot, update):
    keyword = update.message.text
    final_score = analyze_tweets(keyword, 50)
    if final_score <= -0.25:
        status = 'NEGATIVE ❌'
    elif final_score <= 0.25:
        status = 'NEUTRAL ?'
    else:
        status = 'POSITIVE ✅'
    bot.send_message(chat_id=update.message.chat_id,
                     text='Average score for '
                           + str(keyword) 
                           + ' is ' 
                           + str(final_score) 
                           + ' ' 
                           + status)

def main():
    updater = Updater('YOUR_TOKEN')
    dp = updater.dispatcher
    dp.add_handler(MessageHandler(Filters.text, send_the_result))
    updater.start_polling()
    updater.idle()
    
if __name__ == '__main__':
    main()

Сохраните файл и назовите его main.py Затем запустите программу.

python3 main.py

Перейдите в свою телеграмму BOT, доступая к этому URL: https://telegram.me/your_bot_username Отказ Введите любой продукт, имя человека или все, что вы хотите, и отправьте его на свой бот. Если все работает, должна быть подробная оценка настроения для каждого твита в терминале. Бот ответит со средним оценкой настроения.

Изображения ниже приведены пример, если я вводит Валентино Росси и отправьте его до бота.

Если вам удалось следить за шагами до конца этого учебника, это потрясающе! У вас сейчас есть ваш анализатор чувств, насколько круто это!?

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

Пожалуйста, оставьте комментарий, если вы думаете, что в моем коде есть какие-либо ошибки.

Спасибо, удачи!:)