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

В этом посте я извлечу данные из твиттера о различных марках автомобилей. Затем мы применим анализ настроений, чтобы увидеть, насколько положительно / отрицательно воспринимаются разные автомобильные марки за последнее время. Анализ настроений - это процесс определения того, является ли контент положительным, отрицательным или нейтральным. Это также известно как анализ мнений, определение мнения или отношения оратора. Обычно эта технология используется для того, чтобы узнать, что люди думают о той или иной теме. В нашем случае мы используем текст из недавних твитов, чтобы узнать, что люди думают о различных марках автомобилей.

Я нашел эту статью и это видео полезными, чтобы понять, как извлекать, фильтровать и обрабатывать данные из twitter api.

#Import the necessary methods from tweepy library
from tweepy import Stream
from tweepy import OAuthHandler
from tweepy.streaming import StreamListener
import time
#Variables that contain the user credentials to access Twitter API
#(Note: replace with your own values from https://apps.twitter.com/)
consumer_key="consumer key"
consumer_secret="consumer secret"
author_token="author token"
author_secret="author secret"
class listener(StreamListener):
#This is a basic listener that just prints received tweets
def on_data(self, data):
   try:
     #writing data to file
     saveFile = open('tweetDBcars.csv','a')
     saveFile.write(data)
     saveFile.close()
     return(True)
   except BaseException, e:
     print 'failed ondata,',str(e)
     time.sleep(5)
def on_error(self, status):
        print status
auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(author_token, author_secret)
twitterStream = Stream(auth, listener())
# getting tweets that have any of these words
twitterStream.filter(track=['car' 
 'chevy','ford','toyota',
    'acura','kia','audi',
    'chrystler','dodge','ferrari'
    'fiat','buick','cadillac','chevrolet',
    'bmw','honda','jeep','lexus','mazda',
    'mini','nissan','tesla''volvo','saab','porshe'])

Я дал этому скрипту поработать 6 дней, что собрало около 115 000 твитов. Twitter api предоставляет нам много данных о каждом твите в структуре данных json, похожей на словарь Python. Нас интересует содержание самого твита, доступ к которому можно получить с помощью ключа [«текст»].

При работе с большим набором данных важно зафиксировать оператор tweet = json.loads (line) внутри предложения try / except. Хотя данные, возвращаемые из API Twitter, как правило, чистые, могут быть ошибки, и вы не должны нарушать скрипт, если он обнаруживает строку с неверными данными. Предложение try / except позволяет сценарию пропустить строку с неверными данными и продолжить обработку оставшихся твитов.

tweets_data_path = 'twitDBcars.csv'
tweets_data = []
tweets_file = open(tweets_data_path, "r")
for line in tweets_file:
    try:
        tweet = json.loads(line)
        tweets_data.append(tweet)
    except:
        continue

Теперь мы создаем фрейм данных pandas с твитами.

tweets = pd.DataFrame()
index = 0
for num, line in enumerate(tweets_data):
  try:
     print num,line['text']
     tweets.loc[index,'text'] = line['text']
     index = index + 1 
 except:
     print num, "line not parsed"
     continue

Чтобы извлечь твиты о конкретных брендах, мы сравниваем слова в тексте каждого твита с названием каждого интересующего нас бренда. Если мы находим бренды, которые ищем, мы отслеживаем их в новом столбце brand_name во фрейме данных.

def brand_in_tweet(brand, tweet):
    brand = brand.lower()
    tweet = tweet.lower()
    match = re.search(brand, tweet)
    if match:
        print 'Match Found'
        return brand
    else:
        print 'Match not found'
        return 'none'

Следующий шаг - оценить тональность каждого твита. Есть несколько подходов к анализу настроений.

Практики чаще всего описывают два подхода:

  • Один из подходов - собрать кучу твитов и попросить людей пометить их как положительные или отрицательные. Затем используйте помеченный набор данных для обучения такого алгоритма, как Наивный Байес или Случайный лес. Обученную модель затем можно использовать на новых данных для оценки настроения.
  • Второй подход заключается в использовании лексики, в которой мы сравниваем слова из твита со словами (или n-граммами) из лексикона, чтобы оценить каждое слово по положительной / отрицательной оценке. Затем мы складываем оценки слов для каждого твита, чтобы суммировать оценку тональности твита.

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

from textblob import TextBlob
for index, row in tweets.iterrows():
    temp = TextBlob(row['text'])
    tweets.loc[index,'sentscore'] = temp.sentiment.polarity

Мне нравится использовать ggplot для визуализации данных из-за его мощности и гибкости, поэтому я запишу фрейм данных в файл csv, который можно будет импортировать в R.

for column in tweets.columns:
    for idx in tweets[column].index:
        x = tweets.get_value(idx,column)
        try:
            x = unicode(x.encode('utf-8','ignore'),errors ='ignore')          
            if type(x) == unicode:
                unicode(str(x),errors='ignore')
            else: 
                df.set_value(idx,column,x)
        except Exception:
            print 'encoding error: {0} {1}'.format(idx,column)
            tweets.set_value(idx,column,'')
            continue
tweets.to_csv('tweets_export.csv')

Давайте прочитаем данные в R и рассмотрим данные визуально.

df_tweets = read.csv("tweets_export.csv")
#let us look at the mean of sentiment scores for all brands
data_brand = df_tweets %>%
   group_by(brand) %>%
   summarise(mean_sentiment_score = mean(sentscore))
ggplot(data=data_brand, aes(x=brand, y=mean_sentiment_score))+
  geom_bar(stat = "identity", aes(fill = brand))

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

Теперь рассмотрим 3 бренда более подробно:

#We subset the data for the brands ford, mini and kia to drill down into the variance of their sentiment over time
data_week <- df_tweets[df_tweets$brand %in% c("ford","mini","kia"),]
ggplot(aes(x = day, y = sentscore), data = data_week) + 
  geom_smooth(aes(colour = brand))

Со временем позитивные настроения в отношении Kia увеличились, а позитивные настроения в отношении Ford снизились. Представьте, что мы консалтинговая компания, а Форд - один из наших клиентов. Нам нужно углубиться в детали, чтобы понять, почему положительные настроения падают.

Это очень предварительный анализ. Для достижения высокой точности анализа настроений необходимо принимать во внимание несколько факторов, таких как язык, домен, население, возраст, сленг, анализ лексики и т. Д. Некоторые из проблем, с которыми сталкиваются Facebook и AOL, и подходы, которые они используют, обсуждаются здесь и Здесь соответственно. Я хочу продолжить работу над этим анализом в ближайшем будущем.

Другие отличные ресурсы по той же теме:

  1. Анализ больших данных с помощью twitter - видеоролики и слайды из Berkeley ischool- лекции, представленные сотрудниками из twitter.
  2. Анализ настроения смайликов в твитах
  3. Как построить анализатор настроений в твиттере
  4. Майнинг твиттер-данных с помощью python (Книга)
  5. Восприятие сигарет с ментолом среди пользователей твиттера: анализ содержания и настроений (исследовательский доклад)

Несколько других моих проектов находятся здесь