自然言語処理ツールで寿限無を要約してみた

寿限無という落語をご存知でしょうか。子供の長寿を願って、やたらと長い名前をつけるお話です。

https://ja.wikipedia.org/wiki/%E5%AF%BF%E9%99%90%E7%84%A1

寿限無のフルネームは以下になります。ふりがなのない、ニコニコ大百科の記述をコピペしました。

:::note info
寿限無寿限無五劫の擦り切れ海砂利水魚の水行末雲来末風来末食う寝る処に住む処やぶら小路の藪柑子パイポパイポパイポのシューリンガンシューリンガンのグーリンダイグーリンダイのポンポコピーのポンポコナーの長久命の長助
:::

https://dic.nicovideo.jp/a/寿限無

「寿限無（ことぶきかぎりなし）」このシンプルな名前が人の記憶に留めたのではないでしょうか。

僕は他人から「話が長い」「まとめてくれ」とよく言われます。ここは一つPCの力を借りてみます。

まず、summpyという文書要約パッケージをインストールします。

summpyはリクルートが公開したpython2.7用のコードでした。

https://blog.recruit.co.jp/rtc/2015/10/30/summpy-released/

https://github.com/recruit-tech

https://github.com/recruit-tech/summpy

python2系のコードをpython3系で実行しようとすると往々にしてエラーが発生します。僕の実行環境もpython3系なのでpython3系にない関数が存在しないなどのエラーが起きました。そこでエラー部分を3系に書き直すことも試しましたが、実行できませんでした。

https://qiita.com/Sai_13/items/4b83e6e866f7de9d75cf

そこで、3系でも動くように書き直されたコードを活用いたしました。

僕が参考にしている、「実践で学ぶ機械学習活用ガイド」の著者である吉崎亮介さんがMIT licenseで公開されていたので、こちらでもライセンスをコピペします。

https://book.mynavi.jp/ec/products/detail/id=106658

https://book.mynavi.jp/supportsite/detail/9784839969226.html

:::note warn
The MIT License (MIT)
Copyright © 2015 Recruit Technologies Co.,Ltd.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
:::

https://github.com/kikagaku/summpy

https://github.com/kikagaku/summpy/blob/master/LICENSE

https://and-engineer.com/articles/YFg2lRAAACMAvxPW

早速、ターミナルからgitのコードを使用するフォルダにダウンロードしてから、JupyterNotebookで下記のコードによりインポートします。

```terminal
$ git clone https://github.com/kikagaku/summpy.git
```

```python:qiita.ipynb
from summpy.summpy.lexrank import summarize
```

次に、jugemを定義します。文意の途切れ目で「。」を打っているのは、「、」や「.」で区切っても、文（意）の区切りと認識されず、summpyの機能である「重要な文を取捨選択する」機能が働かなかったためです。

```python:qiita.ipynb
jugemu = '寿限無。寿限無。五劫の擦り切れ。海砂利水魚の。水行末雲来末風来末。食う寝る処に住む処。やぶら小路の藪柑子。パイポパイポパイポのシューリンガン。シューリンガンのグーリンダイ。グーリンダイのポンポコピーのポンポコナーの。長久命の長助'
```

最後に、要約後の文の数（sent_limit)を指定して、下記のコードを実行すると、要約ができます。

```python:qiita.ipynb
sentences, debug_info = summarize(
    jugemu, sent_limit=1, continuous=True, debug=True
)
```

```python:qiita.ipynb
sentences
```

実行結果は下の画像の通りです。「寿限無」の一文が「重要」と認識され、無事に要約されました。

![スクリーンショット 2022-08-24 15.58.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210818/c87256f6-a229-296c-c22e-d99e33099bf2.png)

おそらく、冒頭かつ二回繰り返される単語だったので、重要と判断されたのだと考えられます。

必ずしも「寿限無」が抽出されるわけではなく、例えば、jugemuの冒頭での「寿限無。寿限無。」を「寿限無寿限無。」と一つにまとめて、抽出する文の数を三文にすると、以下のような結果になります。

![スクリーンショット 2022-08-24 15.59.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210818/24d8e664-f912-4e27-4718-72b55d62d613.png)

ターミナルで「Janome」をインストールして、下記のコードを実行すると形態素解析もできます。

上述した教科書のサンプルコードをメインで、他の記事なども参考にしました。

https://qiita.com/charon/items/661d9a25b2233a9f8da4

```terminal
$ pip3 install  -U janome
```

```python:qiita.ipynb
from janome.tokenizer import Tokenizer
tagger = Tokenizer()

jugemu = '寿限無。寿限無。五劫の擦り切れ。海砂利水魚の。水行末雲来末風来末。食う寝る処に住む処。やぶら小路の藪柑子。パイポパイポパイポのシューリンガン。シューリンガンのグーリンダイ。グーリンダイのポンポコピーのポンポコナーの。長久命の長助'
results = tagger.tokenize(jugemu)
results
```

```python:qiita.ipynb
for result in results:
    print(result)
```

出力結果は以下のようになりました。

:::note info
寿	名詞,一般,*,*,*,*,寿,コトブキ,コトブキ
限	名詞,接尾,一般,*,*,*,限,ゲン,ゲン
無	名詞,一般,*,*,*,*,無,ム,ム
。	記号,句点,*,*,*,*,。,。,。
寿	名詞,一般,*,*,*,*,寿,コトブキ,コトブキ
限	名詞,接尾,一般,*,*,*,限,ゲン,ゲン
無	名詞,一般,*,*,*,*,無,ム,ム
。	記号,句点,*,*,*,*,。,。,。
五	名詞,数,*,*,*,*,五,ゴ,ゴ
劫	名詞,一般,*,*,*,*,劫,コウ,コー
の	助詞,格助詞,一般,*,*,*,の,ノ,ノ
擦り切れ	動詞,自立,*,*,五段・ラ行,命令ｅ,擦り切る,スリキレ,スリキレ
。	記号,句点,*,*,*,*,。,。,。
海	名詞,一般,*,*,*,*,海,ウミ,ウミ
砂利	名詞,一般,*,*,*,*,砂利,ジャリ,ジャリ
水魚	名詞,一般,*,*,*,*,水魚,スイギョ,スイギョ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
。	記号,句点,*,*,*,*,。,。,。
水	名詞,一般,*,*,*,*,水,ミズ,ミズ
行末	名詞,一般,*,*,*,*,行末,ギョウマツ,ギョーマツ
雲来	名詞,固有名詞,人名,名,*,*,雲来,ウンライ,ウンライ
末	名詞,接尾,副詞可能,*,*,*,末,マツ,マツ
風	名詞,接尾,一般,*,*,*,風,フウ,フー
来	名詞,接尾,副詞可能,*,*,*,来,ライ,ライ
末	名詞,接尾,副詞可能,*,*,*,末,マツ,マツ
。	記号,句点,*,*,*,*,。,。,。
食う	動詞,自立,*,*,五段・ワ行促音便,基本形,食う,クウ,クウ
寝る	動詞,自立,*,*,一段,基本形,寝る,ネル,ネル
処	名詞,一般,*,*,*,*,処,トコロ,トコロ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
住む	動詞,自立,*,*,五段・マ行,基本形,住む,スム,スム
処	名詞,サ変接続,*,*,*,*,処,ショ,ショ
。	記号,句点,*,*,*,*,。,。,。
やぶら	動詞,自立,*,*,五段・ラ行,未然形,やぶる,ヤブラ,ヤブラ
小路	名詞,一般,*,*,*,*,小路,コウジ,コージ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
藪	名詞,固有名詞,地域,一般,*,*,藪,ヤブ,ヤブ
柑子	名詞,一般,*,*,*,*,柑子,コウジ,コージ
。	記号,句点,*,*,*,*,。,。,。
パイポパイポパイポ	名詞,一般,*,*,*,*,パイポパイポパイポ,*,*
の	助詞,連体化,*,*,*,*,の,ノ,ノ
シューリンガン	名詞,一般,*,*,*,*,シューリンガン,*,*
。	記号,句点,*,*,*,*,。,。,。
シューリンガン	名詞,一般,*,*,*,*,シューリンガン,*,*
の	助詞,連体化,*,*,*,*,の,ノ,ノ
グーリンダイ	名詞,一般,*,*,*,*,グーリンダイ,*,*
。	記号,句点,*,*,*,*,。,。,。
グーリンダイ	名詞,一般,*,*,*,*,グーリンダイ,*,*
の	助詞,連体化,*,*,*,*,の,ノ,ノ
ポンポコピー	名詞,一般,*,*,*,*,ポンポコピー,*,*
の	助詞,連体化,*,*,*,*,の,ノ,ノ
ポンポコナー	名詞,一般,*,*,*,*,ポンポコナー,*,*
の	助詞,連体化,*,*,*,*,の,ノ,ノ
。	記号,句点,*,*,*,*,。,。,。
長久	名詞,一般,*,*,*,*,長久,チョウキュウ,チョーキュー
命	名詞,一般,*,*,*,*,命,イノチ,イノチ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
長助	名詞,固有名詞,人名,名,*,*,長助,チョウスケ,チョースケ
:::

良い感じで分解でいてますが、「寿限無」がまとまりとしてではなく、「寿」「限」「無」と一字ずつに分解されているのが良い味を出していますね。

以上でコードの説明を終えます。以下は落語についてです。

最後に立川談志さんの落語「寿限無」の音声を共有します。

https://www.youtube.com/watch?v=Mfnjo6urmsA&list=PLLymwIt4gwctanG4XHeih5jlx-DnXnEZz&t=1148s

この記事を書く過程で寿限無のオチなどのストーリーを確認するために落語家の動画を色々見ましたが、やはり談志さんの話し方は面白いですね。「寿限無は前座としての基本だから面白くない」と音声の中でおっしゃっておりますが、全然そんなことなくて、繰り返し「寿限無」のフルネームを言うたびに笑ってしまいました。

最近の僕は話の面白い人に憧れていたのですが、談志さんの話し方は、表面的な話術という感じではなく人物それ自体の面白さ・奥深さに由来してるように感じられました。落語はほとんど詳しくなかったのであまり語れませんが、wikipediaを読んでいたところ、発言録の中で、

https://ja.wikipedia.org/wiki/%E7%AB%8B%E5%B7%9D%E8%AB%87%E5%BF%97

:::note alert
落語とは、人間の業の肯定である
:::

と引用されており、イリュージョン落語の境地に到達していたという部分で、只者ではなかったのだなと伺われたのでした。

「子供に長生きしてほしい」という親の願いも「人間は必ず死ぬ」という絶対真理からすれば業であり、俺の屍を超えてゆけのエンディングロールでもありましたが、人生を要約するなら…

:::note alert
殺して、生きて、生まれて、死んで…
:::

https://youtu.be/Ctk6dx4_Eb4?t=1054

話術の向上と人間理解のためにも「湯神くんには友達がいない」の湯神くん並みに落語を聴きまくろうと思ったのでした。