1. 序章

このチュートリアルでは、感情分析の概要を示します。 最初に定義を確認し、次に感情分析の種類と関連する計算手法について説明します。

最後に、提示したアプローチの1つのPythonの例をコーディングします。

2. 感情分析とは何ですか?

2.1. 感情の定義

感情は、態度、精神的感情、または何かまたは誰かに対する感情として定義できます。 おそらく、感情は、肯定的であろうと否定的であろうと、レビューまたは意見の形で表現されます。

誰かが「最新バージョンのAndroidOSが気に入らなかった」と言うと、最新バージョンのAndroidOSをレビューするときに悪いまたは否定的な感情を抱きます。

2.2. 感情分析の定義

感情分析とは、自然言語処理(NLP)、計算言語学、機械学習、統計のアルゴリズムとツールを使用して、テキストの感情の向きを判断することを指します。 感情分析は、意見マイニングまたは感情分析としても知られています。

2つの基本的な感情の方向性はポジティブとネガティブです。 これらだけを扱っている場合、それは2つのクラスの感情分析の問題であると言います。

他のいくつかの問題は、ミックスにニュートラルを追加して、3クラスの問題にします。 事実、ニュース、宗教的なテキストなど、意見を持たないステートメントにニュートラルクラスを割り当てます。 たとえば、「COVID-19の活動的な症例が増加している」は、意見のない中立的な発言です。

ニューラルネットワークと深層学習アルゴリズムの台頭により、感情分析の問題には、追加のより洗練されたクラスが必要になります。 基本的な2つか3つのクラスの代わりに、怒り、悲しみ、恐れ、幸せ、驚きなどのクラスがあります。

このチュートリアルでは、ポジティブ、ネガティブ、ニュートラルの3つの基本的なクラスに固執します。

2.3. 使用法

感情分析の主な商用利用は、ソーシャルメディアのページやアカウントでのユーザーの意見の監視、製品レビュー、ホテルレビュー、および非数値の株式市場分析です。これは、メーカー、サービスプロバイダー、および一般の人々がフォロワーや消費者の世論に積極的に取り組む。

ビジネスの例として、消費者の態度をすばやく理解し、それに応じて対応する機能は、ExpediaCanadaが2017年に利用したものです。 彼らは、テレビ広告の1つで使用されている音楽に対する否定的なフィードバックが着実に増加していることに気づきました。

3. 感情分析の種類

3.1. 主観性の識別

このタイプでは、タスクは、指定されたテキストの感情クラスを判別することです。 テキストは通常、文、ツイート、または小さな段落です。

「残念ながら、私のフライトはキャンセルされました」という声明は、否定的な感情を抱いています。 しかし、「新しい電動スクーターに乗るのは楽しかった」と前向きな気持ちを持っています。

3.2. アスペクトベース

このタイプでは、テキストは、同じものまたは同じ人物のさまざまな側面または部分に対してさまざまな感情を持っています。

製品レビューの例で説明しましょう。「このモバイルを1年間使用した後、優れたフルHD画面と優れたバッテリーを備えていると言えますが、特に暗い場所ではカメラが貧弱です。」

その場合、ユーザーはモバイルデバイスに関するレビューを作成しますが、レビューには3つの異なる側面または部分があります。画面、バッテリー、カメラであり、それぞれに独自の感情があります。 画面とバッテリーの場合、感情はポジティブですが、カメラの場合、感情はネガティブです。

このタイプの感情分析には通常、製品とホテルのレビューが含まれており、レビューされたオブジェクトに対する世論を結論付けることはできません

4. 感情分析方法

4.1. レキシコンベースのアプローチ

このアプローチでは、ポジティブおよびネガティブな作品の事前定義された辞書を使用します。

テキストの集約された感情を計算するとき、テキストをトークンまたは単語に分割し、これらのトークンを辞書と照合します。

また、ゼロでカウンター変数を開始します。 正の単語が見つかった場合はカウンターを1つ増やし、負の単語が見つかった場合はカウンターを1つ減らします。

最後に、カウンター値が正の場合、集約された感情は正です。 同様に、カウンター値が負の場合、集約された感情は負になります。 カウンター値がゼロの場合、テキストは中立的な感情を持っていると言います。

このアプローチは非常に基本的であり、業界レベルのソリューションでは広く使用されていません。 実際、アスペクトベースの感情分析では使用できませんでした。 ほとんどの場合、検証にはこのアプローチを使用します。

4.2. 監視されたアプローチ

監視対象のアプローチは、注釈付きデータセットに依存する機械学習ベースのアプローチです。

注釈付きデータセットは、2つの列を含むファイルがあることを意味します。1つはテキスト用で、もう1つはその感情用です。 次に、このファイルを機械学習パイプラインにフィードします。 そのパイプラインは4つの主要なステップを実行しますが、これらに限定されません。

  1. テキストに対するいくつかの前処理ステップ—主にトークン化、ステミング、およびストップワードの削除。
  2. テキスト表現:テキストは機械学習アルゴリズムでは理解できないため、テキストの数値表現とベクトル表現を見つける必要があります。 多くのテキスト表現が利用可能ですが、TF-IDF表現が最も一般的です。
  3. 手順1と2で取得したデータを使用してモデルをトレーニングします。
  4. トレーニングステップで使用されなかったデータを前提として、モデルをテストして、モデルが適切に機能することを確認します。

このアプローチは、業界および本番環境に対応したソリューションで最も広く使用されています。Pythonでその完全な例を後で説明します。

4.3. ハイブリッドアプローチ

このアプローチでは、前の2つのアプローチを組み合わせます。 辞書と注釈付きデータセットの両方が必要です。 まず、監視されたアプローチに従い、次にレキシコンアプローチを使用して結果を検証します。

ハイブリッドアプローチを使用するのは、従来の3つのクラス(ポジティブ、ネガティブ、ニュートラル)がある場合のみです。

5. 実行中の感情分析

ここでは、監視されたアプローチを使用して完全な感情分析を実行するPythonスクリプトを紹介します。 このスクリプトで使用されているデータセットは「USAirlineTweets」です。

import pandas as pd
import re
from sklearn import metrics
from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
from sklearn.naive_bayes import MultinomialNB
import random
import sklearn.model_selection as model_selection

# load data from csv file into Pandas data frame
tweets_df = pd.read_csv('us_airline_tweets.csv')

# print info to check columns types, rows count, and if there are null values in the columns
print(tweets_df.info())

# drop all columns except the sentiment and tweet text columns
tweets_df.drop(tweets_df.columns.difference(['airline_sentiment', 'text']), 1, inplace=True)
# drop duplicated rows
print(tweets_df.drop_duplicates())
# check for null values in the final needed columns
print(tweets_df.isnull().sum())

# some basic pre-processing
# remove links
tweets_df['text'] = tweets_df['text'].apply(lambda x: re.sub(r"(www|http|https|pic)([a-zA-Z\.0-9:=\\~#/_\&%\?\-])*", ' ', x))
# remove mention symbol
tweets_df['text'] = tweets_df['text'].apply(lambda x: x.replace('@', ''))
# remove hashtag symbol
tweets_df['text'] = tweets_df['text'].apply(lambda x: x.replace('#', ''))
# convert all text to lower case (this helps in vectorization and training)
tweets_df['text'] = tweets_df['text'].apply(lambda x: x.lower())

# split dataset
X_train, X_test, y_train, y_test = model_selection.train_test_split(tweets_df['text'],
                                                                    tweets_df['airline_sentiment'],
                                                                    train_size=0.80, test_size=0.20, random_state=101)

# create a pipeline of two steps
# first: tf-idf vectorizer to represent textual data in numeric vectors
# second: MultinomialNB classifier, which is the scikit-learn implementation of Multinomial Naive Bayes
pipeline = Pipeline([
        ('vect', TfidfVectorizer(min_df=0.0001, max_df=0.95, analyzer='word', lowercase=True, ngram_range=(1, 3), stop_words='english')),
        ('clf', MultinomialNB()),
    ])

# train the model
pipeline.fit(X_train, y_train)
feature_names = pipeline.named_steps['vect'].get_feature_names()

# test the model
y_predicted = pipeline.predict(X_test)

# print the classification report
print(metrics.classification_report(y_test, y_predicted))

# print number of features and some samples
print('# of features:', len(feature_names))
print('sample of features:', random.sample(feature_names, 40))

# calculate and print the model testing metrics
accuracy = accuracy_score(y_test, y_predicted)
precision = precision_score(y_test, y_predicted, average='weighted')
recall = recall_score(y_test, y_predicted, average='weighted')
f1 = f1_score(y_test, y_predicted, average='weighted')
print('Accuracy: ', "%.2f" % (accuracy*100))
print('Precision: ', "%.2f" % (precision*100))
print('Recall: ', "%.2f" % (recall*100))
print('F1: ', "%.2f" % (f1*100))

Pythonスクリプトを実行すると、いくつかのメトリックが出力されます。

  • 精度:69.60
  • 精度:72.80
  • リコール:69.60
  • F1:63.07

これらの結果は、実稼働ソリューションには十分ではありませんが、使用されている手法については理解できます。 より多くの前処理ステップとモデルハイパーパラメータの調整により、より良い結果が得られます。

6. 結論

このチュートリアルでは、感情分析の定義、使用法、タイプ、およびアプローチを示しました。

また、3クラスの感情分類のための監視対象モデルをトレーニングする完全なPythonアプリケーションも示しました。