Pythonを使用した感情分析の始め方
'Pythonを使った感情分析の始め方'
感情分析は、データを感情に基づいてタグ付けする自動化されたプロセスです。感情分析により、企業はデータをスケールで分析し、洞察を検出し、プロセスを自動化することができます。
過去には、感情分析は研究者、機械学習エンジニア、または自然言語処理の経験を持つデータサイエンティストに限定されていました。しかし、AIコミュニティは最近、機械学習へのアクセスを民主化するための素晴らしいツールを開発しました。今では、わずか数行のコードを使って感情分析を行い、機械学習の経験が全くなくても利用することができます!🤯
このガイドでは、Pythonを使用した感情分析の始め方についてすべてを学びます。具体的には以下の内容です:
- 感情分析とは何か?
- Pythonで事前学習済みの感情分析モデルを使用する方法
- 独自の感情分析モデルを構築する方法
- 感情分析でツイートを分析する方法
さあ、始めましょう!🚀
- 🤗 Transformersを使用して、画像分類のためにViTを微調整する
- BERT 101 – 最新のNLPモデルの解説
- 🤗 Transformersにおいて制約付きビームサーチを用いたテキスト生成のガイド
1. 感情分析とは何ですか?
感情分析は、与えられたテキストの極性を特定する自然言語処理の技術です。感情分析にはさまざまなバリエーションがありますが、最も広く使用されている技術の1つは、データを「ポジティブ」、「ネガティブ」、または「ニュートラル」のいずれかにラベル付けするものです。たとえば、次のようなツイートを見てみましょう。@VerizonSupportをメンションしているものです:
-
“dear @verizonsupport your service is straight 💩 in dallas.. been with y’all over a decade and this is all time low for y’all. i’m talking no internet at all.” → 「ネガティブ」とタグ付けされます。
-
“@verizonsupport ive sent you a dm” → 「ニュートラル」とタグ付けされます。
-
“thanks to michelle et al at @verizonsupport who helped push my no-show-phone problem along. order canceled successfully and ordered this for pickup today at the apple store in the mall.” → 「ポジティブ」とタグ付けされます。
感情分析により、データをスケールで処理し、リアルタイムで分析することができます。たとえば、何千ものツイート、製品レビュー、またはサポートチケットを分析したい場合、このデータを手動で整理する代わりに、感情分析を使用して特定のトピックについての人々の話し方を自動的に理解し、データに基づく意思決定のための洞察を得て、ビジネスプロセスを自動化することができます。
感情分析は、さまざまなアプリケーションで使用されています。たとえば:
- ソーシャルメディアのメンションを分析して、顧客があなたのブランドと競合他社についてどのように話しているかを理解する。
- 調査や製品レビューからのフィードバックを分析して、顧客が製品についてどのようなことを好きで嫌っているかをすばやく把握する。
- リアルタイムで入力されるサポートチケットを分析して、怒っている顧客を検出し、離脱を防ぐために適切な措置を講じる。
2. Pythonで事前学習済みの感情分析モデルを使用する方法
さて、感情分析が何であるかを説明したところで、いくつかの感情分析モデルで遊んでみましょう! 🎉
Hugging Face Hubでは、機械学習を民主化するために、公に利用可能な最大のモデルとデータセットのコレクションを構築しています 🚀。Hubでは、AIコミュニティによって共有された27,000以上のモデルを見つけることができます。これらのモデルは、感情分析、物体検出、テキスト生成、音声認識などのタスクにおいて最先端のパフォーマンスを発揮しています。Hubは無料で利用でき、ほとんどのモデルにはブラウザ上で直接テストできるウィジェットがあります!
Hubには215以上の公開されている感情分析モデルがあり、Pythonと統合するためにはわずか5行のコードが必要です:
pip install -q transformers
from transformers import pipeline
sentiment_pipeline = pipeline("sentiment-analysis")
data = ["I love you", "I hate you"]
sentiment_pipeline(data)
このコードスニペットでは、pipelineクラスを使用してHubで利用可能なモデルから予測を行います。デフォルトの感情分析モデルを使用して、テキストのリストdata
を分析し、次の結果を出力します:
[{'label': 'POSITIVE', 'score': 0.9998},
{'label': 'NEGATIVE', 'score': 0.9991}]
言語や用途に適した特定の感情分析モデルを使用するには、モデルの名前を指定します。たとえば、ツイート用の感情分析モデルを使用したい場合は、次のようにモデルIDを指定できます:
specific_model = pipeline(model="finiteautomata/bertweet-base-sentiment-analysis")
specific_model(data)
このColabノートブックを使用して、独自のデータでこれらのモデルをテストできます:
以下は、Hubで利用可能な感情分析モデルのいくつかです。以下は、ご確認をおすすめします:
- Twitter-roberta-base-sentimentは、約5800万のツイートでトレーニングされ、感情分析のために微調整されたroBERTaモデルです。微調整とは、事前にトレーニングされた大規模な言語モデル(この場合、roBERTa)を取り、追加のトレーニングデータで微調整して、2番目の類似したタスク(感情分析など)を実行できるようにするプロセスです。
- Bert-base-multilingual-uncased-sentimentは、英語、オランダ語、ドイツ語、フランス語、スペイン語、イタリア語の6つの言語で製品レビューの感情分析に微調整されたモデルです。
- Distilbert-base-uncased-emotionは、悲しみ、喜び、愛、怒り、恐怖、驚きを含むテキストの感情を検出するために微調整されたモデルです。
スペイン語、フランス語、イタリア語、ドイツ語などの言語で感情分析を行うことに興味はありますか? Hubでは、さまざまなユースケースと28以上の言語に微調整された多くのモデルが見つかります。興味のある言語に従って、こちらで感情分析モデルの完全なリストを確認し、左側でフィルタリングすることができます。
3. 独自の感情分析モデルの作成
Hubで公開されている事前トレーニング済みモデルを使用すると、感情分析をすぐに始めるのに最適です。これらのモデルは、トランスフォーマーなどのディープラーニングアーキテクチャを使用しており、感情分析やその他の機械学習タスクで最先端のパフォーマンスを実現しています。ただし、独自のデータでモデルを微調整することで、感情分析の結果をさらに改善し、特定のユースケースでの精度を向上させることができます。
このセクションでは、独自のデータと基準を使用して感情分析のためのモデルを微調整する2つのアプローチについて説明します。最初のアプローチでは、🤗TransformersのTrainer APIを使用します。これは、50Kのスターと1K以上の貢献者を持つオープンソースのライブラリであり、少しコーディングと経験が必要です。2番目のアプローチは、より簡単で直感的であり、AutoNLPを使用します。これは、コードやMLの経験なしで最先端のNLPモデルを自動的にトレーニング、評価、展開するツールです。
さあ、始めましょう!
a. Pythonを使用したモデルの微調整
このチュートリアルでは、IMDBデータセットを使用して、感情分析のためのDistilBERTモデルを微調整します。
IMDBデータセットには、25,000件の映画レビューがあり、モデルのトレーニングには感情によってラベル付けされています。DistilBERTは、BERTのサイズが40%小さく、動作が60%高速でありながら、BERTのパフォーマンスの95%以上を保持しているバージョンです。ポジティブまたはネガティブかどうかを判別できるDistilBERTモデルを微調整して、映画レビューを分類することができます。モデルをトレーニングした後は、新しいデータを分析するために使用できます! ⚡️
このチュートリアルで使用できるように、このノートブックをGoogle Colabで使用できるように作成しました。
1. GPUの有効化と依存関係のインストール
最初に、モデルをトレーニングするためにGoogle ColabでGPU(CPUではなく)を使用するように設定しましょう。メニューに移動し、「ランタイム」>「ランタイムのタイプを変更」をクリックし、ハードウェアアクセラレータとして「GPU」を選択します。これを行った後、次のコードを実行して、ノートブックでGPUが利用可能かどうかをチェックする必要があります:
import torch
torch.cuda.is_available()
次に、このチュートリアルで使用するライブラリをインストールします:
!pip install datasets transformers huggingface_hub
また、モデルリポジトリでgitを使用するためにgit-lfs
をインストールする必要もあります:
!apt-get install git-lfs
2. データの前処理
感情分析のためにDistilBERTを微調整するためのデータが必要です。したがって、🤗Datasetsライブラリを使用してIMDBデータセットをダウンロードし、前処理してモデルのトレーニングに使用できるデータにします:
from datasets import load_dataset
imdb = load_dataset("imdb")
IMDBは巨大なデータセットなので、トレーニングとテストを高速化するためにより小さなデータセットを作成しましょう:
small_train_dataset = imdb["train"].shuffle(seed=42).select([i for i in list(range(3000))])
small_test_dataset = imdb["test"].shuffle(seed=42).select([i for i in list(range(300))])
データの前処理には、DistilBERT トークナイザーを使用します:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")
次に、データセットの両方の分割(トレーニングとテスト)のモデル用のテキスト入力を準備するために、マップメソッドを使用します:
def preprocess_function(examples):
return tokenizer(examples["text"], truncation=True)
tokenized_train = small_train_dataset.map(preprocess_function, batched=True)
tokenized_test = small_test_dataset.map(preprocess_function, batched=True)
トレーニングをスピードアップするために、データコレータを使用してトレーニングサンプルをPyTorchテンソルに変換し、適切なパディング量と連結します:
from transformers import DataCollatorWithPadding
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
3. モデルの学習
前処理が完了したので、モデルの学習を始めましょう 🚀
DistilBERT モデルの事前トレーニングヘッドを破棄し、感情分析に適したクラス分類ヘッドで置き換えることになります。これにより、DistilBERTの知識をカスタムモデルに転送することができます 🔥
学習には、Trainer API を使用します。このAPIは、DistilBERT、BERT、RoBERTaなどのTransformerモデルを微調整するために最適化されています 🤗
まず、DistilBERTをベースモデルとして定義しましょう:
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased", num_labels=2)
次に、モデルの性能を評価するために使用するメトリック(正答率とf1スコア)を定義しましょう:
import numpy as np
from datasets import load_metric
def compute_metrics(eval_pred):
load_accuracy = load_metric("accuracy")
load_f1 = load_metric("f1")
logits, labels = eval_pred
predictions = np.argmax(logits, axis=-1)
accuracy = load_accuracy.compute(predictions=predictions, references=labels)["accuracy"]
f1 = load_f1.compute(predictions=predictions, references=labels)["f1"]
return {"accuracy": accuracy, "f1": f1}
次に、Hugging Faceアカウントにログインしてモデルリポジトリを管理できるようにします。 notebook_login
を実行すると、Hugging Faceトークンを追加するためのウィジェットがノートブックに表示されます:
from huggingface_hub import notebook_login
notebook_login()
もう少しで完了です!モデルをトレーニングする前に、トレーニング引数を定義し、これまで構築したオブジェクトをすべて含めたTrainerを定義する必要があります:
from transformers import TrainingArguments, Trainer
repo_name = "finetuning-sentiment-model-3000-samples"
training_args = TrainingArguments(
output_dir=repo_name,
learning_rate=2e-5,
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
num_train_epochs=2,
weight_decay=0.01,
save_strategy="epoch",
push_to_hub=True,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_train,
eval_dataset=tokenized_test,
tokenizer=tokenizer,
data_collator=data_collator,
compute_metrics=compute_metrics,
)
さあ、感情分析データセットでモデルを微調整する時が来ました! 🙌 Trainerのtrain()
メソッドを呼び出すだけです:
trainer.train()
おめでとうございます!DistilBERTモデルを感情分析のために微調整しました! 🎉
トレーニング時間は、使用するハードウェアとデータセットのサンプル数によって異なります。この場合、GPUを使用してモデルを3,000サンプルで微調整するのに約10分かかりました。モデルのトレーニングに使用するサンプル数が増えるほど、より正確になりますが、トレーニングにはかなり時間がかかる場合があります。
次に、モデルの性能を評価するために評価メトリックを計算しましょう:
trainer.evaluate()
私たちの場合、88%の正解率と89%のf1スコアを得ました。たった3,000のサンプルで訓練された感情分析モデルとしてはかなり良い結果です!
4. モデルを使って新しいデータを分析する
感情分析のためのモデルを訓練したので、新しいデータを分析して🤖予測を取得しましょう!これによって、機械学習の力が解き放たれます。モデルを使用してデータを自動的にリアルタイムで大規模に分析することができます⚡️
まず、モデルをHubにアップロードしましょう:
trainer.push_to_hub()
モデルをHubにプッシュしたので、たった2行のコードでモデルの感情を予測するためにパイプラインクラスを使用できます🤯:
from transformers import pipeline
sentiment_model = pipeline(model="federicopascual/finetuning-sentiment-model-3000-samples")
sentiment_model(["I love this move", "This movie sucks!"])
これが私たちのモデルの予測です:
[{'label': 'LABEL_1', 'score': 0.9558},
{'label': 'LABEL_0', 'score': 0.9413}]
IMDBデータセットでは、Label 1
はポジティブを意味し、Label 0
はネガティブを意味します。かなり良いですね!🔥
b. AutoNLPを使った感情モデルの訓練
AutoNLPはコードを使わずに最先端の機械学習モデルを訓練するためのツールです。使いやすいユーザーインターフェースを提供し、データをアップロードするだけでカスタムモデルを簡単に訓練できます。AutoNLPは、データとともにさまざまな事前訓練済みモデルを自動的に微調整し、ハイパーパラメータの調整を行い、最適なモデルを見つけます。AutoNLPで訓練されたすべてのモデルはデプロイされ、すぐに本番環境で使用できます。
AutoNLPを使用して感情分析モデルを訓練することは非常に簡単で、数回のクリックで行うことができます🤯。試してみましょう!
まず、データを入手しましょう!Twitterのメッセージが3つの感情(0:ネガティブ、2:ニュートラル、4:ポジティブ)でラベル付けされた、人気のある感情分析データセットであるSentiment140を使用します。このデータセットはかなり大きく、1,600,000のツイートが含まれています。AutoNLPと最初のモデルを訓練するためにこの量のデータは必要ありませんので、3,000のサンプルで構成されたSentiment140データセットの小さなバージョンを準備しました。こちらからダウンロードできます。データセットは以下のようになっています:
Sentiment 140データセット
次に、AutoNLPで新しいプロジェクトを作成して5つの候補モデルを訓練しましょう:
AutoNLPで新しいプロジェクトを作成する
その後、データセットをアップロードし、テキスト列とターゲット列をマッピングします:
AutoNLPにデータセットを追加する
データセットを追加したら、「トレーニング」タブに移動し、価格を承認してモデルの訓練を開始します。AutoNLPの価格はモデルごとに最低$10からです:
AutoNLPにデータセットを追加する
数分後、AutoNLPはすべてのモデルを訓練し、それぞれのパフォーマンスメトリックを表示します:
AutoNLPによって訓練された感情分析モデル
最良のモデルは77.87%の正解率を持っています🔥わずか3,000のサンプルで訓練されたツイートの感情分析モデルにしてはかなり良い結果です!
これらのモデルはすべて自動的にHubにアップロードされ、本番環境で展開されます。これらのモデルのいずれかを使用して、この投稿の前のセクションで示されたようにパイプラインクラスを使用して新しいデータを分析することができます。
4. ツイートの感情分析とPythonによる分析
この最後のセクションでは、これまでの投稿で学んだことを実践し、楽しいプロジェクトであるNFTに関するツイートの感情分析を行います!
まず、Tweepyを使用して、Twitter APIを介して#NFTsを言及するツイートを取得するための簡単なPythonライブラリであるTweepyを使用します。次に、🤗Hubから感情分析モデルを使用してこれらのツイートを分析します。最後に、結果を探索し、興味深い洞察を見つけるための視覚化を作成します。
このノートブックを使用して、このチュートリアルに従うことができます。さあ始めましょう!
1. 依存関係のインストール
まず、このチュートリアルで使用するすべてのライブラリをインストールしましょう:
!pip install -q transformers tweepy wordcloud matplotlib
2. Twitter APIの認証情報の設定
次に、Twitter APIとのやり取りに使用する認証情報を設定します。まず、Twitterの開発者アカウントにサインアップする必要があります。次に、新しいプロジェクトを作成し、APIキーとトークンを取得するためにアプリを接続します。このステップバイステップガイドに従って認証情報を取得できます。
APIキーとトークンを取得したら、Tweepyを使用してTwitter APIとやり取りするラッパーを作成しましょう:
import tweepy
# Twitter APIキーとシークレットを追加
consumer_key = "XXXXXX"
consumer_secret = "XXXXXX"
# Twitterとの認証処理を行うための設定
auth = tweepy.AppAuthHandler(consumer_key, consumer_secret)
# Twitter APIのラッパーを作成
api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
3. Tweepyを使用してツイートを検索する
この時点で、Twitter APIを使用してツイートを収集する準備ができています🎉。Tweepy Cursorを使用して、#NFTsをメンションする1,000件のツイートを抽出します:
# ページネーションとレート制限を処理するためのヘルパー関数
def limit_handled(cursor):
while True:
try:
yield cursor.next()
except tweepy.RateLimitError:
print('レート制限に達しました。15分以上待機します')
time.sleep(15 * 61)
except StopIteration:
break
# ツイートを検索するために使用するキーワードを定義
query = '#NFTs'
query = query + ' -filter:retweets'
# Twitter APIから取得するツイートの数を定義
count = 1000
# Tweepyを使用してツイートを検索する
search = limit_handled(tweepy.Cursor(api.search,
q=query,
tweet_mode='extended',
lang='en',
result_type="recent").items(count))
4. ツイートに対して感情分析を実行する
さあ、新しいスキルを活かしてデータに対して感情分析を実行しましょう!🎉
ツイートの感情分析には、ハブで利用可能なモデルのうちの1つを使用します。このモデルを使用して予測を行うために、パイプラインクラスを使用します:
from transformers import pipeline
# ハブからモデルを使用して推論パイプラインをセットアップ
sentiment_analysis = pipeline(model="finiteautomata/bertweet-base-sentiment-analysis")
# 各ツイートに対して感情分析を実行する
tweets = []
for tweet in search:
try:
content = tweet.full_text
sentiment = sentiment_analysis(content)
tweets.append({'tweet': content, 'sentiment': sentiment[0]['label']})
except:
pass
5. 感情分析の結果を探索する
Twitter上でNFTについてどのように話されているのでしょうか?主に肯定的な意見なのか、否定的な意見なのかを調べてみましょう!
まず、結果をデータフレームにロードし、各感情にラベル付けされたツイートの例を見てみましょう:
import pandas as pd
# データをデータフレームにロードする
df = pd.DataFrame(tweets)
pd.set_option('display.max_colwidth', None)
# 各感情に対してツイートを表示する
display(df[df["sentiment"] == 'POS'].head(1))
display(df[df["sentiment"] == 'NEU'].head(1))
display(df[df["sentiment"] == 'NEG'].head(1))
出力:
ツイート: @NFTGalIery Warm, exquisite and elegant palette of charming beauty Its price is 2401 ETH. \nhttps://t.co/Ej3BfVOAqc\n#NFTs #NFTartists #art #Bitcoin #Crypto #OpenSeaNFT #Ethereum #BTC 感情: POS
ツイート: How much our followers made on #Crypto in December:\n#DAPPRadar airdrop — $200\nFree #VPAD tokens — $800\n#GasDAO airdrop — up to $1000\nStarSharks_SSS IDO — $3500\nCeloLaunch IDO — $3000\n12 Binance XMas #NFTs — $360 \nTOTAL PROFIT: $8500+\n\nJoin and earn with us https://t.co/fS30uj6SYx 感情: NEU
ツイート: Stupid guy #2\nhttps://t.co/8yKzYjCYIl\n\n#NFT #NFTs #nftcollector #rarible https://t.co/O4V19gMmVk 感情: NEG
それでは、各感情に対してどれだけのツイートがあるかを見て、これらの結果を視覚化しましょう:
# 各感情のツイート数を数えましょう
sentiment_counts = df.groupby(['sentiment']).size()
print(sentiment_counts)
# 感情を視覚化しましょう
fig = plt.figure(figsize=(6,6), dpi=100)
ax = plt.subplot(111)
sentiment_counts.plot.pie(ax=ax, autopct='%1.1f%%', startangle=270, fontsize=12, label="")
興味深いことに、NFTに関するツイートのほとんどはポジティブ(56.1%)であり、ネガティブなツイートはほとんどありません(2.0%):
NFTツイートの感情分析結果
最後に、ワードクラウドを作成して、各感情に対してどのような単語が目立つのかを見てみましょう:
from wordcloud import WordCloud
from wordcloud import STOPWORDS
# ポジティブなツイートのワードクラウド
positive_tweets = df['tweet'][df["sentiment"] == 'POS']
stop_words = ["https", "co", "RT"] + list(STOPWORDS)
positive_wordcloud = WordCloud(max_font_size=50, max_words=100, background_color="white", stopwords = stop_words).generate(str(positive_tweets))
plt.figure()
plt.title("ポジティブなツイート - ワードクラウド")
plt.imshow(positive_wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
# ネガティブなツイートのワードクラウド
negative_tweets = df['tweet'][df["sentiment"] == 'NEG']
stop_words = ["https", "co", "RT"] + list(STOPWORDS)
negative_wordcloud = WordCloud(max_font_size=50, max_words=100, background_color="white", stopwords = stop_words).generate(str(negative_tweets))
plt.figure()
plt.title("ネガティブなツイート - ワードクラウド")
plt.imshow(negative_wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
ポジティブなツイートに関連する単語の一部には、Discord、Ethereum、Join、Mars4、Shroomなどがあります:
ポジティブなツイートのワードクラウド
対照的に、ネガティブなツイートに関連する単語には、cookies chaos、Solana、OpenseaNFTなどがあります:
ネガティブなツイートのワードクラウド
以上です!わずかなPythonコードで、ツイートを収集し、感情分析を行い、結果を分析するためのクールな視覚化を作成することができました!かなりクールですね?
5. 総括
Pythonを使用した感情分析はこれまでにないほど簡単です!🤗Transformersや🤗Hubなどのツールを使用すると、感情分析がすべての開発者に利用可能になります。オープンソースの事前学習済みモデルを使用して、わずかなコードで感情分析を行うことができます🔥
独自のデータで感情分析のためのカスタムモデルをトレーニングしたいですか?簡単です!Trainer APIを使用してモデルを微調整し、大規模な言語モデルの上に構築して最先端の結果を得ることができます。さらに簡単な方法をお求めの場合は、データをアップロードするだけでカスタムの機械学習モデルをトレーニングするAutoNLPを使用することもできます。
質問があれば、Hugging Faceコミュニティがお答えしたり、利益を得ることができますので、Hugging Faceフォーラムでお尋ねください。また、私たちやHugging Faceコミュニティと話すために、ディスコードサーバーに参加してください。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles