COTOHAさんと対話しながら青空文庫を要約してもらおう

Qiita初投稿です。至らない点はご容赦ください。BugfixをPromiseします。

COTOHA APIの企画から良記事が量産されていて、読者としてとても楽しめています。
自分も何かしようかなと考えたところ、文学作品の要約をしてみたいな、と思いました。
当然ながら、オープンソースな文学というものは限られており、対象として青空文庫を選びました。

結論として学術的に有意義な結果にはなっていません。
COTOHA　APIを試行錯誤して自分なりに面白い結果になった、という程度の結論です。
でも、自然言語処理APIって、本来こういう楽しみ方ができるものじゃないですか？という提案。

COTOHA APIの中でも、要約APIにとても期待しています。
情報量の圧縮という意味で、忙しい現代人の良い補助ツールになるのかなと考えています。
「ツァラトゥストラはかく語りき」を渡したら「神は死んだ！」と返すような感じで。
まぁ、「神は死んだ！」という要約を得たとして我々の生活に何の助力になるのかわかりませんが。

環境はColaboratoryです。

# COTOHA API、あるいは

[COTOHA API](https://api.ce-cotoha.com/contents/index.html)

言語処理を気軽に試せるAPIです！
（Qiitaではもはや説明不要なので省略してしまう）

# 巨人の肩の上で
Qiitaの先人の肩に乗ることで手軽に大きなことができます。ありがとうございます。

[青空文庫の作品の感情レーダーチャートを作ってみた](https://qiita.com/e10persona/items/7a7643b266c2bdfbf7d0)
[Google colab上でCotohaを超手軽に使うためのコピペ用コード](https://qiita.com/Tommyyyyyyy/items/60f11a36c3a0fa789fd9)
[【はじめてのCOTOHA API】昔ばなしを要約してみた](https://qiita.com/kanatano_mirai/items/13cc858800c2cc3c89e4)

以下、各自のコードと哲学と情熱と面白半分の気持ちを受け継いで続けます。

# 巨人の肩の上に脚立を立てる

今回僕が書いたコードは、分析対象の文章を一定数(5000文字）に分割してAPIに渡すだけです。
脚立と称するのも憚られます。砂場の山くらいです。
句読点で句切るとかが正しいのだとは思いますけど技術力不足です。

```python
def summarize_by_cotoha(url):
  document=get_txt_from_aozorabunko(url)
  document_split=[document[i:i+5000] for i in range(0,len(document),5000)]
  document_summary=[]
  for sentense in document_split:
    document_summary.append((cotoha_call("summary",sentense))["result"])

  return document_summary
```

# いざ、青空文庫を要約してみる

文学的素養が無いもので、「太宰の人間失格」という、好意的に捉えれば最大公約数なテーマで試しました。
読んだことありませんが。タイトルがなぜか心を打ちますね。

```python

#人間失格
ningenshikkaku=get_txt_from_aozorabunko("https://www.aozora.gr.jp/cards/000035/files/301_14912.html")
cotoha_call("summary",ningenshikkaku)

===>
要約（β）
===>
<Error> BAD REQUEST

```

# 試練
なに？BAD REQUESTって？
リクエストが長すぎるとエラーになるとは聞いてたけど、BAD REQUEST？

若干イラっとしたのでCOTOHAさんを問い詰めます

```python

cotoha_call("summary",'''
エラーの原因がよくわからない。
BAD REQUESTと言われても困るんだが？
なんとかいいたまえ！

''')

===>
要約（β）
===>
{'result': 'エラーの原因がよくわからない。', 'status': 0}

```

どうやら「エラーが出たぞ！」以外の情報はゴミだと判定されたようです

時事ネタを入れてみて反応を探る

```python 


cotoha_call("summary",'''
エラーの原因がよくわからない。
BAD REQUESTと言われても困るんだが？
なんとかいいたまえ！
今日はいい天気ですね！春一番ですね！桜が待ち遠しいですね？コロナウイルス収束しませんかね？

''')

===>
要約（β）
===>
{'result': 'エラーの原因がよくわからない。', 'status': 0}
```

エラーに文句言うクレーマーとしか判定されてないらしい

夏目漱石で唯一知ってるフレーズとか、織田信長の辞世の句とか入れてみる

```python

cotoha_call("summary",'''
エラーの原因がよくわからない。
BAD REQUESTと言われても困るんだが？
なんとかいいたまえ！
今日はいい天気ですね！春一番ですね！桜が待ち遠しいですね？コロナウイルス収束しませんかね？

吾輩は猫である。

人間５０年
下天のうちをくらぶれば　
夢幻のごとくなり　
一度生を受け
滅せぬもののあるべきか
''')

===>
要約（β）
===>
{'result': '人間５０年下天のうちをくらぶれば 夢幻のごとくなり 一度生を受け滅せぬもののあるべきか。', 'status': 0}

```

やっと反応してくれた。
織田信長の辞世の句に比べたら、僕の悪質なクレームはゴミ以下らしい

# ここでようやく文章を分割してAPIに渡すことにした


```python

ningen_summary=summarize_by_cotoha("https://www.aozora.gr.jp/cards/000035/files/301_14912.html")

['私はこれまで、こんな不思議な表情の子供を見た事が、いちども無かった。',
 '下男たちまで、今夜の演説会はどうだったと母に聞かれ、とても面白かった、と言ってけろりとしているのです。',
 '自分がお道化を演じ、男はさすがにいつまでもゲラゲラ笑ってもいませんし、それに自分も男のひとに対し、調子に乗ってあまりお道化を演じすぎると失敗するという事を知っていましたので、必ず適当のところで切り上げるように心掛けていましたが、女は適度という事を知らず、いつまでもいつまでも、自分にお道化を要求し、自分はその限りないアンコールに応じて、へとへとになるのでした。',
 '自分は竹一にだけは、前から自分の傷み易い神経を平気で見せていましたし、こんどの自画像も安心して竹一に見せ、たいへんほめられ、さらに二枚三枚と、お化けの絵を画きつづけ、竹一からもう一つの、「お前は、偉い絵画きになる」という予言を得たのでした。',
 'しかし、自分には、それはわかり切っている事のように思われました。',
 '自分は、下宿のその部屋に、ひとりでじっとしているのが、おそろしく、いまにも誰かに襲われ、一撃せられるような気がして来て、街に飛び出しては、れいの運動の手伝いをしたり、或いは堀木と一緒に安い酒を飲み廻ったりして、ほとんど学業も、また画の勉強も放棄し、高等学校へ入学して、二年目の十一月、自分より年上の有夫の婦人と情死事件などを起し、自分の身の上は、一変しました。',
 'ツネ子は、いまにキスされる。',
 'しかし、あなたの気持がしっかりしていて、将来の方針をはっきり打ち樹て、そうして私に相談をしてくれたら、私は、たといわずかずつでも、あなたの更生のために、お手伝いしようとさえ思っているんです。',
 '自分はこれまで、自分のほうから堀木の家をたずねて行った事は、いちども無く、たいてい電報で堀木を自分のほうに呼び寄せていたのですが、いまはその電報料さえ心細く、それに落ちぶれた身のひがみから、電報を打っただけでは、堀木は、来てくれぬかも知れぬと考えて、何よりも自分に苦手の「訪問」を決意し、溜息をついて市電に乗り、自分にとって、この世の中でたった一つの頼みの綱は、あの堀木なのか、と思い知ったら、何か脊筋の寒くなるような凄じい気配に襲われました。',
 '自分は、それ以来、シゲ子にさえおどおどしなければならなくなりました。',
 '「飲もうか」と自分。',
 '信頼は罪なりや。',
 'ヨシ子は、何か、自分がヨシ子の身代りになって毒を飲んだとでも思い込んでいるらしく、以前よりも尚いっそう、自分に対して、おろおろして、自分が何を言っても笑わず、そうしてろくに口もきけないような有様なので、自分もアパートの部屋の中にいるのが、うっとうしく、つい外へ出て、相変らず安い酒をあおる事になるのでした。',
 'その友人は、私の大学時代の謂わば学友で、いまは某女子大の講師をしているのであるが、実は私はこの友人に私の身内の者の縁談を依頼していたので、その用事もあり、かたがた何か新鮮な海産物でも仕入れて私の家の者たちに食わせてやろうと思い、リュックサックを背負って船橋市へ出かけて行ったのである。']


```

僕のように文学的才覚が無い人間は3行じゃないと理解できないので、さらに要約を敢行する

```python

ningen_summary_summary=cotoha_call("summary",''.join(ningen_summary))
ningen_summary_summary

===>
要約（β）
===>
{'result': 'ヨシ子は、何か、自分がヨシ子の身代りになって毒を飲んだとでも思い込んでいるらしく、以前よりも尚いっそう、自分に対して、おろおろして、自分が何を言っても笑わず、そうしてろくに口もきけないような有様なので、自分もアパートの部屋の中にいるのが、うっとうしく、つい外へ出て、相変らず安い酒をあおる事になるのでした。',
 'status': 0}
```

つまり人間失格は、
**ヨシ子は相変わらず安い酒をあおる事になるのでした**
がCOTOHAさんの要約らしいです。ヨシ子さんて誰？現場猫の画像が脳裏に・・・
# その他の作品

```python 
## 裸のおうさま（著作権表示が微妙だったので意訳）
hadaka_summary=summarize_by_cotoha("https://www.aozora.gr.jp/cards/000019/files/46319_23030.html")
hadaka_summary

["二人の詐欺師がいるだけだよ"],["でも王様、裸だよ？"]
```

結構核心をついてますが、この2つを要約APIにかけると前者が勝ちました。
王様より詐欺師のほうがインパクト強いらしいです。

```python

#  相対性理論

soutaisei_summary=summarize_by_cotoha("https://www.aozora.gr.jp/cards/001428/files/50328_64360.html")
soutaisei_summary

['私達はエーテルに関して静止する各の物体をどうにか絶対静止のものと云うことが出来ます。',
 "この坐標系 K' に対しても一つの時計体系をその空間に配置し、それらをすべて K' と一緒に動いているようにしますと、私達はこの K' に関して静止している時計を全く上に与えた規定に従って合わせることが出来ます。",
 '運動状態における時計の進む速さは、この時計の指針の位置を、K に対して静止しておりかつ K に関しての時間を測るような時計のうちでちょうど今考に取った運動時計がその傍を通り過ぎるようなものの指針位置といつも比較して見出されると考えなければなりません。']

# さらに要約
cotoha_call("summary",''.join(soutaisei_summary))

{'result': "この坐標系 K' に対しても一つの時計体系をその空間に配置し、それらをすべて K' と一緒に動いているようにしますと、私達はこの K' に関して静止している時計を全く上に与えた規定に従って合わせることが出来ます。",
 'status': 0}
```

うーん、要約できたのだろうか。
COTOHAさんの「お前が理解できないものを渡すなボケが」という声が聞こえてきた気がします
ありがとうございます

# 蛇足

著作権考えるのが面倒なので、最近の大臣の発言を要約APIにかけてみた

```python

cotoha_call("summary","私の中で30年後を考えた時に、30年後の自分は何歳かなと発災直後から考えていました。だからこそ私は健康でいられれば、30年後の約束を守れるかどうかという、そこの節目を見届けることが、私はできる可能性のある政治家だと思います。")

{'result': '私の中で30年後を考えた時に、30年後の自分は何歳かなと発災直後から考えていました。', 'status': 0}

```

要点の無いものを要約できるかよ、というCOTOHAさんの声が聞こえました

# まとめ

ほかに、ヘンゼルとグレーテルとか、あかずきんちゃんとかためしたのですが、いまいちでした。
青空文庫に入っているようなものは、文体が古いものがほとんどなので、相性が悪そうです。

1フレーズで要約、2フレーズで要約、とか指定できるとさらに応用が広がる気がします！

COTOHA APIの今後の発展に栄光あれ！