Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで実現するTwitter感情分析の徹底解説|TweepyとTextBlobを使った実装ガイド

感情分析(Sentiment Analysis)とは、ある出来事に対して人々がテキストや音声で残したフィードバックから、その感情(センチメント)を推定するプロセスです。音声による意見も、Pythonプログラムで分析できるようにテキスト形式へ変換する必要があります。人々が表現する感情は「ポジティブ」または「ネガティブ」に大別され、感情テキスト内の各単語に重みを割り当てて数値を算出することで、感情を数学的に評価することが可能になります。

感情分析の主な活用シーン

  • 顧客フィードバック − 企業にとって、自社の商品やサービスに対する顧客の意見を把握することは極めて重要です。顧客の声がテキストとして蓄積されていれば、Twitter上で感情分析を実行し、全体の評価がポジティブ寄りかネガティブ寄りかをプログラムで判定し、迅速な改善策につなげられます。

  • 政治キャンペーン − 政治家にとって、演説を聞いた人々の反応を知ることは非常に重要です。SNSなどのオンラインプラットフォームから市民のフィードバックを収集できれば、特定の演説や政策に対する世論の反応を数値的に測定できます。

  • 政府の施策 − 政府は新しい施策を随時展開しますが、SNS上の世論を分析することで施策への反応を把握できます。実際、多くの市民はTwitterを通じて賞賛や不満を発信しています。

実装のアプローチ

Pythonで感情分析プログラムを構築するには、おおむね以下の手順が必要です。

  • まずTweepyTextBlobをインストールします。TweepyはTwitterからのデータ取得を、TextBlobはテキストの抽出と感情スコアの計算を担当します。

  • Twitter APIで認証を行います。APIキーとアクセストークンを使い、Twitterからデータを取得できるようにします。

  • 取得したツイートのテキストを前処理したうえで、ポジティブ/ネガティブに分類します。

サンプルコード

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):
        # メンション・記号・URLなどを除去してツイートをクリーンアップ
        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))
        # 極性スコア(polarity)に基づいて感情を判定
        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()

実行結果

上記のコードを実行すると、たとえば以下のような結果が得られます。

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…

補足ポイント

  • TextBlobのpolarityは−1.0〜1.0の範囲で返され、値が大きいほどポジティブな感情を示します。本例では簡略化のため2段階に分類していますが、中間値を「中立(neutral)」として扱う3段階評価に拡張すると、より精度の高い分析が可能です。

  • 日本語のツイートを分析する場合は、TextBlobの代わりにMeCabやJanome、osetiなど日本語対応の形態素解析・感情辞書ライブラリを組み合わせることをおすすめします。

  • 現在、X(旧Twitter)APIは仕様変更により有料プランでのみ検索APIを利用できる場合があります。実装前に最新の公式ドキュメントでアクセスレベルをご確認ください。

  1. PythonでのCX_Freezeの使い方:スクリプトを実行ファイル(EXE)に変換する方法

    はじめに 何か面白いものを作りたいという欲求は人間の本能であり、完成したものは誰かに共有したくなるものです。Pythonでもその願いを叶えられます。ただし、作成したPythonスクリプトをそのまま共有するには、相手のマシンにも同じバージョンのPythonと、プログラムで使用しているすべてのモジュールがインストールされている必要があります。 そこで役立つのがCX_Freezeです。このツールを使えば、Pythonがインストールされていない環境でも動作するスタンドアロンの実行ファイル(.exe)を作成できます。 CX_Freezeのインストール まず、コマンドプロンプトで以下のコマンドを実行し、c

  2. PythonのTurtleグラフィックス入門!基本メソッド一覧と図形描画サンプルコード集

    Turtle(タートル)はPythonに標準搭載された特殊な機能で、専用の描画ウィンドウ上に簡単に図形を描くことができるモジュールです。 使い方はとてもシンプルです。まずturtleモジュールをインポートし、次にウィンドウ(Screen)を作成、その後タートルオブジェクトを生成します。あとは各種メソッドを呼び出すだけで、キャンバス上に自由に描画できます。この記事では、よく使われるメソッドの一覧表と、正方形・星・六角形などの具体的な描画例をサンプルコード付きで解説します。 主なTurtleメソッド一覧 メソッド パラメータ 説明 Turtle() なし 新しいタートルオブジェクトを作成