ROUGEを訪ねて三千里:より良い要約の評価を求めて

テキスト要約の評価には、一般的にROUGE(ルージュ)という指標がよく用いられます。これは、大まかには人間の作成した要約と、システムが作成した要約との一致度を測る指標です。

ただ、「一致度の測り方」には様々なバリエーションがあります。そこで、本記事では様々な「一致度の測り方」を体現するROUGEの兄弟達を紹介していきます。

<img width="568" alt="top2.png" src="https://qiita-image-store.s3.amazonaws.com/0/25990/e6b4580e-d796-fa98-b342-c4d71a753cc4.png">
*(※図はイメージです。一つをベースにしたバリエーションという意味で、特に属性とかに意味があるわけではないです)*

ニューラルネットという強力なモデルが登場した最近の研究では、「最適化すべき指標」がしっかり定義できればそこそこ良い精度で問題が解けてしまう節があります。そのため、何を最適化すべきか、という点を定義することはよりその重要度を増しているとも言えます。

本記事では、実際にスコアを計測するためのライブラリについても紹介します。要約を作成する際には、ぜひ活用していただければと思います。

# テキスト要約の評価指標

## ROUGE-N

ROUGE-Nは最もベーシックな指標で、N-gram単位での一致を取る手法です。この手法はChin-Yew Lin先生とEduard Hovy先生によって、翻訳で使われていたBLEUという指標を参考に編み出されました。

[Automatic Evaluation of Summaries Using N-gram Co-Occurrence Statistics](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/07/naacl2003.pdf)

$$
ROUGE_N = \frac{\sum_{S \in references}\sum_{gram_n \in S} Count_{match}(gram_n)}{\sum_{S \in references}\sum_{gram_n \in S} Count(gram_n)}
$$

ROUGE-Nのスコアは、uni-gramの場合ROUGE-1、bi-gramの場合はROUGE-2といったように呼ばれます。評価に使われるのは、だいたいROUGE-3までで、それ以上はあまり使われません。

実際に計算してみましょう。以下は、上が生成した要約、下が人手で作成した要約とします。最初はuni-gramの例(1-gram=単語単位)で、一致した箇所を青色にしています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/25990/af233c63-5620-cbe2-7e24-f445d568d78f.png" width="400">

スコアを計算する際には、PrecisionとRecallの概念があります。

* Recall: 人手の文中の単語を、どれだけ当てられたか
  * 今回の場合、人手の要約は全11単語です。11個中6つが一致しているため、Recallは$\frac{6}{11} = 0.5454...$になります。
* Precision: 生成した要約が、どれだけ人手の要約に含まれているか
  * 今回の場合、生成した要約の単語は7つです。7個中6つが人手の要約に含まれているため、Precisionは$\frac{6}{7} = 0.8571...$になります。

RecallとPrecisionがあるということは、通常の機械学習と同様これらをバランスさせたF1スコアが算出できます。これでバランスのとれた評価が可能です。
以下は、bi-gram(2-gram)の例になります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/25990/31196673-f28e-49ad-8f4e-0b937212acd4.png" width="400">

こちらは、実際計算するとRecall=`0.3`、Precision=`0.5`、F1スコアは`0.374...`となります($\alpha=0.5$の場合)。

評価を行う際に、複数の人手で作成した要約と比較することも可能です。この場合、複数文分のN-gramとそれに対する一致で評価されます[^1]。そうすると、生成した要約に複数文に共通する単語が含まれている方が1単語で複数マッチを稼げるため効率が良くなります。これは、色々な人が書いた要約に共通する単語を含んでいた方がいいという意味で、直感と等しい動きになります。

なお、N-gramは隣り合った単語しか評価しないため、「花 は きれい」と「きれい　な 花」は同じ意味ですが単語の並びが異なるため、bi-gram(ROUGE-2)ではスコアが0になります。

えぇ、それなら単語だけ(uni-gram)で評価した方が良くない？という気分に一瞬なりますが、単語だけだと文の意味を捉えることができず、例えば「私は彼に手を挙げた」と「彼は私に手を挙げた」は意味が逆ですが単語レベルでは完全に一致するためuni-gram(ROUGE-1)ではスコアが1になります。

この、文脈の評価を行うにはある程度のシーケンスが必要だけど、シーケンスを取ろうとするとなかなかマッチしなくなる。反面マッチを優先させると文脈が考慮できない、というのは評価における一つのトレードオフになっています。この点を克服するための工夫が、様々なバリエーションを産んでいます。

## ROUGE-S/ROUGE-SU

ROUGE-SのSはSkip-gramの略で、並んでいない単語のペア(文中の単語の純粋な組み合わせ)を考慮します。これにより、先ほどの「花 は きれい」と「きれい　な 花」問題を解決することができます。

$$
Recall = \frac{Count_{match}(C(summary_{words}, reference_{words}))}{C(reference_{words})}
$$

$$
Precision = \frac{Count_{match}(C(summary_{words}, reference_{words}))}{C(summary_{words})}
$$

ROUGE-SUは、ROUGE-Sにペアだけでなく単語(uni-gram)の数/一致を加えたものになります(実は、文頭にダミーの記号を加えることで実装できます。これはダミー記号+文中単語≒単語とできるためです)。

ただ、文中の単語全ての組み合わせを考慮するとノイズが大きくなるため(「は」「が」など、単語をつなぐ助詞などの組み合わせが多くなる)、組み合わせを作る距離を制限します。この距離が0の場合は、通常のbi-gramと同じになります。

## ROUGE-L/ROUGE-W

ROUGE-Lは、生成した要約と人手で作成した要約とで「一致する最大のシーケンス」(longest common subsequence=LCS)を評価するというものです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/25990/82f37123-f7e5-d96b-0310-f73530cb01fb.png" width="400">

$$
Recall = \frac{LSC(summary_{words}, reference_{words})}{reference_{words}}
$$

$$
Precision = \frac{LSC(summary_{words}, reference_{words})}{summary_{words}}
$$

評価結果は一見ROUGE-1と変わりませんが、ROUGE-1と異なり連続している場合にしか評価されません。

<img src="https://qiita-image-store.s3.amazonaws.com/0/25990/d1fa23bd-84e2-a40d-8349-7cf16e2010f5.png" width="400">

なお、この「連続」は間に単語が入ってもOKになっています。ただ、その分間に単語が入っていてもいなくても評価結果が同じになってしまいます（ベースが"A-B-C-D-E"の場合、"**A-B-C**-X-Y"でも"**A**-X-**B**-Y-**C**"でも同じスコアになる)。ROUGE-Wは、この点を克服するため連続して続いている場合に重みをつけるという手法になります。

このように、ROUGE-Lはあくまで一致する「連なり」を評価します。互いに一致する最長のシーケンスを見るということは最大限文脈を考慮できるということであり、またその長さを事前に指定する必要もありません。

ただ、「最長のシーケンス」しか考慮されないため、最長以外の箇所がどれだけ一致していても考慮できないという弱みがあります。また、語順の変化には対応できません(「花 は きれい」と「きれい　な 花」問題)。

## ROUGE-BE

ROUGE-BEは他の手法とは異なり、文法的な要素間の関係(係り受け)を加味したモデルです。

BEはBasic Elementの略で、単語A-[関係]->単語Bをセットにしたものになります。例えば「おじいさんは山へ行った」なら「おじいさん」->[nsubj]->[行った]という感じです。ただ、どんな単語、どんな関係をBasic Elementの対象にすべきかはとても曖昧です。しかも、構文解析器によっても結果や単語間の関係の定義などは様々です([Automated Summarization Evaluation with Basic Elements](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/07/lrec_2006_be.pdf)では様々なパーサーで検証していますが、一致率は40%という低い値です。なお、一応[ツールが配布されています](https://www.isi.edu/publications/licensed-sw/BE/index.html))。

ただ、これは闇雲に単語のペアを取るよりは妥当な、また意味のあるペアを取ることができます。特に語順が柔軟な日本語のような言語では、こうした要素の加味が重要と思います。

## 「一致」の評価について

今まで「一致」という言葉をさらっと使ってきましたが、どのように一致をとるのかについてもいくつかバリエーションがあります。

* そのまま一致を取る
* 原型(lemma)に直して一致を取る
* 同義語(synonym)は集約して一致を取る

などです。Basic Elementの場合は、チャンク単位で比較すべきかという議論もあります("beautiful flower"で一単位か、"flower"のみかなど)。特に日本語の場合は品詞単位が細かいので、この点は重要な検討事項になります(英語だと"beautiful"で一語でも"きれいな"だと"きれい", "な"に分かれるetc)。

## どれを使えばいいのか

各ROUGEのスコアと、人が要約につけたスコアの相関を調べた結果があります。

[ROUGE: A Package for Automatic Evaluation of Summaries](http://aclweb.org/anthology/W04-1013)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/25990/86e5b3ed-55c1-eb49-b1c2-1a743d5c6369.png)

こちらを見ると、ROUGE-L/ROUGE-SU4がなかなかいい働きをするのではないかと思えます。上記にはROUGE-BEの結果がありませんが、ROUGE-BEの評価は以下になります(こちらは上記の評価に使われているDUC2001~2003ではなく、DUC2005のデータセットでの評価になります)。こちらは、人の評価とROUGE-BEについてSpearman/Pearsonの相関係数をとったものです。

[Automated Summarization Evaluation with Basic Elements](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/07/lrec_2006_be.pdf)

HMは関係する単語のみ、HMRはリレーションまで含めて一致を取った場合になります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/25990/8540a45f-988a-e495-c5c0-08df70f436fe.png" width="400">

DUC2005におけるROUGE-BE以外のスコアは以下になります。

[Overview of DUC 2005](http://duc.nist.gov/pubs/2005papers/OVERVIEW05.pdf)

<img src="https://qiita-image-store.s3.amazonaws.com/0/25990/a374baf6-9ec3-01cb-80aa-28617d7db7e3.png" width="400">

そこそこの働き・・・といったところでしょうか。ただ、この評価は言語によって大きく変わってくる可能性があります。残念ながら日本語の要約データセットがないため[^2]、日本語で比較したらどうなるかはわかりません。この点については、データセットを準備予定です。

# 評価指標の計測

ROUGEスコアの計測は、伝統的なPerlスクリプトがありそれで行われるのが通例のようです。いくつかあるPythonのパッケージも、このPerlスクリプトをPythonから呼び出すものが多いです。

[summanlp/evaluation](https://github.com/summanlp/evaluation)

Pythonで実装したパッケージもあるのですが、本家のPerlスクリプトと比較していないものが大半です。これではちょっと使いにくいですし、当然Perlが入っていないと動かないのでデフォルトで入っていないWindowsだと問題ありです。

## SumEval

そこで、今回元のPerlスクリプトとの一致をしっかりテストした要約評価ライブラリを作成しました。

[chakki-works/sumeval](https://github.com/chakki-works/sumeval)
<a href="https://github.com/chakki-works/sumeval" target="_blank">
  <img src="https://qiita-image-store.s3.amazonaws.com/0/25990/3a71fd36-29a8-9594-38cc-55973dcedcb7.png" alt="sumeval.png">
</a>
(Starをいただければ励みになります m(_ _)m)

名前はセンチメントのタスクである[SemEval](http://alt.qcri.org/semeval2017/index.php?id=tasks)をもじってつけました。

現時点でROUGE-NとROUGE-L、そしてROUGE-BEをサポートしています。依存関係のパースがあるROUGE-BE以外は元のPerlスクリプトと結果が一致することをテストで確認済みです。また、BLEUについてはこちらも元のPerlスクリプトとの一致の確認が取れている[SacréBLEU](https://github.com/awslabs/sockeye/tree/master/contrib/sacrebleu)からスコアを計算しています。

何より、日本語の評価をサポートしています。というのも、元のPerlスクリプトは完全英語前提で日本語は評価できないためです。今の所日英のサポートのみですが、多言語への拡張が簡単にできるようにしています。

Basic Elementの実装に必要な構文解析は、英語圏は[spaCy](https://github.com/explosion/spaCy)、日本語は[GiNZA](https://github.com/megagonlabs/ginza)、中国語は[pyhanlp](https://github.com/hankcs/pyhanlp)を使用しています。日本語で係り受け関係がとれるライブラリはほぼ[CaboCha](https://github.com/taku910/cabocha)しかなかったのですが、GiNZAのおかげで日本語でも標準的なタグ付け方法である[Universal Dependencies](https://nlp.stanford.edu/software/stanford-dependencies.shtml)に基づいた係り受け解析ができるようになりました。

以上、要約の評価スコアとその計測を行うライブラリを紹介しました。要約をやってみよう！という方の役に立てば幸いです。

# References

* [Automatic Evaluation of Summaries Using N-gram Co-Occurrence Statistics](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/07/naacl2003.pdf)
* [ROUGE: A Package for Automatic Evaluation of Summaries](http://aclweb.org/anthology/W04-1013)
* [Automated Summarization Evaluation with Basic Elements](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/07/lrec_2006_be.pdf)
* [Overview of DUC 2005](http://duc.nist.gov/pubs/2005papers/OVERVIEW05.pdf)
* [テキスト要約の自動評価](http://www.ls.info.hiroshima-cu.ac.jp/~nanba/pdf/JSAI_2008_final.pdf)
* [Basic Elementを用いた質問応答の自動評価](https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=40121&item_no=1&page_id=13&block_id=8)
* [BE: Basic Elements for Automated Evaluation of Summaries](https://www.isi.edu/publications/licensed-sw/BE/index.html)
* [summanlp/evaluation](https://github.com/summanlp/evaluation)
* [日本語 Universal Dependencies の試案 - 言語処理学会](http://www.anlp.jp/proceedings/annual_meeting/2015/pdf_dir/E3-4.pdf)

[^1]: M個の人手で作成した要約がある場合、各要約の評価を行うのに$M-1 * M$の評価セットを作成する手法もある(Jackknifing procedure)。これで、人手で作成した要約の偏りをならすことができる。
[^2]: [NTCIR](http://research.nii.ac.jp/ntcir/permission/perm-ja.html)で公開されているものは毎日新聞のデータをベースに要約しているので元データの記事を買わないといけないし、[日本語話し言葉コーパス](http://pj.ninjal.ac.jp/corpus_center/csj/)も有料なので実質オープンで手に入るデータはない。なお、買うための申請も一苦労で[契約書と職員証などの提示が必要](http://pj.ninjal.ac.jp/corpus_center/csj/subscription.html)。