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

Just $ A sandbox

プログラミングと計算機科学とかわいさ

1.pythonで対話型AI制作[マルコフ連鎖]

マルコフ連鎖とは

今回から実際にAIを作っていきますが、最初はまずマルコフ連鎖というアルゴリズムでプログラムを書きます。
マルコフ連鎖は数学的なモデルも確立しているとても有名な過程なので詳しくは調べていただければ良いかと思います。

ざっくばらんにイメージを掴んでいただくとすると、以下のような例を考えましょう。
このような文章があるとします。

「今日の天気は晴れです。明日は雨かもしれません。」

これをn文字ずつの組み*1にします。今はn=2としましょう。すると、

今日/の天/気は/晴れ/です/。明/日は/雨か/もし/れま/せん/。
今/日の/天気/は晴/れで/す。/明日/は雨/かも/しれ/ませ/ん。

のようになります*2。ここから文章を作りましょう。
まずは好きなものを上から選びます。ここでは「明日」を選んだものとすると、

明日→日は→は晴→晴れ→れで→です→す。
     →は雨→雨か→かも→もし→しれ→れま→ませ→せん→ん。
  →日の→の天→天気→気は→は晴→晴れ→れで→です→す。
              →は雨→雨か→かも→もし→しれ→れま→ませ→せん→ん。

のようにして、「明日は晴れです。」「明日は雨かもしれません。」「明日の天気は晴れです。」「明日の天気は雨かもしれません。」の4つの文章が出来上がります。これをそのままプログラムにしてみたものが以下です。

ソース

ソースは以下にあります。ご覧ください。
AI2.py/github

実行例

# 「吾輩は猫である」をサンプルに使ったログ

アリーチェ:いらっしゃいませ〜。メッセージをどうぞ〜
あなた:こんにちは
アリーチェ:こんな片輪《からである。
「追ってそうしている。身内《みうち》の上、夜は炬燵《こたつ》な種族であった容子《よう始末でもう一幅の大活画《けもの》ありと池を左《ひど》い目に逢ったのがおさんの隙《すき乱暴猫であると奴め最後《いびき》をしいと思ったが親子の愛を
あなた:ちょっとましになりましたか?
アリーチェ:ちゃばたけ》ばらばらと二三つで夜になる体格を有している人が来たのかと思うと思案を定《さりと音がしてえどこに住んじて受けるが悪くなる。到底《とうてい無学であるかにいくらアンドレア・デルトがそんな事やらいくら考え付いた。ニャーニャー泣き出すのであながち主人
あなた:主人?
アリーチェ:主人の傍《そば》にいる事を二三遍なで廻り始めた。どうも非常に苦しい。そこを飲み込んだかなら》ず眼を執《と》っている奴だ。吾輩は嘆賞の念もなく眺《なお感ずるごと思ったが何して見た。
「何、猫だ? 吾輩がこの家のものは大変な勉強家だと戦ってこれを左《ひだ》

お分かりの通り、ほとんど意味のある文章はできません。これは、「単語の連鎖」を上手く選択できていないことによります。
しかし一応対話はしていますね!(してない)

以後、いかにこの単語の連鎖を上手く、つまり文法も意味も的確なものを選ばせるかということが問題になってきます。
では次回はもう少しだけ発展させて「形態素解析」ができるようにします。

*1:普通これをn-gramのリストと呼びます

*2:今の場合、2文目の最初の「今」という単語は無視するのが良いと思います