PythonでTextBlobを使ったセンチメント分析

自然言語処理における最先端の技術により、テキスト情報の単純なセグメンテーションから、より洗練されたセンチメントカテゴライズまで、様々なレイヤーで自然言語を分析することができるようになりました。

しかし、Pythonでセンチメント分析のような高度なタスクを実装するためには、必ずしも高度なプログラミングが必要なわけではありません。

センチメント分析

センチメント分析のアルゴリズムは、主にテキストのコーパスに含まれる意見、態度、さらには顔文字を定義することに重点を置いている。

確立されたセンチメントの範囲は、手法によって大きく異なります。

標準的な分析ツールは、最大3つの基本的な極性感情(ポジティブ、ネガティブ、ニュートラル)を定義しますが、より高度なモデルの限界はより広範です。

その結果、極性を超えて、6つの「普遍的」感情(怒り、嫌悪、恐怖、幸福、悲しみ、驚きなど)を決定することができます。

Scale of Emotions

出典 スペクトラムメンタルヘルス

さらに、作業内容によっては、著者やトピックなどの文脈から余分な情報を収集し、さらに分析することで、一般的な極性分類よりも複雑な問題、すなわち主観・客観の識別を防ぐことも可能です。

例えば、Business insiderのこの一文。

“3月、イーロン・マスクはコロナウイルス発生への懸念を「パニック」「間抜け」と表現し、それ以来、子どもはウイルスに対して「本質的に免疫がある」という持論など、誤った情報をツイートしている。

” は、文章の著者と同様にE・マスクの個人的意見を通じて主観を表現しています。

PythonでTextBlobを使ったセンチメント分析

TextBlobパッケージがセンチメント分析に適用するアプローチは、ルールベースであるため、事前に定義された分類された単語のセットが必要であるという点で異なります。

これらの単語は、例えばNLTKのデータベースからアップロードすることができます。

さらに、意味関係や入力文中の各単語の頻度に基づいて感情を定義し、結果としてより正確な出力を得ることができる。

最初のステップが完了し、Pythonモデルに必要な入力データが与えられると、前のセクションで説明した極性および主観性の形式でセンチメントスコアを得ることができます。

このプロセスがどのように行われるかは、Forum Kapadiaによるこの論文で見ることができます。

TextBlobの極性タスクの出力は、範囲 [-1.0, 1.0] 内のフロートで、-1.0 は負の極性、1.0 は正の極性を表します。

このスコアは 0 と等しくなることもあります。

これは、学習セットに含まれる単語がないため、文が中立的な評価であることを意味します。

一方、主観・客観の識別タスクでは、[0.0, 1.0] の範囲内の浮動小数点数が報告されます。

ここで 0.0 は非常に客観的な文、 1.0 は非常に主観的な文となります。

PythonとTextBlobの連携は様々な例があります。

Kaggleのデータセット(例:映画のレビュー)を元にしたモデルから、Twitter APIを使ってツイートのセンチメントを計算する例まであります。

ここでは、特定の文や短いテキストに適用できる簡単な解析器を見てみましょう。

まず、TextBlobライブラリをインポートするところから始めます。

# Importing TextBlob
from textblob import TextBlob


インポートしたら、分析する文章を読み込んで、TextBlobオブジェクトをインスタンス化し、sentimentプロパティを独自のanalysisに割り当てます。

# Preparing an input sentence
sentence = '''The platform provides universal access to the world's best education, partnering with top universities and organizations to offer courses online.'''


# Creating a textblob object and assigning the sentiment property
analysis = TextBlob(sentence).sentiment
print(analysis)


SentimentプロパティはSentiment(polarity, subjectivity)形式のnamedtuple` です。

ここで、解析の期待される出力は

Sentiment(polarity=0.5, subjectivity=0.26666666666666666)


さらに、以下のように実行するだけで、極性や主観の結果を別々に取りに行くことも可能です。

from textblob import TextBlob


# Preparing an input sentence
sentence = '''The platform provides universal access to the world's best education, partnering with top universities and organizations to offer courses online.'''


analysisPol = TextBlob(sentence).polarity
analysisSub = TextBlob(sentence).subjectivity


print(analysisPol)
print(analysisSub)


という出力が得られます。

0.5
0.26666666666666666


TextBlobの素晴らしいところは、高レベルの自然言語処理タスクの実装に、ユーザーがアルゴリズムを選択できることです。

  • PatternAnalyzer – パターンライブラリで構築されたデフォルトの分類器。
  • NaiveBayesAnalyzer – 映画レビューのコーパスで学習した NLTK のモデル

デフォルトの設定を変更するために、コード内で NaiveBayes アナライザーを指定するだけです。

Twitterから直接ツイートに対して感情分析を実行してみましょう。

from textblob import TextBlob
# For parsing tweets
import tweepy


# Importing the NaiveBayesAnalyzer classifier from NLTK
from textblob.sentiments import NaiveBayesAnalyzer


その後、API キー(開発者アカウントで取得可能)を使って Twitter API との接続を確立する必要があります。

# Uploading api keys and tokens
api_key = 'XXXXXXXXXXXXXXX'
api_secret = 'XXXXXXXXXXXXXXX'
access_token = 'XXXXXXXXXXXXXXX'
access_secret = 'XXXXXXXXXXXXXXX'


# Establishing the connection
twitter = tweepy.OAuthHandler(api_key, api_secret)
api = tweepy.API(twitter)


これで、任意のトピックに関するツイートの解析を実行できるようになります。

検索される単語(例:ロックダウン)は、1単語でも複数でもかまいません。

さらに、この作業は膨大な量のツイートがあるため、時間がかかることがあります。

出力を制限することをお勧めします。

# This command will call back 5 tweets within a “lockdown” topic
corpus_tweets = api.search("lockdown", count=5) 
for tweet in corpus_tweets:
    print(tweet.text)


この最後のコードの出力は、次のような形で検索した単語に言及しているツイートを5件返します。

RT@DhwaniPandya: How Asia's densest slum contained the virus and the economic catastrophe that stares at the hardworking slum population...


この例の最後のステップは、デフォルトのモデルを、結果を namedtuple 形式で返す NLTK アナライザーに切り替えることです。

Sentiment(classification, p_pos, p_neg)という形式のnamedtuple` として結果を返します。

# Applying the NaiveBayesAnalyzer
blob_object = TextBlob(tweet.text, analyzer=NaiveBayesAnalyzer())
# Running sentiment analysis
analysis = blob_object.sentiment
print(analysis)


最後に、Pythonのモデルは以下のようなセンチメント評価を得ることができます。

Sentiment(classification='pos', p_pos=0.5057908299783777, p_neg=0.49420917002162196)


ここでは、p_posp_neg の値がそれぞれ ~0.5 で、肯定的な感情として分類されました。

結論

今回は、Sentiment Analysisとは何かを説明した後、TextBlobライブラリを使って取り込んだ文章やツイートに対してSentiment Analysisを行う方法を説明しました。

タイトルとURLをコピーしました