古い記事
ランダムジャンプ
新しい記事
青空文庫のテキストデータを一括でダウンロードする方法について。
GitHub にサイトのデータなど一式入っているのでそこからゲットするだけ。

青空文庫とGitHub


青空文庫のサイトから wget でまとめてダウンロードしてもいいんだけど、運用サーバに負荷かけるのはさけたいので、github から取れるのはありがたいです。


ディレクトリ "cards/" の下にテキストデータあり。
青空文庫のサイトの構成と同じですね。

ダウンロード


ということで、ディレクトリを指定してのダウンロード。
(参考:GitHubから特定のディレクトリだけを直接ダウンロード
% svn export https://github.com/aozorabunko/aozorabunko/trunk/cards
...
% du -hs cards
2.3G cards

【おまけ】青空文庫でランダム文生成


定番タスクで実験。
何かテキストから学習して自動文章生成(ランダム文生成)を行ってみる。

(1) 対象データ

ターゲットとして、夏目漱石の「吾輩は猫である」。
  • XHTML: cards/000148/files/789_14547.html
  • ZIP: cards/000148/files/789_ruby_5639.zip

789_ruby_5639.zip を unzip して wagahaiwa_nekodearu.txt を取り出す

% nkf -w wagahaiwa_nekodearu.txt| tail -n +25 | head -2
 吾輩《わがはい》は猫である。名前はまだ無い。
 どこで生れたかとんと見当《けんとう》がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩は[...]

(2) クリーニング

テキスト中の注記など削除して、1行1文に変換する。

変換スクリプト: text2sentences.pl
#!/usr/bin/env perl
# -*- coding: utf-8 -*-
use strict;
use warnings;
use utf8;
use open ":utf8";
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";

my $cnt = 0;
while (<>) {
    last if /^底本/;
    if (/^----/) {$cnt++; next}
    if ($cnt < 2) {next}
    chomp;
    s/\x0d$//;
    s/|//g;
    while (s/《[^《]*?》|[#[^[]*?]|〔[^〔]*?〕//g) {}
    s/^ //;
    next if /^\s*$/;
    s/(。)/$1\n/g;
    s/(」)(「)/$1\n$2/g;
    print join("\n", grep {not /^\s*$/} split(/\n/))."\n";
}

実行結果:
% nkf -w wagahaiwa_nekodearu.txt| ./text2sentences.pl > wu-u8.txt
% head -5 wu-u8.txt
一
吾輩は猫である。
名前はまだ無い。
どこで生れたかとんと見当がつかぬ。
何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。

(3) 形態素解析

形態素解析器にかける。
MeCab を使用。
さくらの500円サーバに最初から入っている(ただし EUC-JP)。
今回は品詞情報は使わないので、分かち書きモードで("-O wakati")。

実行結果:
% nkf -e wn-u8.txt | mecab -O wakati | nkf -w > wn-mor.txt
% head wn-mor.txt
一 
吾輩 は 猫 で ある 。 
名前 は まだ 無い 。 
どこ で 生れ た か とんと 見当 が つか ぬ 。 
何 でも 薄暗い じめじめ し た 所 で ニャーニャー 泣い て いた事 だけ は 記憶 し て いる 。 

(4) ランダム文生成

形態素解析結果を使ってランダムな文章生成。
10年前に書いた記事をベースにスクリプト作成。
(参考:RSS を読み込んでランダムな文章を生成する[2008-09-07-3])

文生成スクリプト: gen.pl
#!/usr/bin/env perl
# -*- coding: utf-8 -*-
use strict;
use warnings;
use utf8;
use open ":utf8";
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";

my %next_words;
while (<>) {
    chomp;
    my $pre = "";
    foreach my $w (split(/ /)) {
        next if ($pre eq "" and $w eq "");
        push @{$next_words{$pre}}, $w;
        $pre = $w;
    }
    push @{$next_words{$pre}}, "";
}

my @words;
my $cur = "";
for (my $i = 0; $i < 200; $i++) {
    my $tmp = $next_words{$cur};
    $cur = $tmp->[rand(@$tmp)];
    last if $cur eq "" and $i > 100;
    push @words, $cur;
}

print join("", @words), "\n";

実行:
% ./gen.pl wn-mor.txt

結果をいくつか:
「もう笑って」「君及びません。あなたがね、あまりふくれてからおいてしまうです。彼のをしようじゃありましょう。「この人をとったろうと座敷へでギャーと寒月君は迷惑の野原なりを賞めえ大分見聞し得る限りの材料払底な路次から、来客で、二十年くらいでも仕方が張るの癇癪が出来ない。もろ肌を客人は宇宙の境に相違ない。
「危きに招魂社へへとったって——吾輩は礼に賄賂でもよかろう。権利とへ流れ流れた時はそんなに野暮の刑にやってるじゃあるから、聞いてはなぜ、しまいに——取れそうであるまいと存候間板へ出掛けた」主人は、解して智謀を引き据えて、御前が気の毒であるではベースボール即ちピラミッドのが逆施すで自己のいいのにと云うと云う人の水のようによらず内心少々提灯玉え付けても御座候
「懸かりません。「大和魂の広い学校のだと心がね」即ち攻城的の根本的智識も譲らない、実業家の青年だけ御手数がねえ叔母さん」天下に剥げかかった事はなら何も出せないと忠告しても同じ材料が妙答は吾輩のが、朝鮮にさ。「右の禿のせいだね。彼等は華族様ね」一番仕舞に渡す。「面白いもの」

それっぽい文章が生成されています。
もちろん意味不明ですが。