『コピペで簡単実行!キテレツおもしろ自然言語処理 PythonとColaboratoryで身につく基礎の基礎』(youwht著、翔泳社発行)の書評。プログラミング言語、Pythonの解説本だが、「走れメロス」(太宰治)の感情の変化を時系列でグラフ化したり、江戸川乱歩とコナン・ドイルの作品データから“新作”小説を自動生成したり、といった文学濃度高めの内容が特徴。プログラミングによって文学作品の楽しみ方が広がる。
英語とプログラミング言語の学習に関しては、なぜか数年ごとにマイブームがやってくる。
「スコット・フィッツジェラルドの小説を英語で読みたい」「米国の映画を字幕なしで楽しみたい」とふと思う。そして「英語の勉強をやり直そう」と決意する。早速、参考書を買うのだが、しばらくするとやっぱり英語は難しいと止めてしまう。これを何度繰り返したことか。
事情はプログラミング言語についても同じだ。学生時代に勉強したFortranに始まり、Visual Basic、C言語、Perl、Java、Javascript、Rubyなどいくつも手を出してきた。しかし、どれも初級レベルにとどまり、自信を持って習得できたといえない。
そして最近のマイブームは、Pythonである。
PythonはAI(人工知能)やデータ分析、自然言語処理に関連してよく目にするプログラミング言語。AIはあらゆる領域に浸透していくので、Pythonプログラマーの求人はこれから増えるだろう。年収もあがりそうだ。
Pythonをマスターすれば「自分にも何か面白そうなことができるかも」。数年前からそう思ってきたが、本格的に学習するまでに至らなかった。
そんな時、目に止まったのが一風変わったPythonの解説書『キテレツおもしろ自然言語処理 PythonとColaboratoryで身につく基礎の基礎』。内容紹介には「走れメロス」、江戸川乱歩、コナン・ドイル、「三国志」といった言葉が出てくる。これだけ文学色の強いプログラミング言語の解説書は見たことがない。面白そうだ。
早速購入し、サンプルプログラムをコピーして実行してみた。コードを気軽に書き換えては、実行し結果を確認できるのがスクリプト言語の良いところ。
ここでは、私が興味を持った本書の第3、4章の内容を紹介したい。
太宰治「走れメロス」をプログラムで分析
本書の第3章では、太宰治の短編小説「走れメロス」の感情の起伏をプログラムで分析する。
以下は「走れメロス」の有名な書き出しだ。
メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。
太宰治「走れメロス」
メロスは、自分の代わりに捕らわれた親友のセリヌンティウスとの約束を守るため、川の氾濫や山賊の襲撃などの困難に遭遇しながらも3日間走り通す。そして最後、二人の友情を見た王は改心し、見守っていた群衆が歓声を上げる。物語の大きな流れは、怒りから歓喜へと物語の感情が変化する。ではプログラムで実際どのように分析するのか。
本書では、まず青空文庫から取得した同小説のテキストデータを形態素解析し、単語に分解する。さらに日本語評価極性辞書を使って、各単語が表現する感情を、ネガティブ、ポジティブ、ニュートラルの3つに分類。それぞれの個数をカウントし、時系列でグラフ化する。
形態素解析は、文を品詞に分解し、それぞれの読みや活用などを割り出すこと。「Janome」や「Mecab」といった形態素解析用のライブラリを使用することで、小説全体をほんの一瞬で解析できる。これによって、小説テキストを統計的に処理して、冒頭に示された怒りを含むネガティブな感情からどう変化し、最後のポジティブな感情が高まっているかを視覚化できる。下の画像がプログラムの実行結果。
縦軸は全単語数に対するポジティブ語の割合、横軸は登場した単語の累計数。青線は一文に含まれるネガティブ語の比率、赤線は一文に含まれるポジティブ語の比率をそれぞれ示す。
小説の前半に比較的多かったネガティブ語(青線)が中盤から後半にかけて減少し、代わりにポジティブ語(赤線)が次第に増えている。「走れメロス」の感情の起伏は使われる単語の数に表れていることになる。
こんな風に小説の内容を数値化、グラフ化して把握する方法は新鮮だ。太宰治の全作品についてこの方法で分析すれば、時代ごとにポジティブ、ネガティブの傾向が分かるのかもしれない。
本書では、宮沢賢治「注文の多い料理店」、芥川龍之介「蜘蛛の糸」についても同様の感情分析プログラムを掲載している。
テキストデータからマルコフ連鎖により小説を生成
第4章では、江戸川乱歩の小説とコナン・ドイルの小説のデータからをプログラムによって、新しい小説を自動生成するプログラムが紹介される。
具体的には、青空文庫の小説データを形態素解析し、使われている単語の一覧リストを作成。それらの単語をマルコフ連鎖を用いて文章の形につなげる。マルコフ連鎖については正直なところはっきりとは理解していないので、説明が難しい。文を構成する単語のつながりを確率によって決定する手法だとイメージ的に理解している。
原理は理解していなくても、マルコフ連鎖用のライブラリがやはり用意されており、これをプログラムから呼び出せば簡単に実現できる。ただ本書では、読者が仕組みを理解できるように著者が自作している。
マルコフ連鎖で実際に作られた文は、残念ながら人間が書く通常の文とは異なり、ところどころ意味が通るものの全体として読むと支離滅裂な印象。以下は、コナン・ドイルのテキストを使い、プログラムを実行して自動生成した文の一例だ。
「お隣さんって云うのは、壁際の机にある蝋燭です。どうぞ座ったまま、しばらくじっとして心ここにあらず、ジェファースン・ホープは不十分な食料と水を持ち、部屋中に痕跡が残してあるため、この事件に対して、あらゆる智慧を絞って考えているよりもロンドンにいた。いま彼の推理力と並はずれた行動力をこれまでの生活は平穏で、罪を犯したことも否定はしなかったとすれば、シムソンに有利な材料が一つだけなくなるわけだ」
コナン・ドイルのテキストを使いマルコフ連鎖によって生成した文
下は、江戸川乱歩とコナン・ドイルのテキストを一つのファイルにまとめ、そこからプログラムによって生成した文の例。生成した20の文のうち江戸川乱歩色の濃いものを選んだ。他にはコナン・ドイル色の濃いものもあった。
馬車は速かった。あんなにあこがれていたやつが、どこの誰とも知れぬほどではありません。秘密にしたいのは、一つは新聞が破れているでしょう。又、春川月子の肩先は、雨戸の隙間から、ドアが乱暴に引きあけられ、家庭教師の殿村京子などは、闇にまぎれて、逃げさったのです。刑事は首肯いて、暗黙のうちに、鉄の腕が出て来るだろう。それが引潮と共に、魔の淵の洞穴だってそうだが、すると、「アッ。」といったまま、息も切れ切れに言う。
江戸川乱歩とコナン・ドイルのテキストを使いマルコフ連鎖によって生成した文
どちらの文も真面目に読もうとすると、頭が割れそうになる。しかし、人間が書こうと思ってもなかなかこうは書けないという壊れっぷりがかえってシュールで面白い。詩のような飛躍を含む文を書く場合のヒントになるかもしれない。
第3、4章に掲載されたサンプルプログラムをColaboratory上で実際に動かしてみた。正直に言えば、3章のプログラムはすんなり動いて、結果を出力できたが、4章のプログラムは、期待どおりに動作しなかった。青空文庫のzipファイルを取得&加工するところが上手くいかなかった。原因を探したのだが、解決できず、結局、パソコンに開発環境のAnaconda3をインストールして、実行することにした。
その結果、いくつかエラーが出たものの、最終的には成功し、上記の文を生成できた。エラーの原因を調べる際、ネットに誰かが掲載している情報が役に立った。自分と同じ問題をきっと誰かが経験し、すでに解決している。ありがたいことに、そうした情報を公開してくれるプログラマーが多い。これを使わない手はない。
この本は、Pythonの文法・記法について体系的に書かれているわけではない。プログラミングそのものに慣れていない人は、下のような入門書に目を通し、手元に置いておいた方がよいと思う。
『人間失格』から短歌を抽出
プログラミング言語を学習する際、外国語と同様、それによって何をしたいかを明確にしておくことが大切だ。目的がないと学習のための学習になってしまい、モチベーションが続かない。この本で学んだことを応用して、自分が興味を持っている短歌に関するプログラムを作成してみた。太宰治の『人間失格』のテキストデータを形態素解析し、短歌の57577の31音の形になっている文を抜き出すというもの。
本書の内容とこちらに書かれたソースコードを参考にあれこれ改良を加えた。その結果、100以上の短歌が抽出された。以下はその一部。
そのまま幅飛びのように前方へ飛んでしまって砂地にドスン
売払うつもりらしいという事を別荘番の老爺から聞き
意志も無い様子でそれに故郷に一棟隠居所など建て
運動で走り廻ったおかげ? または、女の? または、酒? けれども
明さないほうが便宜な事もあるような気がふっとしたものです
あまりの侘びしさにペンが動かなくなりうつむいて涙をこぼし
一枚の節約を千万人が行うならばどれだけのパルプ
談ずるに足らん喜劇に一個でも悲劇名詞をさしはさんでいる
善には悪、罪と祈り、罪と悔い、罪と告白、罪と……嗚呼みんな
罪と罰、絶対に相通ぜざるもの、氷炭相容れざるもの
薬屋の奥さんにそう言われると自分はもう可成りの中毒
『人間失格』より抜き出した「無意識短歌」
『人間失格』を読んだ人なら、これらの短歌を見て、小説の内容を思い出すのではないか。短歌の定型には不思議と強い喚起力がある。
このような偶然、あるいは無意識のうちに書かれた短歌のことを「偶然短歌」あるいは「無意識短歌」と呼ぶらしい。上の短歌は小説の文脈を無視して切り出しているので意味不明なものがあるし、字余りや句またがりもあって整っているとは言い難い。でも、どこか突拍子もない短歌になっていて新鮮な印象だし、『人間失格』に違った角度から光を当てるような気がして興味深い。
普通に小説として読んでいるときには素通りしてしまうが、プログラムの「目」によって抜き出すことで、そこに意外に多くの短歌が潜んでいたことが分かる。
『人間失格』の小説としての内容については、詳しいあらすじと人物相関図入りで以下に解説した。
開発環境「Colaboratory」とソースコード
ちなみに本書の副題にある「Colaboratory」とはGoogleが無償提供しているPythonの実行・開発環境のこと。プログラムを書いて、実行し、結果を確認する一連の作業がブラウザ上で完結する。
プログラミング言語によっては、パソコンに開発環境を構築するのも一苦労。なんとかインストールしたと思って、プログラムを実行してみるとエラーが出て結局上手くいかないこともある。そうした意味で、パソコンに新たにソフトをインストールする必要がないColaboratoryはとても便利だ。書籍に掲載されたソースコードはすべて公開されていて、Colaboratoryに取り込んで実行できる。
コメント