【python/sumy】様々な文章要約アルゴリズムで羅生門を要約してみる。

自然言語処理の領域の一部に、文章要約の世界があります。

そこではLexRankだとかTextRankだとか、LSAだとかいろいろな文章を短くする(というよりかは重要な文章を特定する)アルゴリズムが開発されていて、pythonのsumyというライブラリではとてもお手軽にそれらを利用することができます。

アルゴリズムの中身は全然理解できていなくて、面白そうだから触ってみた、くらいの感覚ですが、同じように文章要約どんなもんかなと気になっている人の参考になれば幸いです。

 

テキストデータを準備

今回使う「羅生門」のテキストデータは青空文庫のサイトからダウンロードできます。

(※著作権は切れており、ダウンロードしても起こられることはありません。)

https://www.aozora.gr.jp/cards/000879/card127.html#download

こちらから、「127_ruby_150.zip」のファイルをダウンロードして、解凍すると中にテキストファイルが入っています。

 

データの前処理~分かち書き

 

rashomon.txtには本文以外にもルビの説明や注記等、今回やりたいことに対して余計な情報が含まれているので、まずはそれを削除してしまいます。

そのあと、janomeを用いて文章を分かち書きしていきます。

 

データの前処理

データを読み込み

with openでデータを読み込みます。

そのさいshift-jis形式にエンコードしておきましょう。

前処理

reモジュールにより、正規表現を用いた文字列変換を行うことができます。

基本的な使い方としてはsampleという変数に文章が入っていたとしたら、

reg_sample = re.sub(“置換前の文字(列)”,”置換後の文字(列)”,sample)

みたいな風に文字列置換を行えます。

[] はその間に入る各文字を認識してくれて、^は除外、+は繰り返しを表現するので、例えば

re.sub(“《[^》]+》”, “”, data)とした場合は、《~~》という固まりを空白に置換、ということになります。

※rashomon.txtでは 下人《げにん》 といった表現でルビが振られています。

 

本文だけを抽出する

 

分かち書き

janomeを用いて文章を分かち書きします。

sumyで処理するために、例えば「この男のほかには誰もいない」という文章を

「この 男 の ほか に は 誰 も い ない」

なんていう風に形態素解析して各単語間に空白をいれる感じにでデータを変形します。

※初めて使う人はpip install janomeをしておきましょう。

こんな感じでテキストが分かち書きされていればOKです!

 

文章要約

sumyというモジュールを使用します。sumyとは↓

Module for automatic summarization of text documents and HTML pages.

https://pypi.org/project/sumy/

この引用元のページにいくと、テキストサマライザーとしてどんなメソッドを使えるかが一覧で表示されています。

各アルゴリズムに関しては、リンク先で紹介されている論文を読むことで理解を深められます。

お試しで、今回はLSAとLexRank,TextRankでやってみようと思います。

はじめてつかう方は

pip install sumy

pip install tinysegmenter

をしておきましょう。

実装についてはこちらのブログをまんま参考にさせてもらいました。ありがとうございます。

 

 

羅生門は、飢え死ぬか、盗人になるかの2択に悩んでいた下人が、死人の髪の毛を抜いている(≒盗んでいる)老婆の姿を目撃し、そこに憎悪を抱くものの、老婆の話を聞いて悪を肯定(盗人になる決意)をした、といった話の流れだったかと思います。

そういう風に小説をとらえるならば、どの要約文もその一部分しか抽出できていない感覚を受けますね。

 

というわけで、中身まったくわからない素人がとりあえず使ってみたまとめでした。

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