Каждый день генерируется много данных в разных формах, и одна из форм - текст; один хороший источник этих текстовых данных - твиты, где люди активно делятся своими мыслями. Наша цель в этой статье - использовать 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
Предварительная обработка ТЕКСТА
Предварительная обработка - это ключ, который очень помогает модели лучше понять вещи, а также помогает снизить вычислительные затраты и время. Но это также уменьшает пространство, на котором должна работать модель, и мы вернемся к этому позже.
Перечислим моменты, на которых мы хотим сосредоточиться при очистке данных:
- ссылки: Они не участвуют в выражении каких-либо чувств.
- Теги: такие теги, как # tags и @ tags, для нас бесполезны.
- Знаки препинания
- Числовые значения
- Запрещенные слова: такие слова, как и, и т. Д., Не влияют на настроение.
- Нормализация слов: например, выделение корней, лемматизация и т. Д.
Давайте посмотрим, что я имел в виду под словом "нормализация":
Стебель:
Это процесс преобразования слов в их корневые формы, например, кошки превращаются в кошек и т. Д. Мы будем использовать стеммер Портера, предлагаемый 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')
Получите код здесь :)
Спасибо за прочтение; поделитесь, если хотите. Увидимся в следующей истории ✌️
Дополнительная информация: