2018年夏休みの2ヶ月間, 主に土日にやった研究まとめ.
2018/11/21 追記: ROUGE スコア, 全て埋めました.
概要
- 近年, 自動要約技術として, 抽出型+抽象型要約を用いた手法は高精度であることが知られている.
- ↑ の手法は抽象型, 抽出型それぞれを学習し重要な文を中心に要約を生成している.
[仮説] 重要語抽出ぐらいなら学習なしでもそこそこ取れる手法があるので, それと抽象型を組み合わせれば, 学習をそれほどせず同程度の性能が出るのでは?
[提案手法] 制約語として自動重要語抽出したものを設定, 抽象型要約の枠組みでこの制約語を出すようにさせる.
貢献
- 従来のものと比べて, 学習しないといけない部分が減る.
- 制約語付き推論を抽象型要約で試した.
- 既存の抽象型要約にそのまま適応可能な手法.
- ユーザーインタラクションな要約についての取り組み.
前提知識 (先行研究)
自動要約に関する内容はこの記事がすごく参考になるので割愛します.
抽出型 + 抽象型要約
A Unified Model for Extractive and Abstractive Summarization using Inconsistency Loss. Hsu et al., ACL2018 [paper]
Hsu et al. は抽出型要約で要約対象の文章から重要な文を決め, その重要さを見ながら抽象型要約をしている.
→ 抽出型要約, 抽象型要約をそれぞれ学習しなければならず, ちょっとめんどくさい.
制約語付き推論
Lexically Constrained Decoding for Sequence Generation Using Grid Beam Search. Hokamp and Liu., ACL2017 [paper] [わかりやすい? slide]
Hokamp and Liu. は推論時に使われる技術である Beam Search を, 制約語を含むようにした Grid Beam Search として拡張した.
→ 推論時に関する手法なので, 任意の学習モデルに適応でき, 機械翻訳で制約語を考慮した翻訳ができることを示した.
→ 今回はこの手法を抽象型要約に適応した.
重要語抽出
TextRank: Bringing Order into Texts. Mihalcea and Tarau., EMNLP2004 [paper]
Mihalcea and Tarau. は Web ページのランキングアルゴリズムである PageRank を, 文章中の重要語抽出に用いた.
→ 学習なしで, そこそこの精度の重要語が獲得できる.
(この そこそこ が結構大事...)
提案手法
- 要約したい文章に対して, TextRank による重要語抽出を行い, 要約に含みたい単語を求める.
- 1で求めた重要語を制約語とした推論を行う.
これだけ!(シンプルにしたいので)
実装: 抽象型要約まわり
抽象型要約: Pointer-Generator Networks
論文: Get To The Point: Summarization with Pointer-Generator Networks. See et al., ACL2017 [paper]
実装まで含めた参考資料: https://qiita.com/knok/items/9a74430b279e522d5b93
今回使用した Pointer-Generator の実装 (PyTorch): https://github.com/atulkum/pointer_summarizer
というわけで今回は OOV も扱える Pointer-Generator をベースに制約語付き推論を行った.
実装: 制約語付き推論
普通の Beam Search に対して, 制約語の軸 (Grid の気持ち) が追加されるイメージ.
かなりざっくり書くとこんな感じ1↓ (詳細に関しては論文中のアルゴリズムを参照してください)
# 横軸 (time_step): 各時刻 t の Beam
# 縦軸 (grid_height): 制約語を入れた数
# constrain_word: 実際に入れたい制約語
for time_step in range(max_decoding_steps):
start = max(time_step - (max_decoding_steps - grid_height), 0)
end = min(time_step, grid_height) + 1
for height in range(start, end):
generate, new_constrain を初期化
for hyp in Beam[time_step-1][height]:
# model.generate(hyp) で前ステップの仮説に基づいて次の仮説を生成している (横軸シフト)
generate.append(model.generate(hyp))
if height > 0:
for hyp in Beam[time_step-1][height-1]:
# model.add_word(hyp, constrain_word) で前ステップの仮説に対して制約語をくっつけている (斜め上シフト)
new_constrain.append(model.add_word(hyp, constrain_word))
# 横軸シフト, 斜め上シフトで得た新しい仮説について, スコアに基づいて良いものをk個のみ保持する
generate.extend(new_constrain)
Beam[time_step][height] = [hyp for _, hyp in zip(range(k), sorted(generate, key=lambda x:score(hyp), reverse=True))]
実験
使用データ2: CNN/DailiyMail
抽象型要約の設定: Pointer-Generator の元論文に揃えた
TextRank の設定: 重要語として 名詞, 形容詞 のみ取り出す. 重要語の数は [1,3] で変えた.
実装上の注意: 簡単な事前実験のつもりだったので, 制約語として 単語単位 のものしか考慮していない. (Grid Beam Search 自体は フレーズ単位 のものも考量可能)
評価: ROUGE
Baseline: Pointer-Generator
Proposed: Pointer-Generator with TextRank (制約語: 3つ)
Oracle: Pointer-Generator with oracle word (reference である要約から適当に単語を持ってきて制約語とした場合, 制約語は3つ)
Baseline-Proposed: 抽出型+抽象型がいけそうかみてみる
Baseline-Oracle: 理想的な単語を制約語とする, つまりユーザーインタラクションな状況でよりよく要約できるか?
結果
定量評価
手法 | ROUGE-1 | ROUGE-2 | ROUGE-l |
---|---|---|---|
Baseline | 37.66 | 16.18 | 34.58 |
Proposed | 35.48 | 14.21 | 32.90 |
Oracle | 36.95 | 15.01 | 34.19 |
Baseline の方が Proposed より高い
→ そもそも重要語抽出の精度がそれほど高くなく, その単語を必ず出力するようにしているので...
Baseline の方が Oracle より高い
→ 正解の中から3単語適当に見つけて出力させている, ということはモデルが出そうとしたものが正解の要約と異なる方向性の場合, モデルの気持ちを歪めている?ような形になってしまい, auto-regression 的に厳しくなってしまう?
出力例
デモを公開しています.3
とりあえず CNN news の入力ならそこそこ動きそうなのでよかったら試してみてください.
考察
- そもそも TextRank って学習なしではそこそこいいが, その結果を制約語として必ず出力させるのはさすがに無理がある
→ 抽出型+抽象型 のアプローチとして提案は厳しそう - 制約語を考慮した要約の良さを評価するのに ROUGE が評価指標としていいのかわからない...
→ ユーザーインタラクションとしてうまくいっているのかわからない
最後に
以上, 制約語付き推論を要約に用いた話でした.
個人的に, 学習済みモデルが出したい出力を推論時に歪めることがどう影響するのか知りたいと思っているので, そういう方面で色々研究していきたいですね.
制約語付き推論は応用の幅が広いと思うので, 色々なところで試してみてください.