このシリーズでは、自然言語処理において主流であるTransformerを中心に、環境構築から学習の方法までまとめます。

今回の記事ではHuggingface Transformersによる、事前学習済モデルを用いた要約の推論を実装する流れを紹介します。

いくつかの事前学習済モデルによる推論結果を比較することで、要約タスクへの理解を深めましょう。

Google colabを使用して、簡単に最新の自然言語処理モデルを実装することができますので、ぜひ最後までご覧ください。

【ChatGPT】自然言語処理まとめ【Huggingface Transformers】

自然言語処理に関するおすすめの書籍 ChatGPT ChatGPTを中心とした、GPT系の関連技術を紹介します。 ChatGPTの概要 ・ChatGPTとは・ChatGPTができること・ChatGPTの問題点…

今回の内容

・要約タスクに使用するデータセット(The CNN/DailyMail Dataset)

・各学習済モデルを使用した要約の推論(GPT2、T5、BART、PEGASUS)

・要約文の定量的な評価方法(ROUGEスコア)

自然言語処理における要約タスクとは

自然言語処理における要約とは、重要な情報を保持しながらドキュメントや記事を短いテキストに要約するタスクのことを言います。

元の入力からテキストや文章を抽出して要約文を出力する抽出型モデルと、入力した文章から新しい文章を生成して要約を行う抽象型モデルに大別できます。

それぞれのメリット、デメリットをまとめると以下のようになります。

抽出型モデル抽象型モデル
概要元の入力からテキストや文章を抽出して要約文を出力する入力した文章から新しい文章を生成して要約を行う
メリット・元の文章内の正しい内容が出力される・文章が自然で読みやすい
・要約の長さを制御しやすい
デメリット・文章が不自然で読みにくい場合がある
・要約文の長さを制御しにくい
・内容とは異なる文章が生成されることがある

今回の記事では、それぞれの型の事前学習済モデルによる推論結果を比較することで、要約タスクへの理解を深めましょう。

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入門④】 pipelineによるタスク実装紹介

このシリーズでは、自然言語処理において主流であるTransformerを中心に、環境構築から学習の方法までまとめます。 今回の記事ではHuggingface Transformersの入門として…

Huggingface Transformersとは

概要

「Hugging Face」とは米国のHugging Face社が提供している、自然言語処理に特化したディープラーニングのフレームワークです。

「Huggingface Transformers」は、先ほど紹介したTransformerを実装するためのフレームワークであり、「自然言語理解」と「自然言語生成」の最先端の汎用アーキテクチャ(BERT、GPT-2など)と、何千もの事前学習済みモデルを提供しています。

ソースコードは全てGitHub上で公開されており、誰でも無料で使うことができます。

事前学習済みモデル

Hugging Faceではタスクに応じた様々な事前学習済みモデルが提供されています。

こちらからご確認ください。

Google colabによる導入

ここからはGoogle colabを使用して実装していきます。

まずはGPUを使用できるように設定をします。

「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更

今回紹介するコードは以下のボタンからコピーして使用していただくことも可能です。

Open In 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/'
!git clone https://github.com/huggingface/transformers
%cd transformers

次に必要なライブラリをそれぞれインストールします。

!pip install git+https://github.com/huggingface/transformers
# Huggingface Datasetsのインストール
!pip install datasets
!pip install sentencepiece
!pip install sacrebleu

要約タスクに使用するデータセット

まずは要約のデータセットを紹介します。

今回使用する「The CNN/DailyMail Dataset」は、CNNとDailyMailによる30万件のニュース記事と、記事に対応する箇条書きで書かれた要約文で構成されています。

このデータセットは、入力した文章から新しい文章を生成して要約を行う「抽象型」に分類されます。

Huggingface Datasetsから使用することができますので、早速ダウンロードして概要をみてましょう。

#「The CNN/DailyMail Dataset」をダウンロード
from datasets import load_dataset

dataset = load_dataset("cnn_dailymail", version="3.0.0")

サンプルデータを取り出して、本文と要約文を出力してみます。

# サンプルデータを取り出す
sample = dataset["train"][1]

# 記事の長さと本文を出力
print(len(sample["article"]),sample["article"][:500])

# 要約文の長さと本文を出力
print(len(sample["highlights"]),sample["highlights"])

実行すると、以下のような結果が出力されます。

4051 Editor's note: In our Behind the Scenes series, CNN correspondents share their experiences in covering news and analyze the stories behind the events. Here, Soledad O'Brien takes users inside a jail where many of the inmates are mentally ill. An inmate housed on the "forgotten floor," where many mentally ill inmates are housed in Miami before trial. MIAMI, Florida (CNN) -- The ninth floor of the Miami-Dade pretrial detention facility is dubbed the "forgotten floor." Here, inmates with the most s
281 Mentally ill inmates in Miami are housed on the "forgotten floor" Judge Steven Leifman says most are there as a result of "avoidable felonies"While CNN tours facility, patient shouts: "I am the son of the president"Leifman says the system is unjust and heghting for change .

およそ4000語の記事が300字程度に要約されているデータセットであることがわかりました。

各学習済モデルを使用した要約の推論

ここからは、学習済モデルを使用した要約の推論結果をみていくことにします。

先ほど紹介した、「The CNN/DailyMail Dataset」の1番目のデータの本文を使用して、各モデルで要約を実行します。

まずは、「The CNN/DailyMail Dataset」の最初のデータを使用する準備をします。

sample_text = dataset["train"][1]["article"][:2000]
# We'll collect the generated summaries of each model in a dictionary
summaries = {}
import nltk
from nltk.tokenize import sent_tokenize
nltk.download("punkt")

from transformers import pipeline, set_seed
set_seed(42)

要約文(答え)の表示

各モデルの要約結果を見る前に、答えを見ておきましょう。

「The CNN/DailyMail Dataset」の1番目のデータの要約文を表示します。

# 元のデータセットの要約(答え)を表示
print(dataset["train"][1]["highlights"])

実行すると、以下のような結果が出力されます。

Mentally ill inmates in Miami are housed on the "forgotten floor"
Judge Steven Leifman says most are there as a result of "avoidable felonies"
While CNN tours facility, patient shouts: "I am the son of the president"
Leifman says the system is unjust and he's fighting for change .

これがデータセットとして用意されている要約文なので、今回のタスクの「答え」に相当します。

ここからは、この答えと各モデルの出力結果を比較していくことにします。

GPT-2

まずはGPT2による要約を実行します。

GPT2は初代GPT(Generative Pre-trained Transformer)の後継で、デコーダ系のモデルです。

このモデルの事前学習タスクは、連続した単語の次の単語を予測ですが、入力されたテキストの最後に「TL;DR」を加えることで、要約のタスクも行うことができます。

# GPT-2による要約
pipe = pipeline("text-generation", model="gpt2")
gpt2_query = sample_text + "\nTL;DR:\n"
pipe_out = pipe(gpt2_query, max_length=512, clean_up_tokenization_spaces=True)
summaries_gpt2 =  "\n".join(sent_tokenize(pipe_out[0]["generated_text"][len(gpt2_query) :]))
print(summaries_gpt2)

実行すると、以下のような結果が出力されます。

-1.
The 9th degree refers to a prisoner who is "forgotten" because of his illness
-2.
As this sentence makes no sense, it probably doesn't hold much of a weight.
Most inmates on the 9th cannot handle an indefinite term of imprisonment, and only about 20 to 30% are charged with a mental illness.
Many are on death's

T5

次にT5による要約を実行します。

T5(Text-to-Text Transfer Transformer)はエンコーダ・デコーダ系のモデルです。

全てのタスクをテキストからテキストへの変換タスクとして定式化することで、非常に汎用性が高く、1つのモデルで多くのタスクに応用することができます。

T5のチェックポイントは、教師なしデータ(言語モデル)と要約などのタスクの教師ありデータで学習されているため、ファインチューニングせずに利用できることが特徴です。

# T5による要約
pipe = pipeline("summarization", model="t5-large")
pipe_out = pipe(sample_text)
summaries_t5 = "\n".join(sent_tokenize(pipe_out[0]["summary_text"]))
print(summaries_t5)

実行すると、以下のような結果が出力されます。

mentally ill inmates are housed on the ninth floor of a florida jail .
most face drug charges or charges of assaulting an officer .
judge says arrests often result from confrontations with police .
one-third of all people in Miami-dade county jails are mental ill .

BART

次にBARTによる要約を実行します。

BART(Bidirectional Auto-Regressive Transformer)はエンコーダ・デコーダ系のモデルです。

BERTとGPTの事前学習尾をエンコーダ・デコーダのアーキテクチャの中で組み合わせています。

ここでは「The CNN/DailyMail Dataset」でファインチューニングされた「facebook/bart-large-cnn」を使用します。

#  BARTによる要約
pipe = pipeline("summarization", model="facebook/bart-large-cnn")
pipe_out = pipe(sample_text)
summaries_bart = "\n".join(sent_tokenize(pipe_out[0]["summary_text"]))
print(summaries_bart)

実行すると、以下のような結果が出力されます。

Mentally ill inmates are housed on the "forgotten floor" of Miami-Dade jail.
Most often, they face drug charges or charges of assaulting an officer.
Judge Steven Leifman says the arrests often result from confrontations with police.
He says about one-third of all people in the county jails are mentally ill.

PEGASUS

最後にPEGASUSによる要約を実行します。

PEGASUS(Pre-tranning with Extracted Gap-sentenses for Abstractive Summarization)はエンコーダ・デコーダ系のモデルです。

このモデルの事前学習タスクは複数文を含むテキスト中のマスク文の予測です。

GSG(Gap Sentences Generation)という新しいSelf-supervised Objectiveを設定することで、文章要約に特化した抽象型要約モデルを作成し、ICML2020で発表された当時において、文章要約における12のベンチマークでSOTAを達成しました。

# PEGASUSによる要約
pipe = pipeline("summarization", model="google/pegasus-cnn_dailymail")
pipe_out = pipe(sample_text)
summaries_pegasus = pipe_out[0]["summary_text"].replace(" .<n>", ".\n")
print(summaries_pegasus)

実行すると、以下のような結果が出力されます。

Mentally ill inmates in Miami are housed on the "forgotten floor"<n>The ninth floor is where they're held until they're ready to appear in court.
Most often, they face drug charges or charges of assaulting an officer.
They end up on the ninth floor severely mentally disturbed .

各モデルの結果のまとめ

ここまで4つのモデルの結果を紹介しました。

それぞれの結果をまとめると、以下のようになります。

モデル要約文日本語訳
答えMentally ill inmates in Miami are housed on the “forgotten floor”
Judge Steven Leifman says most are there as a result of “avoidable felonies”
While CNN tours facility, patient shouts: “I am the son of the president”
Leifman says the system is unjust and he’s fighting for change .
マイアミの精神病患者は、”忘れられた階 “に収容されている。
スティーブン・ライフマン判事によると、ほとんどが「回避可能な重罪」の結果として収容されているとのことです。
CNNが施設を視察している間、患者は叫んだ。”俺は大統領の息子だ “と
リーフマンは、このシステムは不当であり、彼は変化のために戦っていると言います。
GPT-2-1.
The 9th degree refers to a prisoner who is “forgotten” because of his illness
-2.
As this sentence makes no sense, it probably doesn’t hold much of a weight.
Most inmates on the 9th cannot handle an indefinite term of imprisonment, and only about 20 to 30% are charged with a mental illness.
Many are on death’s
1.9度目は、病気のために「忘れられた」囚人を指している
2.この文章が意味をなさない以上、おそらくあまり重みはないだろう。9級の受刑者の多くは無期懲役に対応できないし、精神疾患を抱えているのは2~3割程度。多くは死刑囚である。
T5mentally ill inmates are housed on the ninth floor of a florida jail .
most face drug charges or charges of assaulting an officer .
judge says arrests often result from confrontations with police .
one-third of all people in Miami-dade county jails are mental ill .
フロリダの刑務所の9階には、精神病の受刑者が収容されています。
ほとんどの囚人は薬物乱用や警官への暴行で逮捕されています。
判事によると、逮捕の多くは警察との対立が原因だそうです。
マイアミデイド郡の刑務所に収容されている人の3分の1が精神病患者です。
BARTMentally ill inmates are housed on the “forgotten floor” of Miami-Dade jail. Most often, they face drug charges or charges of assaulting an officer. Judge Steven Leifman says the arrests often result from confrontations with police. He says about one-third of all people in the county jails are mentally ill.精神を病んだ受刑者は、マイアミ・デイド刑務所の「忘れられた階」に収容されている。多くの場合、彼らは薬物犯罪や警官への暴行容疑で逮捕される。スティーブン・ライフマン判事によると、逮捕の多くは警察との対立から生じている。郡刑務所に収容されている人の約3分の1が精神障害者であるという。
PEGASUSMentally ill inmates in Miami are housed on the “forgotten floor”<n>The ninth floor is where they’re held until they’re ready to appear in court. Most often, they face drug charges or charges of assaulting an officer. They end up on the ninth floor severely mentally disturbed .マイアミの精神病患者は「忘れられた階」に収容されている9階は、彼らが法廷に出る準備ができるまで収容されている場所である。多くの場合、彼らは薬物犯罪や警官への暴行容疑に直面しています。彼らは9階で精神的にひどく参ってしまうのです。

結果を比較してもわかるとおり、要約のタスクの場合は正解が1つでないケースがほとんどです。

ここからは、これらの結果を定量的に評価する方法を紹介します。

要約文の定量的な評価方法

ROUGEスコア

ROUGE (Recall-Oriented Understudy for Gisting Evaluation) はスコアは要約のような高い再現率が求められるケースのために開発された指標です。

2004年に発表された論文で提案された指標ですが、現在も要約の論文ではほぼ必ず使われている指標となっています。

「要約システムが作成した要約 (=予測) 」と「人手で書かれた要約 (=正解) 」がどのくらい一致しているかを測定することで、定量的な評価を実現しています。

ROUGEの中にはいくつかの指標があり、以下のように分類されます。

指標計算方法
ROUGE-1「要約システムが作成した要約 (=予測) 」と「人手で書かれた要約 (=正解) 」の1-gram(単語)の共起を評価する。
ROUGE-2「要約システムが作成した要約 (=予測) 」と「人手で書かれた要約 (=正解) 」の2-gramの共起を評価する。
ROUGE-L最長共通部分列(LCS) を評価する。1つの文ごとのスコアを計算し、平均をとる。
ROUGE-SUM最長共通部分列(LCS) を評価する。要約全体に対して計算する。

先ほどの結果に対して、これらの指標を当てはめてみます。

ROUGEスコアの実装

まずはrouge_scoreをインストールします。

!pip install rouge_score
from datasets import load_metric
rouge_metric = load_metric("rouge")

records1 = []
rouge_names = ["rouge1", "rouge2", "rougeL", "rougeLsum"]

次にスコアを出力してみます。

ROUGEスコア(GPT2)

まずは先ほど使用したGPT2モデルの出力に対して、スコアを算出します。

rouge_metric.add(prediction=summaries_gpt2, reference=dataset["train"][1]["highlights"])
score = rouge_metric.compute()
rouge_dict = dict((rn, score[rn].mid.fmeasure) for rn in rouge_names)
records1.append(rouge_dict)

print(records1)

実行すると、以下のような結果が出力されます。

[{'rouge1': 0.27522935779816515, 'rouge2': 0.01869158878504673, 'rougeL': 0.14678899082568808, 'rougeLsum': 0.27522935779816515}]

ROUGEスコア(T5)

同様に他の3つのモデルに対しても出力します。

まずは、T5からです。

rouge_metric.add(prediction=summaries_t5, reference=dataset["train"][1]["highlights"])
score = rouge_metric.compute()
rouge_dict = dict((rn, score[rn].mid.fmeasure) for rn in rouge_names)
records2.append(rouge_dict)

print(records2)

実行すると、以下のような結果が出力されます。

[{'rouge1': 0.3829787234042553, 'rouge2': 0.13043478260869565, 'rougeL': 0.2553191489361702, 'rougeLsum': 0.3829787234042553}, {'rouge1': 0.3829787234042553, 'rouge2': 0.13043478260869565, 'rougeL': 0.2553191489361702, 'rougeLsum': 0.3829787234042553}, {'rouge1': 0.3829787234042553, 'rouge2': 0.13043478260869565, 'rougeL': 0.2553191489361702, 'rougeLsum': 0.3829787234042553}]

ROUGEスコア(BART)

次にBARTです。

rouge_metric.add(prediction=summaries_bart, reference=dataset["train"][1]["highlights"])
score = rouge_metric.compute()
rouge_dict = dict((rn, score[rn].mid.fmeasure) for rn in rouge_names)
records3.append(rouge_dict)

print(records3)

実行すると、以下のような結果が出力されます。

[{'rouge1': 0.4752475247524753, 'rouge2': 0.22222222222222224, 'rougeL': 0.31683168316831684, 'rougeLsum': 0.4158415841584159}, {'rouge1': 0.4752475247524753, 'rouge2': 0.22222222222222224, 'rougeL': 0.31683168316831684, 'rougeLsum': 0.4158415841584159}, {'rouge1': 0.4752475247524753, 'rouge2': 0.22222222222222224, 'rougeL': 0.31683168316831684, 'rougeLsum': 0.4158415841584159}]

ROUGEスコア(PEGASUS)

最後にPEGASUSです。

rouge_metric.add(prediction=summaries_pegasus, reference=dataset["train"][1]["highlights"])
score = rouge_metric.compute()
rouge_dict = dict((rn, score[rn].mid.fmeasure) for rn in rouge_names)
records4.append(rouge_dict)

print(records4)

実行すると、以下のような結果が出力されます。

[{'rouge1': 0.3232323232323232, 'rouge2': 0.2061855670103093, 'rougeL': 0.2828282828282828, 'rougeLsum': 0.3232323232323232}, {'rouge1': 0.3232323232323232, 'rouge2': 0.2061855670103093, 'rougeL': 0.2828282828282828, 'rougeLsum': 0.3232323232323232}, {'rouge1': 0.3232323232323232, 'rouge2': 0.2061855670103093, 'rougeL': 0.2828282828282828, 'rougeLsum': 0.3232323232323232}]

ROUGEスコアのまとめ

以上の結果をまとめます。

rouge1rouge2rougeLrougeLsum
GPT20.270.010.140.27
T50.380.130.250.38
BART0.470.220.310.41
PEGASUS0.320.200.280.32

今回の1つサンプルに対して、ROUGEスコアを算出したため、純粋なモデルの精度の比較にはなりませんが、スコアの算出の方法はご理解いただけたかと思います。

まとめ

最後までご覧いただきありがとうございました。

今回の記事ではHuggingface Transformersによる事前学習済モデルを用いた要約の推論を実装する流れを紹介しました。

このシリーズでは、自然言語処理全般に関するより詳細な実装や学習の方法を紹介しておりますので、是非ご覧ください。

【ChatGPT】自然言語処理まとめ【Huggingface Transformers】

自然言語処理に関するおすすめの書籍 ChatGPT ChatGPTを中心とした、GPT系の関連技術を紹介します。 ChatGPTの概要 ・ChatGPTとは・ChatGPTができること・ChatGPTの問題点…