今回はPysummarizationというライブラリを使って文章の要約を行ってみたいと思います。
pysummarizationの概要
pysummarization は自然言語処理とニューラルネットワーク言語モデルを用いた 自動要約のPythonライブラリです。内部で深層学習(ディープラーニング)ライブラリのpydbmが使用されており、RNNの改良版LSTMによるエンコーダー/デコーダーを実装しているところが特徴で要約精度に定評があります。
公式ドキュメント:https://code.accel-brain.com/Automatic-Summarization/
前準備
pysummarizationを使用するには事前にMeCabなどをインストールしておく必要があります。
以下の通り pip コマンドで必要なライブラリをインストールします。
# ライブラリをPIPでインストールする pip install pysummarization pip install mecab-python3 pip install unidic-lite pip install nltk
pysummarization の使い方
まずインストールしたライブラリをimportします。
from pysummarization.nlpbase.auto_abstractor import AutoAbstractor from pysummarization.tokenizabledoc.mecab_tokenizer import MeCabTokenizer from pysummarization.abstractabledoc.top_n_rank_abstractor import TopNRankAbstractor
これで準備は整いました
試しに夏目漱石の吾輩は猫であるの冒頭部分を要約してみます。
参照:https://www.aozora.gr.jp/cards/000148/files/789_14547.html
# テキストを読み込む document = '''吾輩わがはいは猫である。名前はまだ無い。 どこで生れたかとんと見当けんとうがつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪どうあくな種族であったそうだ。この書生というのは時々我々を捕つかまえて煮にて食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌てのひらに載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始みはじめであろう。この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶やかんだ。その後ご猫にもだいぶ逢あったがこんな片輪かたわには一度も出会でくわした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷうぷうと煙けむりを吹く。どうも咽むせぽくて実に弱った。これが人間の飲む煙草たばこというものである事はようやくこの頃知った。 この書生の掌の裏うちでしばらくはよい心持に坐っておったが、しばらくすると非常な速力で運転し始めた。書生が動くのか自分だけが動くのか分らないが無暗むやみに眼が廻る。胸が悪くなる。到底とうてい助からないと思っていると、どさりと音がして眼から火が出た。それまでは記憶しているがあとは何の事やらいくら考え出そうとしても分らない。 ふと気が付いて見ると書生はいない。たくさんおった兄弟が一疋ぴきも見えぬ。肝心かんじんの母親さえ姿を隠してしまった。その上今いままでの所とは違って無暗むやみに明るい。眼を明いていられぬくらいだ。はてな何でも容子ようすがおかしいと、のそのそ這はい出して見ると非常に痛い。吾輩は藁わらの上から急に笹原の中へ棄てられたのである。''' # 自動要約のオブジェクトを生成 auto_abstractor = AutoAbstractor() # トークナイザー(単語分割)にMeCabを指定 auto_abstractor.tokenizable_doc = MeCabTokenizer() # 文書の区切り文字を指定 auto_abstractor.delimiter_list = ["。", "\n"] # キュメントの抽象化、フィルタリングを行うオブジェクトを生成 abstractable_doc = TopNRankAbstractor() # 文書の要約を実行 result_dict = auto_abstractor.summarize(document, abstractable_doc) print(result_dict)
summarizer は戻り値として辞書を返してくるので、その中の「summarize_resul’」というkeyに要約文書のリストになって格納されています。
要約結果部分を抽出するためには以下のように記述してあげると良いです。
#要約結果の取り出し sum_text = '' for x in result_dict["summarize_result"]: sum_text += x print(sum_text)
要約結果は重要度から順に10行が返って来ます。
今回は以下の通り要約されました。
<実行結果>
どこで生れたかとんと見当けんとうがつかぬ。 何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。 吾輩はここで始めて人間というものを見た。 しかもあとで聞くとそれは書生という人間中で一番獰悪どうあくな種族であったそうだ。 この書生というのは時々我々を捕つかまえて煮にて食うという話である。 しかしその当時は何という考もなかったから別段恐しいとも思わなかった。 ただ彼の掌てのひらに載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。 掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始みはじめであろう。 この時妙なものだと思った感じが今でも残っている。 それまでは記憶しているがあとは何の事やらいくら考え出そうとしても分らない。
またテキストと一緒に抽出された行番号と重要度が取得したい場合は以下のように記述してあげるとよいです。
for x in zip(result_dict['scoring_data'],result_dict["summarize_result"]): print(x)
<実行結果>
((2, 14.0), ‘\u3000どこで生れたかとんと見当けんとうがつかぬ。\n’)
((3, 14.727272727272727), ‘何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。\n’)
((4, 14.0), ‘吾輩はここで始めて人間というものを見た。\n’)
((5, 19.36), ‘しかもあとで聞くとそれは書生という人間中で一番獰悪どうあくな種族であったそうだ。\n’)
((6, 17.19047619047619), ‘この書生というのは時々我々を捕つかまえて煮にて食うという話である。\n’)
((7, 12.8), ‘しかしその当時は何という考もなかったから別段恐しいとも思わなかった。\n’)
((8, 23.310344827586206), ‘ただ彼の掌てのひらに載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。\n’)
((9, 18.892857142857142), ‘掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始みはじめであろう。\n’)
((10, 10.88888888888889), ‘この時妙なものだと思った感じが今でも残っている。\n’)
((21, 8.521739130434783), ‘それまでは記憶しているがあとは何の事やらいくら考え出そうとしても分らない。\n’)
参照:【Python】ZIP構文で複数のリスト型配列をfor文で同時に回すサンプルコード
まとめ
今回は文書要約用のライブラリ pysummarizationのインストール方法、使い方について紹介しました。重要な文章だけを抽出することができますが、ニュアンスは同じで別の表現する、みたいな処理はできないので、会議の要約とかはできそうですが、そのまま使うことは難しいかなと思います。
コメント