日本語BERTで文章要約「要約マン」

Neil Wu
LSC PSD
Published in
6 min readDec 12, 2019

*2020/02/10更新 日本語の学習部分をGithubに上げました

前回、BERT初の文章要約「BertSum」を紹介した後、オープンソースの日本語の要約モデルが見つからないという事実が発覚しました。なので、 勢いに乗り日本語の文章要約モデルをPytorchで作って、多言語対応可能の要約モデル「要約マン」を書きました!要約はBertSumの構造をそのまま使っているので先に紹介文を見る事をお薦めします。

要約モデルが有る言語:英語、日本語 (2019.12月現在)

この記事の要約です。精度は学習データが少ないのでまだまだです。

Prerequisites

Pythonパッケージ

日本語NLP

* Windowsで開発していたのでJuman++v2のインストールに苦戦しました。同じWindowsで環境立ち上げる方はこの記事を参考して、cmakeはVisualStudioからインストールしたものを使う事をお薦めします。

モデル構造

BertSumの従来のコードは学習用に書かれていて、実際に要約する時はけっこう面倒くさかったので構造を以上の様に書き直しました。実際に言語対応の要約モデルが無かったらGoogle翻訳で英語にして要約してます。Githubは文末に公開しています。

  • LanguageFactory — 言語別の前処理(LanguageWorker)と言語別の要約モデルパス(PATH)を提供するモジュール
  • DataLoader — 文章を要約モデルの入力形式に変換するモジュール
  • ModelLoader — 学習モデルの構造作り
  • Translator — Google翻訳様の英語翻訳(無API key状態は回数制限有り)

*要約モデルの学習部分は主にBertSumさんのモデルを調整しているだけです。今は学習部分がばらついてるので、Youyakumanjpn_train.pyに書き直し完成次第Githubに公開します。

LanguageFactory

多言語対応させる為に言語別の処理を独立のクラスにしました。入力した言語で対応する言語処理キットを呼び出し、toolkitのアトリビュートに与えます。

言語処理キットは言語別で3つの目的で作られています。
1、文章の語句分け
2、トークン化
3、定数の提供(要約モデルパスと特殊トークンid)

これらのタスクをLanguageFactoryのtoolkitアトリビュートに与える事で言語の拡張等もスムーズにできるはずです。

DataLoader

BERTの入力長は固定の512トークンですが、実際に512トークンに収まる文章はあまりありません。なので長文対応させる為、DataLoaderでは長文の文章を語句単位で512トークン以下に切って別々の文章として要約を行っています。

ModelLoader

要約モデルはBertSumさんのTransformer-based summarizerを使っています。Bert > BertSummarizer > ModelLoaderの順です。

Summarizer

要約の結果(語句ごとの代表度スコア)を語句に還元するプロセスです。
流れは:モデルからスコアを出す>スコアを順番に並べる>上からn個語句を出す>要約結果表示する となっています。

要約結果を他の使い方をしたかったら、結果は_predの変数にしているので以下の部分を変えられば容易に変えれます。

Github

はここです。

学習済みモデルは今無料のGoogle drive使っているので、ダウンロードに制限がかかったらお手数ですが一日後に再度試してみてください。

日本語要約モデル学習

前で説明した様に、学習部分はYouyakuman_jptrain.pyに書き直し完成次第Githubに公開します。

学習データ

学習データについて、クローリングで集めたデータなので、申し訳ありませんがデータの公開は出来なくクローラだけを公開します。クロール先は要約文があるニュースサイトです。
初めてクローリングする方へ:
まずはここでクローニングについての礼儀をご覧ください。クローリングはリクエストにより相手のサーバに負担をかけるので、クロールを歓迎しないサイトもあります。その負担を分かっていてクローリングさせてくれるサイトには心から感謝しているので、くれぐれもクローリングの礼儀を守りましょう。

結論

長文を見てくれて有難うございます。
英語要約学習に使われてるデータ数は30万以上に比べ、日本語要約学習のデータ数は1万弱なので、正直日本語での要約精度はまだまだです。そこらへんはコツコツとデータを集めながら更新していく予定です。

if you like(this_article):
please(CLAPS)
follow(LSC_PSD)
# Thanks :)

--

--