Pythonで日本語の要約をしてみる

# 概要
以前、Pythonを使っていた時に自然言語学処理(NLP)について学んだことがあり、久しぶりに学習してみたくなったので、その内容をまとめます

今回は「要約」という分野で何ができるのか、簡単なのかみたいなところを調べてみたいと思います

# Pythonで使える要約ライブラリ
大きく2つある模様です
1. sumy
    - 抽出的要約ライブラリ（＝文章中から重要な文を抜き出す）
1. transformers
    - Hugging Face社が提供する自然言語処理の万能ライブラリ

sumyはセットアップが簡単で簡易的に要約できるようです
transformersは事前学習済みのAIモデルを使って要約できる、こちらは要約した文章を生成する模様

# 実際に使ってみる
ものは試しということで、早速それぞれ使ってみます
(こういう時はvenvとかで一時的に環境を用意しておくと良いかもですね)

## sumy
必要なモジュールをpip installします

```sh
pip install sumy
pip install numpy
pip install tinysegmenter
```

テストコードは以下の感じで用意します
`text =`の部分に要約したい文章を入れると最終的にsummarizerで指定した文の数で要約してくれるという流れです

```py
from sumy.parsers.plaintext import PlaintextParser
from sumy.nlp.tokenizers import Tokenizer
from sumy.summarizers.lex_rank import LexRankSummarizer

text = "ここに長文テキストを入れます。"
parser = PlaintextParser.from_string(text, Tokenizer("japanese"))
summarizer = LexRankSummarizer()
summary = summarizer(parser.document, 3)  # 3文に要約

for sentence in summary:
    print(sentence)
```

このテストコードでは要約するためのアルゴリズムとして`LexRank`というアルゴリズムを使っています

いろいろ説明をみましたが、文章を文単位に分割して各文の類似度を計算して重要度が高いものを出力しているようでした

sumyで使えるアルゴリズムとしては「LSA」「Edmundson」などもあるそうです

適当にWikipediaのPythonのページを要約した結果が以下になります
概要部を要約してもらいましたが、Pythonの説明としては「Pythonは動的に〜」以降は要約すると不要だそうです
もしかすると要約対象が短い可能性があるかもしれませんね

```
# 要約前
Pythonは1991年にグイド・ヴァン・ロッサムにより開発されたプログラミング言語である。

最初にリリースされたPythonの設計哲学は、ホワイトスペース(オフサイドルール)の顕著な使用によってコードの可読性を重視している。その言語構成とオブジェクト指向のアプローチは、プログラマが小規模なプロジェクトから大規模なプロジェクトまで、明確で論理的なコードを書くのを支援することを目的としている。

Pythonは動的に型付けされていて、ガベージコレクションされている。構造化（特に手続き型）、オブジェクト指向、関数型プログラミングを含む複数のプログラミングパラダイムをサポートしている。Pythonは、その包括的な標準ライブラリのため、しばしば「バッテリーを含む」言語と表現されている[† 1]。

Pythonのインタプリタは多くのOSに対応している。プログラマーのグローバルコミュニティは、自由かつオープンソース [† 2] のリファレンス実装であるCPythonを開発および保守している 。非営利団体であるPythonソフトウェア財団は、PythonとCPythonの開発のためのリソースを管理・指導している。

# 要約後
Pythonは1991年にグイド・ヴァン・ロッサムにより開発されたプログラミング言語である。
最初にリリースされたPythonの設計哲学は、ホワイトスペース(オフサイドルール)の顕著な使用によってコードの可読性を重視している。
その言語構成とオブジェクト指向のアプローチは、プログラマが小規模なプロジェクトから大規模なプロジェクトまで、明確で論理的なコードを書くのを支援することを目的としている。
```

## transformers
こちらもまずはpip installから

```sh
pip install transformers
pip install torch
pip install protobuf
pip install sentencepiece
```

次にテストコードは以下の通りです
pipelineというものを初めに定義していますが、これはテキストのトークン化・モデルの読み込みと推論・トークンからの復元という一連の流れを自動的にやってくれるもののようです

summarizerでは要約対象の文章を何文字の範囲で要約するか決定、決まった結果を返すかどうか(do_sample)を決めることができます

```py
from transformers import pipeline

# 要約タスク用のパイプラインを作成
summarizer = pipeline("summarization", model="ku-nlp/bart-base-japanese")

text = "ここに長文テキストを入れます。"

# 要約を生成
summary = summarizer(text, max_length=100, min_length=30, do_sample=False)

# 結果を表示
print(summary[0]['summary_text'])
```

モデルはtohoku-nlp/bert-base-japaneseというものを使いました
日本語の要約をする際に有効なモデルだそう

こちらもsumyと同じ文章で要約してみましたが、結果としては、要約できているとは言えない結果が返ってきてしまいました
やはり自分でモデルを組み立てないとうまくはいかないのでしょうか

```
は年にグイド・ヴァン・ロッサムにより開発されたプログラミング言語である最初にリリースされたの設計哲学は既ホワイトスペースオフサイドルールの顕著な使用によってコードの可読性を重視している蚊その言語構成とオブジェクト指向のアプローチは 。非営利団体
```

## Appendix
ここまではPythonからライブラリを使って要約を試してきてみましたが、ChatGPTはどうでしょうか

```
Pythonは1991年にグイド・ヴァン・ロッサムによって開発された、可読性を重視した汎用プログラミング言語である。動的型付けやガベージコレクション、複数のパラダイムをサポートし、標準ライブラリが豊富で「バッテリー付き」言語と称される。オープンソース実装であるCPythonはグローバルなコミュニティとPythonソフトウェア財団によって維持・開発されている。
```

やっぱりしっかりと要約されているように感じますね
アプリケーション作成しないのであればChatGPTに任せた方が無難でしょう

# おわりに
久しぶりに自然言語学処理やモデルについて学ぶ機会になりました
時間をとってモデルの学習などにも手を出していければと思います