Дэниел Симмонс, Нашон Чери и Тайри Стивенсон
Сегодня мы покажем вам, как сделать простой анализатор настроений 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/