読者です 読者をやめる 読者になる 読者になる

鴨川にあこがれる日々

軽い技術っぽい記事かいてます

青空文庫から会話の連鎖を取り出す

Ruby

前置き

別に大したことは書いておりません.
ただのRubyスクリプトです.

はじめに

機械学習とかディープラーニングとか人工知能といった単語が最近バズってます.

最近ですとこれでしょうか.headlines.yahoo.co.jp

今年からこのあたりを研究し始めました*1ので,そこまで詳しくありませんが,
歴史的にみると↑の記事は人工無能と呼ばれるものです.
人工無脳 - Wikipedia

英語でよければemacsにも入ってます.

f:id:another16javac:20150703014719p:plain
emacsを開いてM-x doctor RETで対話できます.

人工知能の研究するなら簡単な人工無能でもつくろうかなぁという気分になったので,その下準備をするためにタイトルのようなことを行いました.

会話が既にあるならそれ使っていいのでは?というスタンスです.*2

本題

今回用いる会話というのが青空文庫の会話です.

夢野久作の「犬のいたずら」というお話を例に挙げて説明します.
夢野久作 犬のいたずら

 去年の十二月の三十一日の真夜中の事でした。一匹の猪と一匹の犬がある都の寒い寒い風の吹く四辻でヒョッコリと出会いました。
「ヤア犬さん、もう帰るのかね」
「ヤア猪さん、もう来たのかね」
 と二人は握手しました。

「」で囲まれた部分を発言とします.
「」が連続した場合,それを発言の連鎖とし,

ヤア犬さん、もう帰るのかね	ヤア猪さん、もう来たのかね

のようなTab区切りでの抽出を目的とします.

手順は
1. 対象のファイルをローカルに保存
2. ルビ削除
3. 発言の抽出

1. ローカルに保存

青空文庫のデータはXHTMLで公開されているので,wgetcurlでも使ってローカルに保存します.
文字コードSHIFT_JISなのを注意してください.

$wget http://www.aozora.gr.jp/cards/000096/files/46689_27677.html

2と3

require 'nokogiri'

fname = '46689_27677.html'
f = File.open(fname)
html = Nokogiri::HTML(f)
content = ''
html.search("body .main_text").children.each do |node|
  node_name = node.node_name
    if node_name == 'text'
      content += node.text
    elsif node_name == 'ruby'
      content +=  node.children[0].text
    end
end
puts content.gsub("\n","\t").gsub(/\n{2,}/, "").scan(/.+?/)

gemのNokogiriが必要です.
Nokogiriで処理すると青空文庫のルビは,node_nameがrubyというElementで表現されています.
この子要素の先頭が該当する漢字です.

発言の連鎖は,文字列で表現すると"」\n「"を満たすので,これをTabに置換するだけです.

実行結果

「ヤア犬さん、もう帰るのかね	ヤア猪さん、もう来たのかね」
「もうじき来年になるのだが、それまでにはまだ時間があるから、そこらでお別れに御馳走を食べようじゃないか	それはいいね」
「時に犬さん、お前の持っているその大きな荷物は何だね」
「これは犬の年の子供がした、いい事と悪い事を集めたものさ	ヘー。善い事悪い事ってどんな事だね	それはいろいろあるよ。他人の草履を隠したり、拾い食いをしたり、盗み食いをしたり、垣根を破って出入りしたり、猫をいじめたり、お母さんや姉さんに食いついたり	ヘエ、そんな事をするかね	するとも。それから良い方では、人のものを探してやったり、落ちたものをひろってやったり、小さい子をお守してやったり、人の命を助けたり	ヘエー、それはえらいね。しかしそんなものを集めて持って行ってどうするのかね	今に十二年目になると僕が帰って来る。その時には犬の年の子供は最早二十五になっている。男の児は最早兵隊に行って帰って来ているし、女の児ならばお嫁さんに行く年頃だから、その時に良い事をした児には良い事をしてやり、悪い事をした子には何か非道い罰を当ててやろうと思うんだ	フーン」


以上です.
なんか面白いものができたらまた書こうと思います.

*1:入学当初は図書館情報学がやりたいとかなんとかいっていたのにあれおかしいな

*2:もちろん私が調べてないだけで,すでにいくつもあると思います