Дэниел Симмонс, Нашон Чери и Тайри Стивенсон

Сегодня мы покажем вам, как сделать простой анализатор настроений Twitter.

Начнем с объяснения анализа настроений. Википедия утверждает, что это основное определение анализа настроений:

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

С точки зрения непрофессионала, мы можем думать об анализе настроений как об использовании машин для интерпретации основного значения основного текста. Например, предположим, что вы пишете письмо своему начальнику. Если бы вы недавно получили повышение и это письмо было написано, чтобы поблагодарить вашего начальника, то ваше мнение было бы помечено как «положительное». Однако если вы чувствуете, что вас неправильно понизили в должности, и написали письмо своему боссу, в котором подробно описали, как вы на самом деле относитесь к ситуации, возникшее в результате настроение, скорее всего, будет обозначено как «негативное».

Мнения и связанные с ними чувства

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

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

Таким образом, нейтральное настроение подразумевает, что в тексте нет значительных эмоций, отображаемых / обнаруживаемых.

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

Что, черт возьми, такое API !?

Отличный вопрос! API - это инструменты в Интернете, которые мы можем вызывать для отправки и получения данных. Обычно мы отправляем данные и получаем ответ, что делает этот API таким полезным. Обычно данные поступают из огромных приложений / библиотек, на создание которых у нас либо не хватает времени, ресурсов или мотивации. Таким образом, возможность использовать чужое приложение экономит драгоценное время на разработку. Только представьте, какой длины был бы этот средний пост, если бы нам пришлось создать библиотеку для сбора твитов? Если вас интересует более глубокий анализ API, ознакомьтесь с вопросом Что такое API? На английском, пожалуйста » Петр Газаров

Настройка доступа к Twitter API

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

Https://apps.twitter.com/app/new

Вы увидите такую ​​страницу. У нас нет веб-сайта, поэтому ваше описание и веб-сайт могут быть такими, какими вы хотите.

Вам будут предоставлены ключи клиента, а ниже находится кнопка для создания токенов доступа. Эти токены позволяют вашей программе отправлять запросы на сервер. Если ключ получен как законный, запрос завершается, и сервер возвращает ответ, соответствующий вашему запросу. Поместите ключи в начало вашего кода и попробуйте распечатать некоторые из ваших результатов. Не вызывайте API слишком часто, у вас есть ограничение на количество вызовов, которые вы можете совершать в Twitter API без премиум-аккаунта! Процитирую Twitter:

«На пользователя или на приложение. Ограничение скорости API в основном применяется для каждого пользователя - или, точнее, для каждого токена доступа пользователя. Если метод допускает 15 запросов на окно ограничения скорости, то он разрешает 15 запросов на окно на токен доступа ».

Получение ключей доступа

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

Теперь мы видим нашу дашборд

Выберите ключи и токены доступа

Если вы впервые используете этот проект, в разделе «Токен доступа» выберите «Сгенерировать ключи API».

К коду!

import re # A python library used for regular expressions
import tweepy # Twitter library used to pull tweets
from tweepy import OAuthHandler # Used to authenticate the user of twitter’s API
from textblob import TextBlob # Used to process text data

Twitter использует стандартный RESTful API. Если вы не знаете:

RESTful API - это интерфейс прикладной программы, который использует« HTTP-запросы к данным GET, PUT, POST и DELETE. RESTful API, также называемый веб-сервисом RESTful, основан на репрезентативной технологии передачи состояния, архитектурном стиле и подходе к коммуникациям, часто используемом при разработке веб-сервисов ». (Определение с сайта WhatIs.com)

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

class TwitterClient(object):
'''
Generic Twitter Class for sentiment analysis.
'''
def __init__(self):
'''
Class constructor or initialization method.
'''
# keys and tokens from the Twitter Dev Console
consumer_key = ‘XXXXXXXXXXXXXXXX'
consumer_secret = ‘XXXXXXXXXXXXXXXX'
access_token = ‘XXXXXXXXXXXXXXXX'
access_token_secret = ‘XXXXXXXXXXXXXXXX'

Что такое класс?

Класс использует некоторую комбинацию функций и данных для представления абстрактных или реальных объектов.

Затем мы попытаемся аутентифицировать наши запросы к API.

# attempt authentication
try:
# create OAuthHandler object
self.auth = OAuthHandler(consumer_key, consumer_secret)
# set access token and secret
self.auth.set_access_token(access_token, access_token_secret)
# create tweepy API object to fetch tweets
self.api = tweepy.API(self.auth)
except:
print("Error: Authentication Failed")
def clean_tweet(self, tweet):
'''
Utility function to clean tweet text by removing links, special characters
using simple regex statements.
'''
return ' '.join(re.sub("(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)", " ", tweet).split())

Попробуйте, но не объясните

Ключевое слово try позволяет запускать код, который может дать сбой. Что действительно делает это ключевое слово популярным, так это ключевое слово, с которым оно работает. Исключение предотвратит сбой вашего кода из-за ошибки, и вместо ошибки, остановившей ваш код, произойдет другое действие. Например, если вы не прошли аутентификацию для доступа к API, код выдаст ошибку времени выполнения, а исключение приведет к тому, что программа напечатает «Ошибка: ошибка аутентификации».

Следующая функция будет использоваться для получения настроений нашего твита:

def get_tweet_sentiment(self, tweet):
'''
Utility function to classify sentiment of passed tweet
using textblob's sentiment method
'''
# create TextBlob object of passed tweet text
analysis = TextBlob(self.clean_tweet(tweet))
# set sentiment
if analysis.sentiment.polarity > 0:
return 'positive'
elif analysis.sentiment.polarity == 0:
return 'neutral'
else:
return 'negative'

Давайте объясним роль полярности в анализе настроений

Полярность представляет собой степень эмоции, выраженную в тексте. Полярность представлена ​​в виде десятичного числа в диапазоне от -1 до 1. В нашем коде мы определили, что текст с отрицательными настроениями имеет полярность меньше нуля, нейтральные настроения имеют полярность, равную нулю, а положительные настроения имеют полярность больше 0.

def get_tweet_polarity(self, tweet):
'''
Utility function to classify sentiment of passed tweet
using textblob's sentiment method
'''
# create TextBlob object of passed tweet text
analysis = TextBlob(self.clean_tweet(tweet))
# set polarity
return analysis.sentiment.polarity

Наконец-то мы можем получать твиты!

def get_tweets(self, query, count = 10):
'''
Main function to fetch tweets and parse them.
'''
# empty list to store parsed tweets
tweets = []
try:
# call twitter api to fetch tweets
fetched_tweets = self.api.search(q = query, count = count)
# parsing tweets one by one
for tweet in fetched_tweets:
# empty dictionary to store required params of a tweet
parsed_tweet = {}
# saving text of tweet
parsed_tweet['text'] = tweet.text
# saving sentiment of tweet
parsed_tweet['sentiment'] = self.get_tweet_sentiment(tweet.text)
#save polarity as well
parsed_tweet['polarity'] = self.get_tweet_polarity(tweet.text)
# appending parsed tweet to tweets list
if tweet.retweet_count > 0:
# if tweet has retweets, ensure that it is appended only once
if parsed_tweet not in tweets:
tweets.append(parsed_tweet)
else:
tweets.append(parsed_tweet)
# return parsed tweets
return tweets
except tweepy.TweepError as e:
# print error (if any)
print("Error : " + str(e))

Поговорим о main ()

Для запуска кода в main не требуется (это только на Python и некоторых более новых языках!). Однако это абсолютно необходимо для удобочитаемости и создания библиотек. Преимущество наличия основной функции заключается в том, что теперь вы можете импортировать этот скрипт и использовать клиентскую библиотеку Twitter, не вызывая из вашего кода другие функции программы. Например, импорт класса Twitter Client не приведет к тому, что ваш код будет печатать твиты Дональда Трампа.

def main():
# creating object of TwitterClient Class
api = TwitterClient()
# calling function to get tweets
tweets = api.get_tweets(query = 'Donald Trump', count = 200)
# picking positive tweets from tweets
ptweets = [tweet for tweet in tweets if tweet['sentiment'] == 'positive']
# percentage of positive tweets
print("Positive tweets percentage: {} %".format(100*len(ptweets)/len(tweets)))
# picking negative tweets from tweets
ntweets = [tweet for tweet in tweets if tweet['sentiment'] == 'negative']
# percentage of negative tweets
print("Negative tweets percentage: {} %".format(100*len(ntweets)/len(tweets)))
# percentage of neutral tweets
check = len(tweets) - len(ntweets) - len(ptweets)
print("Neutral tweets percentage: {} %".format(100*(check/len(tweets))))
# printing first 5 positive tweets
print("\n\nPositive tweets:")
for tweet in ptweets[:10]:
print((tweet['text'] + "  Rating:" + str(tweet['polarity'])))
# printing first 5 negative tweets
print("\n\nNegative tweets:")
for tweet in ntweets[:10]:
print((tweet['text'] + "  Rating:" + str(tweet['polarity'])))
if __name__ == "__main__":
# calling main function
main()

Благодарим за внимание!

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

Окончательные результаты:

import re
import tweepy
from tweepy import OAuthHandler
from textblob import TextBlob
 
class TwitterClient(object):
    '''
    Generic Twitter Class for sentiment analysis.
    '''
    def __init__(self):
        '''
        Class constructor or initialization method.
        '''
        # keys and tokens from the Twitter Dev Console
        consumer_key = '6mpvUqDWIJG9MjkJVymp2lFTU'
        consumer_secret = 'PYlSmVLnN8TnF4axmli8FthvAUKfOIFe4pCd22BQV2pg36rk3Z'
        access_token = '3101885034-3cYBZrVhjKHtmB0llzdh8rhk5zdgghME0JMQHi8'
        access_token_secret = '22Uhm2z6copFcYVY7oPPRQAb8YL026OOfcfkQfAt4w8Hm'
 
        # attempt authentication
        try:
            # create OAuthHandler object
            self.auth = OAuthHandler(consumer_key, consumer_secret)
            # set access token and secret
            self.auth.set_access_token(access_token, access_token_secret)
            # create tweepy API object to fetch tweets
            self.api = tweepy.API(self.auth)
        except:
            print("Error: Authentication Failed")
 
    def clean_tweet(self, tweet):
        '''
        Utility function to clean tweet text by removing links, special characters
        using simple regex statements.
        '''
        return ' '.join(re.sub("(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)", " ", tweet).split())
 
    def get_tweet_sentiment(self, tweet):
        '''
        Utility function to classify sentiment of passed tweet
        using textblob's sentiment method
        '''
        # create TextBlob object of passed tweet text
        analysis = TextBlob(self.clean_tweet(tweet))
        # set sentiment
        if analysis.sentiment.polarity > 0:
            return 'positive'
        elif analysis.sentiment.polarity == 0:
            return 'neutral'
        else:
            return 'negative'
        
    def get_tweet_polarity(self, tweet):
        '''
        Utility function to classify sentiment of passed tweet
        using textblob's sentiment method
        '''
        # create TextBlob object of passed tweet text
        analysis = TextBlob(self.clean_tweet(tweet))
        # set polarity
        return analysis.sentiment.polarity
        
 
    def get_tweets(self, query, count = 10):
        '''
        Main function to fetch tweets and parse them.
        '''
        # empty list to store parsed tweets
        tweets = []
 
        try:
            # call twitter api to fetch tweets
            fetched_tweets = self.api.search(q = query, count = count)
 
            # parsing tweets one by one
            for tweet in fetched_tweets:
                # empty dictionary to store required params of a tweet
                parsed_tweet = {}
 
                # saving text of tweet
                parsed_tweet['text'] = tweet.text
                # saving sentiment of tweet
                parsed_tweet['sentiment'] = self.get_tweet_sentiment(tweet.text)
                #save polarity as well
                parsed_tweet['polarity'] = self.get_tweet_polarity(tweet.text)
 
                # appending parsed tweet to tweets list
                if tweet.retweet_count > 0:
                    # if tweet has retweets, ensure that it is appended only once
                    if parsed_tweet not in tweets:
                        tweets.append(parsed_tweet)
                else:
                    tweets.append(parsed_tweet)
 
            # return parsed tweets
            return tweets
 
        except tweepy.TweepError as e:
            # print error (if any)
            print("Error : " + str(e))
 
def main():
    # creating object of TwitterClient Class
    api = TwitterClient()
    # calling function to get tweets
    tweets = api.get_tweets(query = 'Donald Trump', count = 200)
 
    # picking positive tweets from tweets
    ptweets = [tweet for tweet in tweets if tweet['sentiment'] == 'positive']
    # percentage of positive tweets
    print("Positive tweets percentage: {} %".format(100*len(ptweets)/len(tweets)))
    # picking negative tweets from tweets
    ntweets = [tweet for tweet in tweets if tweet['sentiment'] == 'negative']
    # percentage of negative tweets
    print("Negative tweets percentage: {} %".format(100*len(ntweets)/len(tweets)))
    # percentage of neutral tweets
    check = len(tweets) - len(ntweets) - len(ptweets)
    print("Neutral tweets percentage: {} %".format(100*(check/len(tweets))))
 
    # printing first 5 positive tweets
    print("\n\nPositive tweets:")
    for tweet in ptweets[:10]:
        print((tweet['text'] + "  Rating:" + str(tweet['polarity'])))
 
    # printing first 5 negative tweets
    print("\n\nNegative tweets:")
    for tweet in ntweets[:10]:
        print((tweet['text'] + "  Rating:" + str(tweet['polarity'])))
 
if __name__ == "__main__":
    # calling main function
    main()

Вы можете связаться с нами по адресу:

Дэниел Симмонс - https://www.linkedin.com/in/bdanielsimmons2019/

Нашон Чери - https://www.linkedin.com/in/nashawnchery/

Тайри Стивенсон - https://www.linkedin.com/in/tyree-stevenson-0290b6100/