ここ最近は人工無脳(Bot)作りに凝っているのですが、もう一歩踏み込んで人の会話を模してランダムに言葉を生成してみたくなりました。

そんな時に既存のものを調べると必ずと言って良い程「形態素解析」「マルコフ連鎖」という単語が現れます。

既存の文章を元に単語を分割して再構成する自然言語の処理技術だということですが、難しい単語や数式が多く簡単には理解しづらく感じていました。

今回は簡易的に行えるプログラムを利用して文章の再構成が出来るか試してみることにします。お題はこんな感じの3つの文章。

  • 私の名前はポンダッドです。
  • 私は双子のパパです。
  • ポンダッドは双子が大好きです。

この文章を再構成して以下の様な文章が生成出来れば成功とします。

  • 私は双子が大好きです。

さてどうなるとこやら。

TinySegmenter

日本語特有の構造により、文章を解析するのはとても大変な作業です。解析の前に「形態素」と呼ばれる言葉の最小単位に分割するところからはじまります。

mecabと呼ばれる形態素解析エンジンが広く利用されている様ですが(なんでもiPhoneのキーボード日本語変換もこの技術が使われているそうです)今回はもう少し簡易的に利用できるプログラムTinySegmenterを利用させてもらうことにしました。

TinySegmenter:Javascriptだけで書かれたコンパクトな分かち書きソフトウェア

TinySegmenterはJavascriptだけ書かれた極めてコンパクトな日本語分かち書きソフトウェアです。 わずか25kバイトのソースコードで、日本語の新聞記事であれば文字単位で95%程度の精度で分かち書きが行えます。

ダウンロードページを見て驚きましたが、わずか170行あまりのJavaScriptプログラムでした。本当にこれで正確に言葉を分割することが出来るのでしょうか…。

やってみる

まずはドキュメントに沿ってTinySegmenterを読み込み、実行してみます。node.jsを利用して以下の様なファイル構成にしました。

1
2
3
4
├ lib
│ ├ sample.txt
│ └ tiny_segmenter.js
└ ─ app.js

lib/sample.txt

1
2
3
私の名前はポンダッドです。
私は双子のパパです。
ポンダッドは双子が大好きです。

app.js

1
2
3
4
var segmenter = require('./lib/tiny_segmenter.js');
var data = require('fs').readFileSync('./lib/sample.txt', 'utf-8');
var segs = segmenter.segment(data);
console.log(segs.join(" | "));

アプリケーションを実行してみます。

1
2
3
4
$ node app.js
私 | の | 名前 | は | ポンダッド | です | 。
| 私 | は | 双子 | の | パパ | です | 。
| ポンダッド | は | 双子 | が | 大好き | です | 。

おおっ。確かに「分かち書き」がされています。私のハンドルネーム「ポンダッド」も分割されることなく1つの(簡易)形態素と判定されました。

まとめ

機械学習の中身は正直難しすぎて分からなかったのですが、理解出来たのは2点。辞書を使わずに分かち書きを行う事が出来るという事。主語述語がはっきりした文章の学習・分類が得意だという事です。

ここら辺はあまり深入りしてもしょうがないので、次回は簡易的に分割した形態素を組み合わせて文章が生成出来るか挑戦してみます。

(続く)