人工文豪(マルコフ連鎖)の遊び方
教材のコピー
実習用教材をコピーするには,ターミナルエミュレータを開いて以下のコマンドをタイプする。
cp -rp ~asakawa/Markov_Chain .
すると自分のホームディレクトリ(ホームホルダ)に Markov_Chain というサブディレクトリ(ホルダ)ができている。
教材の中身
コピーしてきたディレクトリには,以下のような拡張子を持つファイルが含まれている
- 実行ファイル: 実行ファイルはデータベース作成用コマンド (make-など) と,文字単語系列から文章を作成するための生成コマンドとがある。 Markov- で始まるファイルとがある。
- Makefile:
データを作成したり,表示したりするための必要なコマンド群が記述されている。 - 原文テキストファイル: 青空文庫などからダウンロードしてきたファイル。 拡張子は zipである。圧縮されているので,解凍するには unzipというコマンドが必要である。 unzip コマンドで解凍すると .txtというファイル名が取り出される。
- データファイル: .pag という拡張子と .dir という拡張子のついたファイルである。
実習用にコピーしてきたディレクトリには以下のファイルが収められている。
作品 | 原著者 | ファイル名 | 個数 |
---|---|---|---|
ある阿呆の一生 | 芥川龍之介 | Akuta_Aru | 9 |
不思議の国のアリス | ルイス・キャロル | Alice | 16 |
堕落論 | 坂口安吾 | Ango_Daraku | 9 |
人間失格 | 太宰治 | Dazai_Ningen | 9 |
インターネットの歴史 | ? | Hist_Inet | 8 |
ゲティスバーグ演説 | エイブラハム・リンカーン | Lincoln | 15 |
銀河鉄道の夜 | 宮沢賢治 | Miyazawa_Ginga | 9 |
坊ちゃん | 夏目漱石 | Natsume_Bocchan | 9 |
こころ | 夏目漱石 | Natsume_Kokoro | 9 |
データ検証用データ | 不明 | quick_silver_fox | 15 |
このうち,文芸作品については青空文庫 http://www.aozora.gr.jp/ からダウロードした。
まずは動作確認
Markov_Chainというディレクトリに移動して, make コマンドを実行すると デモが観られるようになっている。
cd ./Markov_Chain make
一通り実行するまで
青空文庫からダウンロードしたファイルを元に人工文豪を実行する手順を解説する。
- 青空文庫からファイルをダウンロードする
- ダウンロードしてきたファイルを解凍する
- ファイルの文字コードを EUC に変換する
- データーベースを作成する
- シミュレーションをして遊ぶ
大まかに言うと以上のような操作をすればよい。以下でそれぞれの操作の例を示す。
青空文庫からダウンロードする
青空文庫から圧縮されたデータをダウンロードするか,xhtmlファイルを画面上 からコピーアンドペーストするかいずれかの方法で持ってくる。

以下ではダウンロードしてくる方法を解説する。 例えば,小泉八雲の「耳なし法一」を人工文豪で処理させるには
- xhtml ファイルを表示させて,ブラウザの画面からコピーし, エディタ(テキストエディットなど)で加工する
- zip ファイルをダウンロードする
という2通りがある。すなわち,小泉八雲の作品のうち「耳なし法一」を選んだところは 以下の画面のようになる。

ここでファイルのダウンロードを選択すれば zip ファイルが得られる。

ファイルの解凍
その後,以下のコマンドをタイプして圧縮ファイル 42927_ruby_15422.zip から テキストファイル miminashi_hoichi.txt を取り出す。
mv ~/Downloads/42927_ruby_15422.zip . unzip 42927_ruby_15422.zip Archive: 42927_ruby_15422.zip inflating: miminashi_hoichi.txt
形態素解析と文字コードの変換
解凍したテキストファイルを形態素解析ソフトによって単語の分かち書きファイルを作る。
nkf --Lu -euc miminashi_hoichi.txt|kakasi -w > Mimi.txt
形態素解析については,kakasi を使った。 ここからは地道な手作業になるが,テキストエディットで読み込んで不要な部分をカットする。

以上の操作で,ダウンロード,解凍,形態素解析,及び文字コードの変更が終わったことになる。
人工文豪用にデータベースを作成する
続いて人工文豪用のデータベースを作成する。
./make-3s -d Mimi3w Mimi.txt
このコマンドによって Mimi3w.pag, Mimi3w.dir という二つのデータベースができあがる。
シミュレーションの実行
データベースの作成まで完了してれば,後はシミュレーションを実行するだけである。
./Markov-3s -d Mimi3w
Markov-3sというファイルが人工文豪の実体である。 引数(ひきすう)として -d Mimi3w を指定しているが -d オプションはデータベース名の指定である。 この場合 Mimi3w.pag と Mimi3w.dirというファイルの指定である。 ただしファイルの拡張子は除いて指定する。
サンプル出力例を以下に示す。
./Markov-3s -d Mimi3w | --utf8 ### Seed: 1259732991 に し て 咳 も せか ず 、 助け を 呼ん だ ところ で 助かる わけ の もの ! 痛 さ は 非常 で あっ た 。 いまだ かつて 人 の 「 大した 高い 身分 の 方 へ 通っ て 行き ―― 庭 に 下り ―― 道路 の 方 から 跫音 の やって来る の が 、 誰 れ も 芳一 の この 驚く べき 技 倆 に ひどく 感心 し て しまっ た 。 しかし その 海岸 一帯 に は 入水 さ れ た くらい で あっ た 。 しかし その 海岸 一帯 に は 入水 さ れ て い た ! もっと 前 に お前 を 引き込ん だ の だ ! … … 道理 で 返事 を し ない はず だ 、 何故 か と いう に 、 また 水泳 する 人 を たえず 待ち受け て い なさい 。 すると 迎え が 来る 。 その 女 は こう 云っ た ―― ますます 烈しく 壇ノ浦 の 合戦 の 曲 を 誦し た 。 しかし その 海岸 一帯 に は 入水 さ れ 、 それから 女 の 声 を 張り上げ 、 烈しい 海戦 の 歌 を うたっ た ―― が 、 誰 れ に も 御 話し に
オプションスイッチ
人工文豪では,-d, -h, -n, -s の 4 つのスイッチが用意されている。
オプション | 意味 |
---|---|
-d | データベース名の指定 |
-h | 簡単な使い方のヘルプを表示する |
-n | 何語出力するかをしている(デフォルトでは200単語) |
-s | 乱数の種を指定する |
乱数の種は,指定してなければ現在の時刻で初期化している。
他のマルコフ連鎖モデルとの比較
上の例では,3--gram の(すなわち3次の相関の)共起頻度を用いている。 1--gram, 2--gram, 及び 4--gram の操作も可能である。 詳しくは Makefile を参照して欲しいが,1--gram のデータベースは ./make-1w, ./make-1c で作ることができる。 ./make-2w, ./make-2c で 2 次の共起頻度 を調べることができる。./make-4th で 4 次の共起頻度のデータベースを作ることができる。
それらを使って実際に文章を算出させるプログラムが,それぞれ
- Markov-1w
- Markov-2w
- Markov-4w
である。すなわち make-1wで作ったデータベースはMarkov-1w でデータを表示することができる。make-2wで作ったデータはMarkov-2w で表示する。また,単語単位の n-gram を行うのが -wであり,文字単位の n-gram を表示するのが-cである。-cのついたプログラムは 英語の文章しか処理できない。
show
実際にどのような共起頻度かを調べるコマンドがshow-である。 例えば,2次の単語ベース n-gram を見たければshow-2wを用いれば良い。 たとえば次のようにである。
./show-2w -d Dazai_Ningen2w | nkf --utf8 | lv -Ou8
この出力例を以下に示す。
total = 47993 (は,、)= 725 (た,。)= 591 (て,、)= 406 (まし,た)= 365 (、,自分)= 363 (でし,た)= 313 (自分,は)= 290 (が,、)= 279 (し,て)= 278 (。, )= 268
全部で47993個の 2-gram があり,そのうち最大のものは「は」と「、」との組み合わせであり, その725回あったという意味である。2番目に多かった組み合わせは「た」と「。」であった。