orangeProse別館

orangeProse(本ブログ)の補助

青空文庫にある作品の文字数をカウントしてTSVファイルに書き出すスクリプトを書いたよ

Snowy Withered Bough by Hideo Saito on 500px.com

tl; dr

青空文庫を作者名で検索し、作品名と文字数をTSVファイルに書き出すRubyスクリプト

GemはMechanizeのみ使用(依存するGemも含めてローカルインストール)。

エラー処理や例外処理はアドホックに付け加えただけ。もちろん全作家についてテストしたりしていない。

目的

先日お知らせしたように、エフエムモットコムでふくしま現代朗読会の朗読番組がはじまった。

  • 金曜08時15分~28分
  • 再放送が火曜17時45分~

ListenRadio(リスラジ)

13分の番組で、じっさいに朗読する時間は12分弱。問題は、この長さに合致する作品選びである。だいたい文庫本で5~6頁がリミットの長さになってくるかと思う(いまのところ、1回の放送で1作品でやっているけれども、いずれ、長編・中編を分割して読むこともある)。

そんなわけで、いまのところ、読みたい作品だから読むというより、長さ制限から作品を選び出す、というかたちで、しばらくはやっていくだろう。

というわけで、青空文庫にある、権利が切れてパブリック・ドメイン入りした作品の文字数を出力するプログラムを書いた。

青空文庫のサイト構成はかなり古典的で(fontタグやcenterタグがある)、クラス属性がついていなかったり、あるいは作品ページごとに構造が違っていたりして、スクレイピングするにも厄介ではあるのだけど、JavaScriptが使われていないし暗号化もされていないので、エラーが生じたらその都度原因を調べながらスクリプトを修正すればよいという気軽さはある。

bodyタグ以下に表示されるすべての文字(ルビや奥付も含める)をカウントしているので、厳密な「作品の文字数」ではない。あくまでも「目安」として使う。この文章を書いている時点で、放送では宮沢賢治「やまなし」と夢野久作「虫の生命」が読まれた。「やまなし」が(新字新仮名で)3451字、「虫の生命」が3385字で、だいたいこのあたりが「無難なライン」になってくるだろう。

ちなみに、小耳に挟んだ噂では、今後、太宰治「列車」と芥川龍之介「蜘蛛の糸」が読まれる。「列車」が新字新仮名で3702字、「蜘蛛の糸」が3679字。前述のラインと、長さとしては合致する。

と、ここまで書いたところで、あれっと思った。ぼくが読もうかなと思っている江戸川乱歩のある作品は、4602字ある。無難なラインより1000字程度多い。以前タイマーで計って読んだときは9分ぐらいだったので、これを12分弱に伸ばす練習をしなければなあ、と思っていたのだが。いま、あわてて改めて録音してみたら、15分弱になった。おかしいなあ。まあ、いいや。

このプログラムは、TSVファイルを書き出すので、LibreOfficeのCalcなどで開いて、文字数カラムでソートするなどして使う。

出力例:

f:id:hidex7777:20170119170545p:plain f:id:hidex7777:20170119170555p:plain f:id:hidex7777:20170119170603p:plain f:id:hidex7777:20170119170937p:plain

使い方

筆者環境:Windows 7(64bit)、Git for Windows2.11.0、Ruby 2.3.3

前提:Rubyがインストールしてある。必須Gemはbundler。

GitHubからclone(Gitがインストールしてあれば):

MechanizeがGemfileに書いてあるので、パスを指定してインストール:

$ cd aozorabunko
$ bundle install --path vendor/bundle

検索したい作者名と、イニシャルが何行か(江戸川乱歩なら「あ」)を指定する:

##芥川龍之介は「芥川竜之介」でなければヒットしない。
keyword = "夢野久作"
#「江戸川」のときは「あ」行。
initial = ""

実行する:

$ ruby aozora.rb

エラーが起きたり、TSVファイルが出力されなければ、青空文庫をブラウザで開いて何が原因か調べて、直す(笑)。コメント欄で教えていただければ幸いです。

デフォルトでは/aozorabunko/outputに出力されます。

そんじゃーね。