Каждый день генерируется много данных в разных формах, и одна из форм - текст; один хороший источник этих текстовых данных - твиты, где люди активно делятся своими мыслями. Наша цель в этой статье - использовать Twitter API для извлечения твитов и анализа их настроений.

Необходимые библиотеки и модули:

import matplotlib.pyplot as plt
%matplotlib inline
import re 
import pandas as pd
import tweepy 
from tweepy import OAuthHandler 
from textblob import TextBlob 
import csv
import string
import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
n_words= set(stopwords.words('english'))
from nltk.tokenize import word_tokenize
from nltk.stem.porter import PorterStemmer
from nltk.stem import WordNetLemmatizer 
from wordcloud import WordCloud,STOPWORDS
porter = PorterStemmer()

lemmatizer = WordNetLemmatizer() 
nltk.download('punkt')
nltk.download('wordnet')

Как использовать Twitter API:

Нажмите здесь, чтобы узнать, как сгенерировать Twitter API.

вы получите четыре типа ключей:

      # I replaced my keys with "xxxxxxx" :)
      consumer_key = 'xxxxxxxx'
      consumer_secret ="xxxxxxxxxxx"
      access_token = 'xxxxxxxxxx'
      access_token_secret = 'xxxxxxxxxxx'

давайте использовать их для аутентификации через python :)

def TwitterClient(): 
      # keys and tokens from the Twitter Dev Console 
      consumer_key = 'xxxxxxxx'
      consumer_secret ="xxxxxxxxxxx"
      access_token = 'xxxxxxxxxx'
      access_token_secret = 'xxxxxxxxxxx'

      # attempt authentication 
      try: 
          # create OAuthHandler object 
          auth = OAuthHandler(consumer_key, consumer_secret) 
          # set access token and secret 
          auth.set_access_token(access_token, access_token_secret) 
          # create tweepy API object to fetch tweets 
          api = tweepy.API(auth) 
      except: 
          print("Error: Authentication Failed") 

      return api #now we can make request to twitter using this api

Предварительная обработка ТЕКСТА

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

Перечислим моменты, на которых мы хотим сосредоточиться при очистке данных:

  1. ссылки: Они не участвуют в выражении каких-либо чувств.
  2. Теги: такие теги, как # tags и @ tags, для нас бесполезны.
  3. Знаки препинания
  4. Числовые значения
  5. Запрещенные слова: такие слова, как и, и т. Д., Не влияют на настроение.
  6. Нормализация слов: например, выделение корней, лемматизация и т. Д.

Давайте посмотрим, что я имел в виду под словом "нормализация":

Стебель:

Это процесс преобразования слов в их корневые формы, например, кошки превращаются в кошек и т. Д. Мы будем использовать стеммер Портера, предлагаемый NLTK.

Porter Stemmer - это алгоритм, состоящий из некоторых наборов правил и удаления суффикса слова. Этот процесс также известен как чередование суффиксов; иногда корень, генерируемый этим алгоритмом, даже не является значимым словом на английском языке. Но его используют из-за его скорости и простоты.

def clean(text):
  # removing @ tags and links from the text
  text= ' '.join(re.sub("(@[A-Za-z0-9]+)|([^0-9A-Za-z \t]) |(\w+:\/\/\S+)", " ", text).split()) 
  # converting all letters to lower case and relacing '-' with spaces.
  text= text.lower().replace('-', ' ')
  # removing stowards and numbers
  table= str.maketrans('', '', string.punctuation+string.digits)
  text= text.translate(table)
  # tokenizing words 
  tokens = word_tokenize(text)
  # stemming the words 
  stemmed = [porter.stem(word) for word in tokens]
  words = [w for w in stemmed if not w in n_words]

  text = ' '.join(words)
  return text

Анализ настроения:

Мы будем использовать библиотеку TextBlob для анализа настроения или полярности твитов.

analysis = TextBlob(tweet)
senti= analysis.sentiment.polarity

if senti<0 :
  emotion = "NEG"
elif senti>0:
  emotion= "POS"
else:
  emotion= "NEU"

Получим твиты с помощью API и помечаем их эмоциями:

def get_tweets(query, count = 10): 

      tweets = [] 

      try: 
          # call twitter api to fetch tweets 
          fetched_tweets = api.search(q = query, count = count) 
          for tweet in fetched_tweets:
            # cleaning the tweets
            tweet= clean(tweet.text)
            # getting the sentiment from textblob
            analysis = TextBlob(tweet)
            senti= analysis.sentiment.polarity
            # labeling the sentiment
            if senti<0 :
              emotion = "NEG"
            elif senti>0:
              emotion= "POS"
            else:
              emotion= "NEU"
            # appending all data
            tweets.append((tweet, senti, emotion))
            
          return tweets
      except tweepy.TweepError as e:
          # print error (if any) 
          print("Error : " + str(e))

:

# getting the api access
api = TwitterClient() 
# calling function to get tweets, count is the number of tweets.
tweets = get_tweets(query = "Farmer's Protest", count = 200)
df= pd.DataFrame(tweets, columns= ['tweets', 'senti', 'emotion'])
# droping retweets
df= df.drop_duplicates()

Поздравляем, мы успешно проанализировали настроения или полярность твитов с помощью Twitter API.

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

def wordcloud_draw(data, color = 'black'):
    words = ' '.join(data)
    cleaned_word = " ".join([word for word in words.split()
                                and not word.startswith('#')
                                and word != 'rt'  
                            ])
    wordcloud = WordCloud(
                      background_color=color,
                      width=2500,
                      height=2000
                     ).generate(cleaned_word)
    # using matplotlib to display the images in notebook itself.
    plt.figure(1,figsize=(13, 13))
    plt.imshow(wordcloud)
    plt.axis('off')
    plt.show()
df_pos = df[ df['emotion'] == 'POS']
df_pos = df_pos['tweets']
wordcloud_draw(df_pos, 'white')

Получите код здесь :)

Спасибо за прочтение; поделитесь, если хотите. Увидимся в следующей истории ✌️

Дополнительная информация:

Анализ тональности твита с наивным байесовским методом.