このシリーズでは、自然言語処理において主流であるTransformerを中心に、環境構築から学習の方法までまとめます。
今回の記事ではHuggingface Transformersによる感情分析の推論の実装を紹介します。
Google colabを使用して、簡単に最新の自然言語処理モデルを実装することができますので、ぜひ最後までご覧ください。
今回の内容
・感情分析の実装(英語)
・感情分析の実装(日本語)
・ニュース記事のデータセットから感情分析
感情分析とは
自然言語処理における感情分析とは、与えられた文章などの情報から「positive」「negative」などの感情表現のラベルに分類するタスクのことです。
例えば、SNSやカスタマーレビュー、口コミサイトなどでは、特定の商品の感想やレビューを投稿していることがあります。
こうした文章を分析し、どのような意見なのかを分析することで、評価や満足度などの指標を分析することができます。
今回の記事ではニュース記事にタイトルから、ポジティブなニュースとネガティブなニュースの判定を実装してみます。
Transformerとは
概要
「Transformer」は2017年にGoogleが「Attention is all you need」で発表した深層学習モデルです。
現在では、自然言語処理に利用する深層学習モデルの主流になっています。
これまでの自然言語処理分野で多く使われていた「RNN」(Recurrent Neural Network)や「CNN」(Convolutional Neural Network)を利用せず、Attentionのみを用いたEncoder-Decoder型のモデルとなっています。
「Transformer」が登場して以降、多くの自然言語処理モデルが再構築され、過去を上回る成果を上げています。
最近では自然言語処理だけでなく、ViTやDETRなどといった画像認識にも応用されています。
詳細は以下の記事をご覧ください。
Huggingface Transformersとは
概要
「Hugging Face」とは米国のHugging Face社が提供している、自然言語処理に特化したディープラーニングのフレームワークです。
「Huggingface Transformers」は、先ほど紹介したTransformerを実装するためのフレームワークであり、「自然言語理解」と「自然言語生成」の最先端の汎用アーキテクチャ(BERT、GPT-2など)と、何千もの事前学習済みモデルを提供しています。
ソースコードは全てGitHub上で公開されており、誰でも無料で使うことができます。
事前学習済みモデル
Hugging Faceではタスクに応じた様々な事前学習済みモデルが提供されています。
こちらからご確認ください。
Google colabによる導入
ここからはGoogle colabを使用して実装していきます。
今回紹介するコードは以下のボタンからコピーして使用していただくことも可能です。
まずはGoogleドライブをマウントして、作業フォルダを作成します。
from google.colab import drive
drive.mount('/content/drive')
!mkdir -p '/content/drive/My Drive/huggingface_transformers_demo/'
%cd '/content/drive/My Drive/huggingface_transformers_demo/'
次にtransformersをクローンします。
「!pip install transformers[‘ja’]」とすることで、日本語の処理に関するライブラリをインストールすることができます。
# !git clone https://github.com/huggingface/transformers
%cd transformers
!pip install transformers
!pip install transformers['ja']
!pip install sentencepiece
!pip install ipadic
パイプラインとトークナイザー
パイプラインとトークナイザー
Huggingface Transformersにおける自然言語処理では「パイプライン」と「トークナイザー」による実装方法があります。
パイプライン | ・「タスク種別」と「入力テキスト」を指定するだけで、1行のみで推論を行うシンプル。 ・簡単に実行できるが、カスタマイズ性には乏しく、日本語での推論はあまり使えない。 |
トークナイザー | ・「トークナイザー」で入力テキストを深層学習モデルに対応した形式に変換し、その入力データを使って「モデル」を直接操作して、推論を実行する方法 ・カスタマイズ性が高く、多くのタスクで日本語での推論にも対応。 |
感情分析の実装(英語)
ここからは実装方法を紹介します。
まずは英語での感情分析を実装します。
パイプラインとして、「pipeline(“sentiment-analysis”)」が用意されていますので、文章を入力するするだけで簡単に実装することができます。
# 「sentiment-analysis(感情分析)」のパイプライン
from transformers import pipeline
classifier = pipeline("sentiment-analysis")
# 「I hate you(嫌い)」を感情分析
result = classifier("I hate you")[0]
print(f"label: {result['label']}, with score: {round(result['score'], 4)}")
# 「I love you(好き)」を感情分析
result = classifier("I love you")[0]
print(f"label: {result['label']}, with score: {round(result['score'], 4)}")
実行すると、以下のような結果が出力されます。
label: NEGATIVE, with score: 0.9991
label: POSITIVE, with score: 0.9999
「嫌い=ネガティブ」、「好き=ポジティブ」と正しく判定できています。
判定と同時にスコア(機械の判定の確信度)も表示されており、どちらも確信度が高い判定であることがわかります。
感情分析の実装(日本語)
次に日本語で実装してみます。
モデルは「daigo/bert-base-japanese-sentiment」こちらのもの、トークナイザーは「cl-tohoku/bert-base-japanese-whole-word-masking」こちらのものを使用します。
from transformers import pipeline, AutoModelForSequenceClassification, BertJapaneseTokenizer,BertTokenizer, BertForSequenceClassification
# パイプラインの準備
model = AutoModelForSequenceClassification.from_pretrained('daigo/bert-base-japanese-sentiment')
tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')
classifier = pipeline("sentiment-analysis",model=model,tokenizer=tokenizer)
result = classifier("自然言語処理の勉強はとても楽しい")[0]
print(f"label: {result['label']}, with score: {round(result['score'], 4)}")
result = classifier("わからないことが多く、挫折しそうになる")[0]
print(f"label: {result['label']}, with score: {round(result['score'], 4)}")
実行すると、以下のような結果が出力されます。
label: ポジティブ, with score: 0.9791
label: ネガティブ, with score: 0.9152
「わからないことが多く、挫折しそうになる=ネガティブ」、「自然言語処理の勉強はとても楽しい=ポジティブ」と正しく判定できています。
英語の場合と同様に、判定と同時にスコア(機械の判定の確信度)も表示されており、どちらも確信度が高い判定であることがわかります。
ニュース記事から感情分析(日本語)
最後までニュース記事の一覧から、感情分析を実装してみましょう。
今回のこちらのサイトからニュース記事のデータセットを使用します。
(livedoor ニュースコーパス(https://www.rondhuit.com/download.html)より引用)
データセットの準備
リンク先から「ダウンロード(通常テキスト)」ファイルをダウンロードします。
今回は「topic-news」のフォルダを使用しますので、現在のディレクトリにフォルダごとアップしましょう。
まずは各ニュース記事のテキストファイルからタイトルを取得する関するを定義します。
import os
# タイトル取得
def get_title_list(path):
title_list = []
filenames = os.listdir(path)
for filename in filenames:
# ファイルの読み込み
with open(path+filename) as f:
title = f.readlines()[2].strip()
title_list.append(title)
return title_list
推論
タイトルと推論結果を表示させてみましょう。
モデルは「daigo/bert-base-japanese-sentiment」こちらのもの、トークナイザーは「cl-tohoku/bert-base-japanese-whole-word-masking」こちらのものを使用します。
先ほどの関数で「topic-news」からタイトル一覧を取得して、推論した結果を表形式で出力します。
from transformers import pipeline, AutoModelForSequenceClassification, BertJapaneseTokenizer,BertTokenizer, BertForSequenceClassification
# パイプラインの準備
model = AutoModelForSequenceClassification.from_pretrained('daigo/bert-base-japanese-sentiment')
tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')
classifier = pipeline("sentiment-analysis",model=model,tokenizer=tokenizer)
# タイトル一覧を取得
title_list = get_title_list('topic-news/')
# 結果を表形式で出力
df = pd.DataFrame(columns=['title', 'label','score'])
for title in title_list:
result = classifier(title)[0]
df = df.append({'title' : title , 'label' : result['label'], 'score' : round(result['score'], 4)} , ignore_index=True)
df
以下のような結果が出力されました。(一部のみ掲載しています)
index | title | label | score |
---|---|---|---|
0 | 河本の生活保護問題で、オリラジ・藤森がツイッターで騒動に | ネガティブ | 0.6605 |
1 | 【韓国ニュース】韓国のコメディアン、田村淳に「黙れ、おっさん」 | ポジティブ | 0.9541 |
2 | 反日映画か? 『アジアの純真』日本公開に物議 | ネガティブ | 0.635 |
3 | 「世の中そんなに甘くないからね」 スーパーマーケット店員の発言に批判殺到し店舗ブログも大炎上 | ネガティブ | 0.7333 |
4 | NHKで“放送事故”、女性ピアニストの胸がポロリ | ポジティブ | 0.6064 |
5 | ″GKB″やめても″AKB″を自殺対策強化月間のイメージキャラクターに起用し、物議に | ポジティブ | 0.8588 |
6 | レナウンが唖然とした「残酷」な中国市場 | ポジティブ | 0.587 |
7 | 大谷昭宏氏のコメントに、視聴者の異論噴出 | ネガティブ | 0.8516 |
8 | 「おかしくないですか?」カンニング竹山が片山さつき氏に怒り | ネガティブ | 0.5684 |
9 | 「見ているのは辛い…」山Pのキャラチェンジにユーザの反応は | ポジティブ | 0.793 |
10 | ロンブー・田村淳のツイートにパクリ疑惑が浮上 | ネガティブ | 0.6463 |
11 | 女子アーチェリー銅メダリスト早川蓮、 韓国でも話題に | ポジティブ | 0.8436 |
12 | ″20代の4割が童貞・処女″にネット騒然 | ポジティブ | 0.7185 |
13 | 秋葉通り魔事件の映画化で金儲け? | ポジティブ | 0.9093 |
14 | SMAP木村拓哉のスピード違反に「反省してるのか?」 | ポジティブ | 0.5745 |
15 | 米裁判所でギャラクシー・ネクサスに販売禁止判決 韓国ネットユーザー「アップル寄りの判決だ」 | ネガティブ | 0.5682 |
16 | Googleにユーザー属性がバレ過ぎて恐怖の声 | ネガティブ | 0.903 |
17 | 【韓国ニュース】東方神起を絶賛する北原みのり氏に、韓国ネットユーザー「よくぞ言ってくれた」 | ポジティブ | 0.9333 |
18 | 小倉智昭氏オーナーの飲食店が「ぼったくりだ!」と話題 | ポジティブ | 0.7183 |
19 | 大槻教授、たけしの番組の“やらせ”を暴露 | ポジティブ | 0.6866 |
20 | 乃木坂46の高山一実の過去ブログが流出し騒動に | ネガティブ | 0.5126 |
21 | 【韓国ニュース】韓国で核武装が公約される | ポジティブ | 0.9421 |
22 | 「視聴者ナメてんの?」 NHKの番組内容に非難の声 | ネガティブ | 0.8007 |
23 | 大人びたJS(女子小学生)特集が物議に | ポジティブ | 0.8519 |
24 | 人気AV女優が「幸せになれないとか言うな」と激怒し物議醸す | ネガティブ | 0.8192 |
おおよそ正しく判定できていることがわかりました。
今回はニュース記事で判定を行いましたが、同じ方法でSNSやカスタマーレビュー、口コミサイトの商品の感想などから評価や満足度を判定することへも応用が可能となります。
まとめ
最後までご覧いただきありがとうございました。
今回の記事ではHuggingface Transformersによる感情分析の推論の実装を紹介しました。
このシリーズでは、自然言語処理全般に関するより詳細な実装や学習の方法を紹介しておりますので、是非ご覧ください。