Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬(Python)으로 구현하는 트위터 감정 분석: 개념부터 실전 예제까지

감정 분석(Sentiment Analysis)은 사람들이 특정 사건에 대해 텍스트나 구두로 남긴 피드백 속 감성을 파악하는 과정입니다. 물론 구두 의견도 분석 대상이 되지만, 파이썬 프로그램으로 처리하려면 반드시 텍스트 형태로 변환해야 합니다. 사람들이 표현하는 감정은 긍정적일 수도 있고 부정적일 수도 있는데, 감성 텍스트를 구성하는 각 단어에 가중치를 부여해 수치값을 계산하면 감정을 수학적으로 평가할 수 있습니다.

감정 분석이 중요한 이유

  • 고객 피드백 – 기업 입장에서 제품이나 서비스에 대한 고객 여론을 파악하는 것은 필수적입니다. 고객 피드백이 텍스트로 축적되어 있다면, 트위터 데이터에 감정 분석을 적용해 전반적인 평가가 긍정인지 부정인지 자동으로 판별하고 필요한 개선 조치를 취할 수 있습니다.

  • 정치 캠페인 – 정치인에게는 자신의 연설을 듣는 시민들의 반응을 아는 것이 매우 중요합니다. 소셜 미디어 같은 온라인 플랫폼을 통해 대중의 피드백을 수집하면, 특정 연설에 대한 여론을 객관적으로 판단할 수 있습니다.

  • 정부 정책 – 정부가 새로운 정책이나 사업을 시행할 때 여론 조사를 통해 반응을 가늠할 수 있습니다. 많은 시민들이 트위터를 통해 찬사나 불만을 표출하기 때문입니다.

구현 접근 방식

파이썬으로 감정 분석 프로그램을 만들 때 필요한 핵심 단계는 다음과 같습니다.

  • 필수 라이브러리 설치 – 먼저 Tweepy와 TextBlob을 설치합니다. Tweepy는 트위터에서 데이터를 수집하는 역할을, TextBlob은 텍스트 추출과 감성 처리를 담당합니다.

  • 트위터 API 인증 – 트위터에서 데이터를 가져오려면 발급받은 API 키로 인증 절차를 거쳐야 합니다.

  • 트윗 분류 – 트윗 본문 내용을 분석하여 긍정 트윗과 부정 트윗으로 나눕니다.

전체 예제 코드

import re
import tweepy
from tweepy import OAuthHandler
from textblob import TextBlob

class Twitter_User(object):
    def __init__(self):
        consumer_key = '1ZG44GWXXXXXXXXXjUIdse'
        consumer_secret = 'M59RI68XXXXXXXXXXXXXXXXV0P1L6l7WWetC'
        access_token = '865439532XXXXXXXXXX9wQbgklJ8LTyo3PhVDtF'
        access_token_secret = 'hbnBOz5XXXXXXXXXXXXXefIUIMrFVoc'
        try:
            self.auth = OAuthHandler(consumer_key, consumer_secret)
            self.auth.set_access_token(access_token, access_token_secret)
            self.api = tweepy.API(self.auth)
        except:
            print("Error: Authentication Failed")

    def pristine_tweet(self, twitter):
        return ' '.join(re.sub("(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)", " ", twitter).split())

    def Sentiment_Analysis(self, twitter):
        audit = TextBlob(self.pristine_tweet(twitter))
        # 감성 설정
        if audit.sentiment.polarity > 0:
            return 'positive'
        elif audit.sentiment.polarity == 0:
            return 'negative'

    def tweet_analysis(self, query, count=10):
        twitter_tweets = []
        try:
            get_twitter = self.api.search(q=query, count=count)
            for tweets in get_twitter:
                inspect_tweet = {}
                inspect_tweet['text'] = tweets.text
                inspect_tweet['sentiment'] = self.Sentiment_Analysis(tweets.text)
                if tweets.retweet_count > 0:
                    if inspect_tweet not in twitter_tweets:
                        twitter_tweets.append(inspect_tweet)
                else:
                    twitter_tweets.append(inspect_tweet)
            return twitter_tweets
        except tweepy.TweepError as e:
            print("Error : " + str(e))

def main():
    api = Twitter_User()
    twitter_tweets = api.tweet_analysis(query='Ram Nath Kovind', count=200)
    Positive_tweets = [tweet for tweet in twitter_tweets if tweet['sentiment'] == 'positive']
    print("Positive tweets percentage: {} %".format(100*len(Positive_tweets)/len(twitter_tweets)))
    Negative_tweets = [tweet for tweet in twitter_tweets if tweet['sentiment'] == 'negative']
    print("Negative tweets percentage: {} %".format(100*len(Negative_tweets)/len(twitter_tweets)))
    print("\n\nPositive_tweets:")
    for tweet in Positive_tweets[:10]:
        print(tweet['text'])
    print("\n\nNegative_tweets:")
    for tweet in Negative_tweets[:10]:
        print(tweet['text'])

if __name__ == "__main__":
    main()

참고: 위 코드는 TextBlob의 극성(polarity) 값이 0보다 크면 'positive'로, 그 외의 경우(0 포함) 'negative'로 처리합니다. 즉, 중립적인 트윗도 부정으로 분류될 수 있다는 점에 유의하세요. 또한 최신 버전의 Tweepy(v2.x)에서는 tweepy.API.search() 대신 Client.search_recent_tweets() 방식을 사용해야 하므로, 사용 중인 라이브러리 버전에 맞게 코드를 조정하는 것이 좋습니다.

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Positive tweets percentage: 48.78048780487805 %
Negative tweets percentage: 46.34146341463415 %
Positive_tweets:
RT @heartful_ness: "@kanhashantivan presents a model of holistic living. My deep & intimate association with this organisation goes back to…
RT @heartful_ness: Heartfulness Guide @kamleshdaaji welcomes honorable President of India Ram Nath Kovind @rashtrapatibhvn, honorable first…
RT @DrTamilisaiGuv: Very much pleased by the affection shown by our Honourable President Sri Ram Nath Kovind and First Lady madam Savita Ko…
RT @BORN4WIN: Who became the first President of India from dalit community?
A) K.R. Narayanan
B) V. Venkata Giri
C) R. Venkataraman
D) Ram…
Negative_tweets:
RT @Keyadas63: What wuld those #empoweredwomen b termed who reach Hon HC at the drop of a hat
But Demand #Alimony Maint?
@MyNation_net
@vaa…
RT @heartful_ness: Thousands of @heartful_ness practitioners meditated with Heartfulness Guide @kamleshdaaji at @kanhashantivan & await the…
RT @TurkeyinDelhi: Ambassador Sakir Ozkan Torunlar attended the Joint Session of Parliament of #India and listened the address of H.E. Shri…