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

Это открытие вылилось в значительную огласку в социальных сетях. Несмотря на то, что многие выразили недовольство резкими контурами грузовика, его необычной формой и неудавшимся тестом во время презентации, Tesla получила более 250 000 предзаказов на грузовик. Учитывая это несоответствие, было бы интересно посмотреть, как в целом Cybertruck в социальных сетях относятся к использованию машинного обучения. В этом посте мы проведем анализ настроений твитов о Tesla Cybertruck.

Для начала вам необходимо подать заявку на создание учетной записи разработчика Twitter:

После того, как ваша учетная запись разработчика будет одобрена, вам необходимо создать приложение Twitter:

Шаги для подачи заявки на учетную запись разработчика Twitter и создания приложения Twitter описаны здесь.

Мы будем использовать бесплатную библиотеку Python tweepy для доступа к Twitter API. Документацию по tweepy можно найти здесь.

  1. УСТАНОВКА

Во-первых, убедитесь, что у вас установлен tweepy. Откройте командную строку и введите:

pip install tweepy

2. ИМПОРТ БИБЛИОТЕК

Затем откройте свой любимый редактор и импортируйте библиотеки tweepy и pandas:

import tweepy
import pandas as pd

3. АУТЕНТИФИКАЦИЯ

Далее нам понадобится наш ключ потребителя и токен доступа:

Обратите внимание, что сайт предлагает вам хранить свой ключ и токен в секрете! Здесь мы определяем поддельный ключ и токен, но вы должны использовать свой настоящий ключ и токен при создании приложения Twitter, как показано выше:

consumer_key = '5GBi0dCerYpy2jJtkkU3UwqYtgJpRd' 
consumer_secret = 'Q88B4BDDAX0dCerYy2jJtkkU3UpwqY'
access_token = 'X0dCerYpwi0dCerYpwy2jJtkkU3U'
access_token_secret = 'kly2pwi0dCerYpjJtdCerYkkU3Um'

Следующим шагом является создание экземпляра OAuthHandler. Мы передаем наш ключ потребителя и токен доступа, которые мы определили выше:

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

Затем мы передаем экземпляр OAuthHandler в метод API:

api = tweepy.API(auth)

4. ЗАПРОСЫ TWITTER API

Затем мы инициализируем списки для полей, которые нам интересно анализировать. А пока мы можем посмотреть строки твита, пользователей и время твита. Затем мы пишем цикл for поверх тонкого объекта Cursor. В объекте «Курсор» мы передаем метод «api.search», устанавливаем строку запроса для того, что мы хотим найти, и устанавливаем «count» = 1000, чтобы мы не превышали лимит скорости твиттера. Здесь мы будем искать твиты о Tesla Cybertruck. Мы также используем метод «item ()» для преобразования объекта «Cursor» в итеративный.

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

twitter_users = []
tweet_time = []
tweet_string = []
for tweet in tweepy.Cursor(api.search,q='Tesla Cybertruck', count=1000).items(1000):
            if (not tweet.retweeted) and ('RT @' not in tweet.text):
                if tweet.lang == "en":
                    twitter_users.append(tweet.user.name)
                    tweet_time.append(tweet.created_at)
                    tweet_string.append(tweet.text)
                    print([tweet.user.name,tweet.created_at,tweet.text])

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

def get_related_tweets(key_word):
twitter_users = []
    tweet_time = []
    tweet_string = [] 
    for tweet in tweepy.Cursor(api.search,q=key_word, count=1000).items(1000):
            if (not tweet.retweeted) and ('RT @' not in tweet.text):
                if tweet.lang == "en":
                    twitter_users.append(tweet.user.name)
                    tweet_time.append(tweet.created_at)
                    tweet_string.append(tweet.text)
                    print([tweet.user.name,tweet.created_at,tweet.text])
    df = pd.DataFrame({'name':twitter_users, 'time': tweet_time, 'tweet': tweet_string})
    
    return df

Когда мы можем вызвать функцию с ключевыми словами «Tesla Cybertruck», мы получим:

get_related_tweets('Tesla Cybertruck')

Чтобы получить оценку настроения, нам нужно импортировать пакет Python под названием textblob. Документацию для textblob можно найти здесь. Чтобы установить textblob, откройте командную строку и введите:

pip install textblob

Следующий импорт текстового блока:

from textblob import TextBlob

Мы будем использовать показатель полярности в качестве меры для положительного или отрицательного воздействия. Показатель полярности представляет собой число с плавающей запятой со значениями от -1 до +1.

Например, если мы определяем объект textblob и передаем предложение «Я люблю Tesla Cybertruck», мы должны получить оценку полярности с положительным значением:

sentiment_score = TextBlob(“I love the Tesla Cybertruck”).sentiment.polarity
print("Sentiment Polarity Score:", sentiment_score)

Давайте получим оценку полярности настроений для твитов о Tesla Cybertruck:

df = get_related_tweets("Tesla Cybertruck")
df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity)
print(df.head())

Мы также можем подсчитать количество положительных и отрицательных настроений:

df_pos = df[df['sentiment'] > 0.0]
df_neg = df[df['sentiment'] < 0.0]
print("Number of Positive Tweets", len(df_pos))
print("Number of Negative Tweets", len(df_neg))

Опять же, для повторного использования кода мы можем обернуть все это в функцию:

def get_sentiment(key_word):
    df = get_related_tweets(key_word)
    df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity)
    df_pos = df[df['sentiment'] > 0.0]
    df_neg = df[df['sentiment'] < 0.0]
    print("Number of Positive Tweets about {}".format(key_word), len(df_pos))
    print("Number of Negative Tweets about {}".format(key_word), len(df_neg))

Если мы вызовем эту функцию с помощью «Tesla Cybertruck», мы получим:

get_sentiment(“Tesla Cybertruck”)

Было бы удобно, если бы мы могли программно визуализировать эти результаты. Давайте импортируем seaborn и matplotlib и изменим нашу функцию get_sentiment:

import seaborn as sns
import matplotlib.pyplot as plt
def get_sentiment(key_word):
    df = get_related_tweets(key_word)
    df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity)
    df_pos = df[df['sentiment'] > 0.0]
    df_neg = df[df['sentiment'] < 0.0]
    print("Number of Positive Tweets about {}".format(key_word), len(df_pos))
    print("Number of Negative Tweets about {}".format(key_word), len(df_neg))
    sns.set()
    labels = ['Postive', 'Negative']
    heights = [len(df_pos), len(df_neg)]
    plt.bar(labels, heights, color = 'navy')
    plt.title(key_word)
get_sentiment(“Tesla Cybertruck”)

Как видите, твиты о Tesla Cybertruck имеют больше положительных эмоций, чем отрицательных. Было бы интересно собрать данные за несколько дней, чтобы увидеть, как настроения меняются со временем. Возможно, я сохраню это для будущего поста!

Спасибо за чтение. Код из этого поста доступен на GitHub. Удачи и удачного машинного обучения!