Just $ A sandbox

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

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

マルコフ連鎖とは

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

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

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

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

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

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

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

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

ソース

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

実行例

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

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

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

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

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

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

0.pythonで対話型AI制作

昔作っていたpythonによる対話型AI*1が出てきたこともあり、せっかくなのでここにまとめることにしました。
ソースコードは私のgithubからダウンロード可能です(https://github.com/myuon/AI)。
ほしい方は右の真ん中より少し上にあるDownloadボタンからお持ち帰りください。

AIには何が不必要なのか

対話型AIには何が必要でしょうか。
もちろん対話ができないと話になりません。また、会話を続けるためにこちらの言葉を覚えてほしいですね。何か訊いたら反応が返ってきてほしいとも考えます。正しい文章を出力できたかどうかを評価できるだけの賢さも備えてくれていると嬉しいですね。

等々、ほしい機能はいくらでも出てくると思います。しかしいきなりこのような機能をたくさん持ったものを作るのは非常に大変です。

なので逆転の発想として、ここでは何が不必要かを考えましょう。不必要なもの、AIにとって本質的ではない機能はばっさり切り捨ててあきらめることにしましょう。
そもそも私はAIを作ることによって、「AIはどんなふうに言葉を学んでいくのか?」「単純な学習機能はどこまで効果的か」ということに主眼を置いて開発していたので、この際「ちゃんとしゃべれる*2」は諦めて、必要最小限の機能で最大限賢くなることを目指すという目標を定めて作ることにしました。

というわけでこのようにしてどんどんAIを発展させていきたいと思います。

テンプレート

AIで使うpythonのプログラムのテンプレートは以下の通りです。以下は「ふ〜ん、それで?」をひたすら繰り返す(生意気な)プログラムです。

#! /usr/bin/python
#-*- coding:utf-8 -*-
print "アリーチェ:いらっしゃいませ〜。メッセージをどうぞ〜"

s = ''
while True :
    s = raw_input("あなた:")
    print "アリーチェ:ふ〜ん、それで?"

print "アリーチェ:ばいば〜い"

これをどんどん改造してプログラムを作っていくことにします。

参考

私がこのプロジェクトで説明するAIの前半部分はほぼ以下の本に準拠しています。
Amazon.co.jp: はじめてのAIプログラミング―C言語で作る人工知能と人工無能: 小高 知宏: 本
この本ではCで記述されていますがそれをpythonで書き換えたものを使って制作しています。
初学者の方は上の本をご覧になるとよいかと思います。

備考

アリーチェというAIの名前に関して。
アリーチェとは英語読みすると「アリス(Alice)」、プログラム界(特に暗号業界)では一躍ボブと並んでよく通信をしている通信マニアの女性を指します(違

*1:ここでは便宜上AIと呼ぶことにしますが、中身はほとんど人工無能の域を出ないものです。あしからず

*2:文法的に正しく、意味の通る文章を生成すること