Data Science

Python によるセンチメント分析入門

Read this post in other languages:

センチメント分析は最も一般的なテキストの分析手法の 1 つです。 広範な領域にわたる人の感情を一目で確認することができ、カスタマーサービス、市場調査や製品調査、競合分析などの分野での応用に役立ちます。

自然言語処理(NLP)のどの領域でもそうですが、センチメント分析も複雑になりがちです。 幸いにも、Python にはこの NLP の分野を非常に親しみやすくする優れたパッケージとツールが備わっています。

このブログ記事では、Python によるセンチメント分析に使用される最も一般的なパッケージ、その分析の仕組み、および最先端の手法で独自のセンチメント分析モデルをトレーニングする方法について詳しく説明します。 また、そのようなパッケージを迅速かつ容易に扱えるようにする PyCharm の機能についても見ていきます。

センチメント分析とは?

センチメント分析は、テキストを分析してその感情のトーンを判定するプロセスです。 この定義からお分かりかと思いますが、センチメント分析は自然言語処理の分野に多様な手法を取り入れた非常に幅広い分野です。

「感情のトーン」の定義には多くの方法があります。 最も一般的に使用されているのは、テキストの感情価または極性、つまりテキストに表れているセンチメントが肯定的であるか否定的であるかを判定する方法です。 感情のトーンは、テキストが肯定的か否定的かに分類されるテキスト分類の問題としてもよく扱われます。

以下の Amazon 製品レビューを例に見てみましょう。

この顧客は明らかに満足していないため、このレビューはセンチメント分析の手法では否定的であると分類されるでしょう。

これとは逆に、以下の非常に満足している購入者のレビューを見てみましょう。

この場合、このレビューはセンチメント分析の手法によって肯定的だと分類されるでしょう。

センチメント分析の種類

テキストから感情に関する情報を抽出する方法は複数あります。 最も重要な方法をいくつか見てみましょう。

センチメントの定義方法

まずはセンチメント分析の方法ですが、これにはセンチメントや感情の定義方法がいくつか存在します。

二項式: SST-2 データセットと同様に、ドキュメントの感情価が肯定的または否定的の 2 つのカテゴリに分類されます。 これに関連して、中立クラス(テキストにトピックに関するセンチメントが表れていない)または競合クラス(テキストにトピックに関する肯定的なセンチメントと否定的なセンチメントの両方が表れている)を追加する感情価の分類があります。

センチメント分析ツールによっては関連する評価基準を使用し、テキストを主観的または客観的に分類するものもあります。

細分化: この用語は複数の異なるセンチメント分析の取り組み方法を表しますが、この記事では肯定的な感情価と否定的な感情価をリッカート尺度に分類することを指します。 よく知られているこの方法の例には、非常に肯定的肯定的中立否定的、および非常に否定的の 5 段階のリッカート尺度を使用するSST-5 データセットがあります。

連続: テキストの感情価は、書き手のセンチメントがどの程度肯定的または否定的であったかを示すスコアによって連続的に評価することもできます。 たとえば、VADER センチメント分析ツールではテキストに -1(非常に否定的)から 1(非常に肯定的)のスコアが付けられ、スコアが 0 に近いほどセンチメントが中立的であることが示されます。

感情ベース: 感情検出または感情識別としても知られ、テキストに表れている特定の感情の検出を試みる方法です。 これは 2 つの手法で実施できます。 カテゴリ感情検出では、テキストが表しているセンチメントをいくつかの別々の感情に分類します。通常は、エクマンモデルに基づき、怒り嫌悪恐れ喜び悲しみ驚きに分類されます。 この種の感情検出に使用できる多数のデータセットが存在します。 次元感情検出はセンチメント分析ではあまり一般的に使用されておらず、代わりにテキストの極性覚醒度(どの程度感情が高ぶっているか)、および支配度(感情表現がどれくらい制限されているか)の 3 つの感情的側面の評価を試みます。

分析のレベル

テキストを分析する際には複数の異なるレベルを検討することもできます。 これについて理解を深めるため、コーヒーメーカーに関する別のレビューを見てみましょう。

ドキュメントレベル: 最も基本的な分析のレベルです。テキスト全体に対して 1 つのセンチメントが返されます。 ドキュメントレベルの分析はツイートなどの短いテキストに対しては十分かもしれませんが、異なるセンチメントが混在している場合は誤解を招く結果を返す可能性があります。 たとえば、このレビューのセンチメント分析をドキュメント全体に基づいて行った場合、中立または競合と分類される可能性があります。同じコーヒーメーカーについて相反する 2 つのセンチメントが含まれているためです。

文レベル: 各文のセンチメントが個別に予測されます。 このコーヒーメーカーのレビューの場合、文レベル分析では、レビュー投稿者が製品のある部分については肯定的に感じ、別の部分では否定的に感じていることが示されるでしょう。 ただし、この分析ではレビュー投稿者のこのコーヒーメーカーに対する満足点と不満点が何なのかは示されません。

アスペクトベース: この種のセンチメント分析は、テキストを深く調べ、特定の側面に関するユーザーのセンチメントを理解しようとします。 このコーヒーメーカーのレビューの場合、レビュー投稿者は外観騒音という 2 つの側面(アスペクト)について述べています。 これらのアスペクトを抽出することで、ユーザーの具体的な満足点と不満点に関する情報をさらに得ることができます。 コーヒーメーカーの外観については肯定的なセンチメントがありますが、その騒音については否定的なセンチメントがあります。

センチメント分析と他の NLP 手法の組み合わせ

インテントベース: この最後の種類のセンチメント分析では、テキストに表れているセンチメントとテキストのトピックの 2 つの観点でテキストが分類されます。 たとえば、ある通信会社がサービスが頻繫にダウンするという苦情のチケットを受け取った場合、そのテキストの意図(インテント)やトピックはサービスの信頼性、センチメントは否定的と分類されるかもしれません。 アスペクトベースのセンチメント分析と同様に、この分析では全体的な顧客満足度よりもはるかに多くの情報を得られます。

センチメント分析の応用

この時点でセンチメント分析を使用できそうな状況をいくつか想定できているかもしれません。 この分析は基本的にテキスト形式のフィードバックやトピックに関する意見を得られるあらゆる状況で使用できます。 組織や個人はセンチメント分析を使うことで、ソーシャルメディアを監視し、ブランド、政府組織、またはトピックに関する人の感情を知ることができます。

顧客フィードバック分析は、フィードバックやチケットに表れているセンチメントを調べるために使用できます。 製品レビューの分析では、会社の製品に対する満足度を把握することができます。 最後に付け加えますが、センチメント分析は市場調査と競合分析の重要な要素となる場合があることを伝えておきます。新しいトレンド、機能、および競合会社に対する人の感情を知ることで、会社の戦略を導くことが可能だからです。

センチメント分析の仕組み

センチメント分析は、概して単語(または、より高度なモデルではテキストの全体的なトーン)を感情に関連付けることによって機能します。 最も一般的なセンチメント分析の手法は、以下の 3 つのいずれかの方法になります。

辞書ベースの手法

この手法では、さまざまな単語のセンチメントスコアを含む辞書を使用します。 一連のルールを使用してスコアを組み合わせ、テキストに対する全体的なセンチメントを取得する手法です。 この手法は非常に素早く処理される傾向にあり、より粒度の高い連続的なセンチメントスコアを得られるメリットもあります。 ただし、辞書を手作業で作成する必要があるため、作成には時間がかかり、コストが高くつく場合があります。

機械学習モデル

この手法は、テキストとそのセンチメントラベルを含む映画レビューなどのデータセットで機械学習モデル(最も一般的に使用されているのは単純ベイズ分類器)をトレーニングします。 このモデルでは、テキストは肯定的、否定的、時には中立的と一般的に分類されます。 このようなモデルは非常に高速に動作する傾向もありますが、通常は入力内の単語間の関係が考慮されないため、修飾語や否定を含むより複雑なテキストでは苦労する可能性があります。

大規模言語モデル

この手法は前述した機械学習分類器のトレーニングに使用されたものと同じデータセットを使用し、事前にトレーニングされた Transformer ベースの大規模言語モデルをファインチューニングします。 このような高度なモデルはテキスト内の単語間の複雑な関係をモデリングできますが、他の 2 つの手法に比べると動作が遅くなる傾向があります。

Python によるセンチメント分析

Python には NLP 向けの豊富なパッケージを提供するエコシステムがあるため、この言語でのセンチメント分析で選択肢に困ることはありません。

最も一般的なセンチメント分析向けの Python パッケージをいくつか見てみましょう。

センチメント分析に最適な Python ライブラリ

VADER

VADER(Valence Aware Dictionary and Sentiment Reasoner)は、一般的な辞書ベースのセンチメント分析ツールです。 この分析ツールは強力な NLTK パッケージに組み込まれており、テキストの肯定的中立的、または否定的な度合と、センチメントスコアの複合の 4 つのセンチメントスコアを返します。 肯定的、中立的、および否定的のスコアの範囲は 0 から 1 で、肯定的、中立的、または否定的なテキストの割合を示します。 複合スコアの範囲は -1(非常に否定的)から 1(非常に肯定的)で、テキストの全体的な感情価を示します。

その仕組みについて基本的な例を見てみましょう。

from nltk.sentiment.vader import SentimentIntensityAnalyzer
import nltk

まず、VADER 辞書をダウンロードする必要があります。

nltk.download('vader_lexicon')

続けて VADER の SentimentIntensityAnalyzer() をインスタンス化し、polarity_scores() メソッドでセンチメントスコアを抽出できます。

analyzer = SentimentIntensityAnalyzer()

sentence = "I love PyCharm! It's my favorite Python IDE."
sentiment_scores = analyzer.polarity_scores(sentence)
print(sentiment_scores)
{'neg': 0.0, 'neu': 0.572, 'pos': 0.428, 'compound': 0.6696}

VADER はこのテキストの全体的なセンチメントスコアを 0.67 とし、その内容の 43% が肯定的、57% が中立的、0% が否定的と分類したことがわかります。

VADER は各単語のセンチメントスコアを辞書で探し、それぞれに微妙に異なる一連のルールを使用してスコアを組み合わせます。 たとえば、単語の前の「a bit(少し)」がセンチメントの強度を低めたり、「extremely(非常に)」が強度を高めたりするなど、修飾語によって単語のセンチメントの強度が変わる場合があります。

VADER の辞書には「smh(首を横に振る)」などの略語や絵文字などが含まれているため、特にソーシャルメディアのテキストに最適です。 VADER の主な制限事項は英語以外の言語では機能しないことですが、vader-multi などのプロジェクトを代わりに利用できます。 VADE の仕組みについての記事を投稿していますので、ご興味がある方はそちらでこのパッケージへの理解を深めてください。

NLTK

さらには NLTK を使用し、scikit-learn の分類器で独自の機械学習ベースのセンチメント分類器をトレーニングすることができます。

これらのモデルに入力するテキストの処理方法は多数ありますが、テキストに存在する単語に基づいて行う方法が最も簡単です。これは Bag-of-Words(BoW)手法と呼ばれる一種のテキストモデリング手法です。 最も単純明快な BoW モデリングの手法はバイナリベクトル化です。この手法では各単語が特徴量として扱われ、その特徴量の値が 0 または 1(テキストに単語が存在しない、する、をそれぞれ意味する)で表されます。

テキストデータと NLP の扱いに不慣れで、テキストを機械学習モデル用の入力データに変換する方法を詳しく知りたい方は、このトピックを簡単に紹介している私の講演をご覧ください。

NLTK のドキュメントには、テキストが主観的か客観的かを予測するように単純ベイズ分類器をトレーニングする例が掲載されています。 この例ではいくつかの用語に追加の否定修飾語が追加されていますが、これは単語や文字がテキスト内の他の場所に表れたセンチメントを否定している可能性があるかどうかを示すルールに基づいて行われています。 Real Python にも NLTK を使用して独自の分類器をトレーニングするセンチメント分析のチュートリアルがあり、このトピックに関する知識を深めることができます。

Pattern と TextBlob

Pattern パッケージは、センチメントの分析に対する別の辞書ベースの手法を提供するものです。 また、WordNet の各同義語グループ(synset)に肯定的、否定的、および客観的のスコアが割り当てられた SentiWordNet 辞書を使用しています。 一連のルールを使用して各単語の肯定的スコアと否定的スコアが組み合わされ、最終的な極性スコアが割り出されます。 同様に、各単語の客観的スコアが組み合わされて最終的な主観的スコアが割り出されます。

WordNet には品詞情報が含まれているため、これらのルールでは単語の前にある形容詞や副詞がその単語のセンチメントを変えるかどうかが考慮されます。 ルールセットには否定語、感嘆符、および絵文字を考慮し、慣用句や皮肉も処理できるルールも含まれています。

ただし、スタンドアロンのライブラリである Pattern は Python 3.6 にしか対応していません。 そのため、Pattern は TextBlob を通して使用するのが最も一般的です。 TextBlob センチメント分析ツールは Pattern ライブラリの独自の実装をデフォルトで使用し、センチメントスコアを生成します。

では、その動作を実際に見てみましょう。

from textblob import TextBlob

テキストに対して TextBlob メソッドが実行され、sentiment 属性を使用してセンチメントが抽出されているのがわかります。

pattern_blob = TextBlob("I love PyCharm! It's my favorite Python IDE.")
sentiment = pattern_blob.sentiment

print(f"Polarity: {sentiment.polarity}")
print(f"Subjectivity: {sentiment.subjectivity}")
Polarity: 0.625
Subjectivity: 0.6

この文の例では、TextBlob 内の Pattern により、極性スコア 0.625 (VADER が出したスコアに比較的近い)と主観性スコア 0.6 が返されました。

しかし、TextBlob にはセンチメントスコアの取得方法がもう 1 つあります。 このパッケージにはテキストに肯定的または否定的とラベルを付け、テキストが肯定的か否定的かの確率を示す事前トレーニング済みの単純ベイズ分類器も含まれています。

この方法を使用するには、NLTK から punkt モジュールとこのモデルのトレーニングに使用された movie-reviews データセットの両方を最初にダウンロードする必要があります。

import nltk
nltk.download('movie_reviews')
nltk.download('punkt')

from textblob import TextBlob
from textblob.sentiments import NaiveBayesAnalyzer

テキストに対してもう一度 TextBlob を実行する必要がありますが、今度は analyzer=NaiveBayesAnalyzer() 引数を追加します。 そして前回と同様、sentiment 属性を使用してセンチメントスコアを抽出します。

nb_blob = TextBlob("I love PyCharm! It's my favorite Python IDE.", analyzer=NaiveBayesAnalyzer())
sentiment = nb_blob.sentiment
print(sentiment)
Sentiment(classification='pos', p_pos=0.5851800554016624, p_neg=0.4148199445983381)

今度はテキストが 59% の確率で肯定的であり、41% の確率で否定的であることをモデルが予測し、pos(positive、肯定的)というラベルが付けられました。

spaCy

spaCy もセンチメント分析に使用できます。 spaCy も Python による NLP 向けの一般的なパッケージであり、テキスト処理用の幅広いオプションを備えています。

第一の方法としては、spacytextblob プラグインを使用して TextBlob センチメント分析ツールを spaCy パイプラインに組み込む方法が挙げられます。 これを行うには、最初に spacyspacytextblob の両方をインストールし、適切な言語モデルをダウンロードする必要があります。

import spacy
import spacy.cli
from spacytextblob.spacytextblob import SpacyTextBlob

spacy.cli.download("en_core_web_sm")

次はこの言語モデルを読み込み、テキストを処理するパイプラインに spacytextblob を追加します。 TextBlob は spaCy の pipe メソッドを介して使用できます。つまり、品詞のタグ付け、 レンマ化、固有表現認識といった前処理ステップなど、より複雑なテキスト処理パイプラインに組み込むことが可能です。 前処理によってテキストの正規化とリッチ化を行い、下流のモデルがテキスト入力を最大限に活用できるようになります。

nlp = spacy.load('en_core_web_sm')
nlp.add_pipe('spacytextblob')

この時点では前処理なしで単にサンプルの文を分析します。

doc = nlp("I love PyCharm! It's my favorite Python IDE.")

print('Polarity: ', doc._.polarity)
print('Subjectivity: ', doc._.subjectivity)
Polarity:  0.625
Subjectivity:  0.6

上記の TextBlob を使用した場合と同じ結果が得られました。

spaCy によるセンチメント分析には、TextCategorizer クラスを使用して独自のモデルをトレーニングする方法もあります。 この方法では、spaCy が作成したさまざまなモデルをセンチメント分析のトレーニングセットを使用してトレーニングできます。 これも spaCy のパイプラインに組み込めるため、モデルをトレーニングする前にテキストを前処理するための選択肢はたくさんあります。

最後に付け加えますが、spacy-llm を通して大規模現モデルを使用したセンチメント分析を実行できます。 それにより、OpenAI、Anthropic、Cochere、および Google 独自のさまざまな大規模言語モデル(LLM)にプロンプトを送信し、テキストのセンチメント分析を実行できます。

この手法は、これまでに説明したどの方法とも若干異なる動きをします。 モデルをトレーニングする代わりに、GPT-4 などの汎用モデルを使用してテキストのセンチメントを予測できます。 これはゼロショット学習(例を使わずにプロンプトだけをモデルに渡す手法)またはフューショット学習(プロンプトといくつかの例をモデルに渡す手法)のいずれかで行われます。

Transformers

最後にご紹介する Python のセンチメント分析向けパッケージは、Hugging FaceTransformers です。

Hugging Face は無料で使用できるすべての主要オープンソース LLM(コンピュータービジョンや音声モデルなどの多様なモデル)をホストしており、これらのモデルをトレーニング、デプロイ、および共有できるプラットフォームを提供しています。 その Transformers パッケージでは、Hugging Face がホストする LLM を使用するための広範な機能(センチメント分析を含む)が提供されています。

センチメント分析ツールの結果の理解

Python によるすべてのセンチメント分析方法を取り上げましたが、これを自分のデータにどのように適用できるのかと疑問に思われているかもしれません。

それを理解するため、PyCharm で VADER と TextBlob の 2 つのパッケージを比較してみましょう。 それらの複数のセンチメントスコアから、データに対するいくつかの異なる視点を得られます。 これらのパッケージを使用して、Amazon のレビューデータセットを分析してみましょう。

PyCharm Professional はデータサイエンス向けの強力な Python IDE です。高度な Python のコード補完、インスペクションとデバッグ、リッチなデータベースJupyterGitConda などをすべて初期状態でサポートしています。 さらには DataFrame の列統計チャートビューのほか、LLM を素早く簡単に処理できる Hugging Face との統合などの非常に便利な機能も備わっています。 このブログ記事では、DataFrame の処理に関わる PyCharm の高度な機能を詳しく説明します。それにより、センチメントスコアが 2 つのパッケージ間でどのように分布しているかを簡単に把握できるようになります。

独自のセンチメント分析プロジェクトを開始できる状態になったら、PyCharm の 3 か月間無料サブスクリプションを有効化できます。 以下のリンクをクリックし、プロモコ―ド「PCSA24」を入力してください。 すると、アクティベーションコードがメールで届きます。

最初に行うのは、データの読み込みです。 Datasets パッケージの load_dataset() メソッドを使用して、Hugging Face Hub のこのデータをダウンロードします。

from datasets import load_dataset
amazon = load_dataset("fancyzhx/amazon_polarity")

データセット名にポインターを合わせると、PyCharm 内で Hugging Face データセットカードを直接確認できます。IDE から離れずに Hugging Face アセットに関する情報を得られるので便利です。

このデータセットの内容は以下のようになっています。

amazon
DatasetDict({
    train: Dataset({
        features: ['label', 'title', 'content'],
        num_rows: 3600000
    })
    test: Dataset({
        features: ['label', 'title', 'content'],
        num_rows: 400000
    })
})

train データセットには 360 万個の観測値があり、test データセットには 40 万個が含まれています。 このチュートリアルでは train データセットを使用します。

では、VADER の SentimentIntensityAnalyzer と TextBlob のメソッドを読み込みましょう。

from nltk.sentiment.vader import SentimentIntensityAnalyzer
import nltk

nltk.download("vader_lexicon")

analyzer = SentimentIntensityAnalyzer()
from textblob import TextBlob

train データセットは観測値が多すぎるため、簡単には可視化できません。そこで、1,000 件のレビューをサンプルとしてランダムに取得し、それをすべてのレビュー投稿者を代表する一般的なセンチメントとします。

from random import sample
sample_reviews = sample(amazon["train"]["content"], 1000)

これらの各レビューについて、VADER と TextBlob のスコアを取得しましょう。 各レビューテキストをループ処理の中でセンチメント分析ツールに通し、スコアを専用のリストに追記します。

vader_neg = []
vader_neu = []
vader_pos = []
vader_compound = []
textblob_polarity = []
textblob_subjectivity = []

for review in sample_reviews:
   vader_sent = analyzer.polarity_scores(review)
   vader_neg += [vader_sent["neg"]]
   vader_neu += [vader_sent["neu"]]
   vader_pos += [vader_sent["pos"]]
   vader_compound += [vader_sent["compound"]]
  
   textblob_sent = TextBlob(review).sentiment
   textblob_polarity += [textblob_sent.polarity]
   textblob_subjectivity += [textblob_sent.subjectivity]

次に、これらのリストを独立した列として pandas DataFrame に格納します。

import pandas as pd

sent_scores = pd.DataFrame({
   "vader_neg": vader_neg,
   "vader_neu": vader_neu,
   "vader_pos": vader_pos,
   "vader_compound": vader_compound,
   "textblob_polarity": textblob_polarity,
   "textblob_subjectivity": textblob_subjectivity
})

これで結果を調べられるようになりました。

通常、この時点で探索的データ分析のコードを作成し始めます。 分析のコードは列の要約統計を取得する pandas の describe メソッドを使用して作成することができ、Matplotlibseaborn のコードを書くことで結果を可視化できます。 PyCharm にはこの作業を高速化する機能が備わっています。

では DataFrame を出力してみましょう。

sent_scores

右上に Show Column Statistics(列統計の表示)というボタンがあります。 これをクリックすると、Compact(コンパクト)と Detailed(詳細)という 2 つのオプションが表示されます。 Detailed(詳細)を選択しましょう。

要約統計が列ヘッダーの一部として表示されるようになりました! その統計を見ると、VADER の複合スコアの平均値が 0.4(中央値 = 0.6)であるのに対し、TextBlob の極性スコアの平均値が 0.2(中央値 = 0.2)になっているのがわかります。

この結果は、VADER が概して TextBlob よりも同じセットのレビューをより肯定的だと評価する傾向があることを示しています。 また、両方のセンチメント分析ツールで否定的なレビューよりも肯定的なレビューが多い傾向にあることもわかります。これについては、いくつかの可視化表現を確認して詳しく調べることができます。

DataFrame の Chart View(チャートビュー)という PyCharm の別の機能を使用することもできます。 この機能のボタンは左上にあります。

このボタンをクリックすると、チャートエディターに切り替わります。 ここから先は、DataFrame からノーコードの可視化表現を直接作成できます。

まずは VADER の複合スコアから始めましょう。 このチャートを作成するには、右上にある Show Series Settings (系列の設定を表示)に移動します。

X Axis(X 軸)と Y Axis(Y 軸)のデフォルト値を除去します。 X Axis(X 軸)の値を vader_compound に、Y Axis(Y 軸)の値を vader_compound に置き換えます。 Y Axis(Y 軸)フィールドの変数名の横にある矢印をクリックし、count を選択します。

最後に、Series Settings(系列の設定)のすぐ下にある Histogram(ヒストグラム)チャートアイコンを選択します。 VADER の複合スコアは二峰性分布になり、-0.8 前後で若干のピーク、0.9 前後でかなり大きなピークが現われていそうです。 これらのピークが否定的なレビューと肯定的なレビューの境界になっている可能性があります。 また、肯定的なレビューのほうが否定的なレビューよりもはるかに多くなっています。

同じ操作を繰り返してヒストグラムを作成し、TextBlob の極性スコアの分布を見てみましょう。

対照的に、TextBlob ではほとんどのレビューが中立的として評価される傾向にあり、非常に肯定的または否定的なレビューはほとんどありません。 これらの 2 つのセンチメント分析ツールでこのような矛盾が出る理由を理解するため、VADER が非常に肯定的だと評価したレビューと、VADER が非常に否定的だと評価したにもかかわらず TextBlob が中立的だと評価したレビューを見てみましょう。

VADER が肯定的だと評価し、TextBlob が中立的だと評価した最初のレビューのインデックスを取得します。

sent_scores[(sent_scores["vader_compound"] >= 0.8) & (sent_scores["textblob_polarity"].between(-0.1, 0.1))].index[0]
42

次に、VADER が否定的だと評価し、TextBlob が中立的だと評価した最初のレビューのインデックスを取得します。

sent_scores[(sent_scores["vader_compound"] <= -0.8) & (sent_scores["textblob_polarity"].between(-0.1, 0.1))].index[0]
0

まずは肯定的なレビューを取得しましょう。

sample_reviews[42]
"I love carpet sweepers for a fast clean up and a way to conserve energy. The Ewbank Multi-Sweep is a solid, well built appliance. However, if you have pets, you will find that it takes more time cleaning the sweeper than it does to actually sweep the room. The Ewbank does pick up pet hair most effectively but emptying it is a bit awkward. You need to take a rag to clean out both dirt trays and then you need a small tooth comb to pull the hair out of the brushes and the wheels. To do a proper cleaning takes quite a bit of time. My old Bissell is easier to clean when it comes to pet hair and it does a great job. If you do not have pets, I would recommend this product because it is definitely well made and for small cleanups, it would suffice. For those who complain about appliances being made of plastic, unfortunately, these days, that's the norm. It's not great and plastic definitely does not hold up but, sadly, product quality is no longer a priority in business."

このレビューは複雑に見えますが、全体的にはやや肯定的です。

では、否定的なレビューを見てみましょう。

sample_reviews[0]
'The only redeeming feature of this Cuisinart 4-cup coffee maker is the sleek black and silver design. After that, it rapidly goes downhill. It is frustratingly difficult to pour water from the carafe into the chamber unless it\'s done extremely slow and with accurate positioning. Even then, water still tends to dribble out and create a mess. The lid, itself, is VERY poorly designed with it\'s molded, round "grip" to supposedly remove the lid from the carafe. The only way I can remove it is to insert a sharp pointed object into one of the front pouring holes and pry it off! I\'ve also occasionally had a problem with the water not filtering down through the grounds, creating a coffee ground lake in the upper chamber and a mess below. I think the designer should go back to the drawing-board for this one.'

このレビューは明らかに否定的です。 この 2 つの比較結果からは VADER の方が正確に見えますが、テキスト内の肯定的な言葉を過度に優先する傾向があります。

最後に考慮できるのは、個々のレビューがどの程度主観的または客観的であるかということです。 これは、TextBlob の主観性スコアのヒストグラムを作成することによって判断できます。

興味深いことに、レビューには主観性が適切に分散されており、ほとんどのレビューには主観的な記述と客観的な記述が混在しています。 また、少数のレビューは非常に主観的(1 に近い)または非常に客観的(0 に近い)となっています。

これらのスコアを利用すると、データをうまく分割することができます。 製品に関する満足点と不満点を客観的に把握する必要がある場合は、主観性スコアが低く、VADER の複合スコアがそれぞれ 1 と -1 に近いレビューに注目するとよいでしょう。

逆に、製品に対する感情的な反応を知りたい場合は、主観性スコアが高く、VADER の複合スコアが低いレビューを確認するとよいでしょう。

考慮事項

あらゆる自然言語処理の問題と同様に、センチメント分析を行う際には注意すべき事項がいくつかあります。

最も重要な考慮事項の 1 つには、分析しようとしているテキストの言語があります。 辞書ベースの多くの手法は限られた言語にしか機能しないため、そのような辞書が対応していない言語を処理する場合は、ファインチューニングされた LLM を使用したり、独自のモデルを使用したりするなど、別の手法を採用する必要がある場合があります。

テキストが複雑になるほど、辞書ベースの分析ツールと BoW ベースのモデルではセンチメントを正確に検出するのが困難になる可能性もあります。 皮肉やより文脈を示す微妙な要素は比較的単純なモデルでは検出しにくく、そういったモデルではそのようなテキストのセンチメントを正確に分類できない可能性があります。 LLM は比較的複雑なテキストを処理できるかもしれませんが、さまざまなモデルで実験する必要があります。

最後にお伝えしておきますが、センチメント分析を行う際にはあらゆる機械学習問題を扱う場合と同じ問題が発生します。 モデルの良し悪しは、使用するトレーニングデータによって決まります。 問題の分野に最適な高品質なトレーニングデータセットとテストデータセットを取得できなければ、ターゲットオーディエンスのセンチメントを正しく予測することはできません。

また、ターゲットがビジネスの問題に適していることを確認することも必要です。 製品が顧客に「悲しみ」、「怒り」、または「嫌悪」のどの感情を与えているかを調べるためのモデルを構築することは魅力的に思えるかもしれませんが、それが製品をどのように改善するのかを決めるのに役立たないのあれば、問題の解決にはなりません。

まとめ

このブログ記事では Python によるセンチメント分析の魅力的な部分を詳しく確認し、この複雑な分野がさまざまな強力なパッケージによってどのように取り組みやすくなるかを示しました。

センチメント分析の潜在的な応用、センチメントのさまざまな評価方法、テキストからセンチメントを抽出する主な方法について説明しました。 また、モデルの処理と結果の解釈を迅速かつ高速に行える PyCharm の便利な機能もいくつか確認しました。

現在の自然言語処理の分野では大規模言語モデルに重点が置かれていますが、センチメント分析では辞書ベースの分析ツールや単純ベイズ分類器などの従来の機械学習モデルを使用する以前の手法も依然として重要な役割を果たしています。 これらの手法は、比較的単純なテキストを分析する場合や、速度、予測、または導入の容易さが優先される場合に威力を発揮します。 LLM は比較的複雑なテキストや微妙なテキストに最適です。

基礎を理解したら、LLM を使ったセンチメント分析の方法をチュートリアルで学習することをお勧めします。 段階的なガイドにより、タスクに適したモデルの選択やセンチメント分析での使用方法を発見し、さらには自分でファインチューニングを行うこともできるようになります。

このブログ記事を終えた後も自然言語処理や機械学習についてさらに幅広く学習を続けたい方は、以下のリソースをご利用ください。

今すぐ PyCharm でセンチメント分析を始めましょう

独自のセンチメント分析プロジェクトを開始できる状態になったら、PyCharm の 3 か月間無料サブスクリプションを有効化できます。 以下のリンクをクリックし、プロモコ―ド「PCSA24」を入力してください。 すると、アクティベーションコードがメールで届きます。

 
オリジナル(英語)ブログ投稿記事の作者:
 
Jodie Burchell

Jodie Burchell

Dr. Jodie Burchell is the Developer Advocate in Data Science at JetBrains, and was previously a Lead Data Scientist at Verve Group Europe. She completed a PhD in clinical psychology and a postdoc in biostatistics, before leaving academia for a data science career. She has worked for 7 years as a data scientist in both Australia and Germany, developing a range of products including recommendation systems, analysis platforms, search engine improvements and audience profiling. She has held a broad range of responsibilities in her career, doing everything from data analytics to maintaining machine learning solutions in production. She is a long time content creator in data science, across conference and user group presentations, books, webinars, and posts on both her own and JetBrain’s blogs.

image description