Erlangで人工知能に挑戦してみるよ日記

2008-07-21

[]やりたいことをメモ。 やりたいことをメモ。 - Erlangで人工知能に挑戦してみるよ日記 を含むブックマーク はてなブックマーク - やりたいことをメモ。 - Erlangで人工知能に挑戦してみるよ日記

Erlang関連ではないんですが、このブログをはじめるうえで、作りたいもののイメージを記しておきます。

作りたいもののイメージ

  • チャットボット(人工無脳)を作る

 チャットボットが大好きです。

  • MeCabなどの形態素解析器を使わずに、N-gram方式の解析器を自前でつくる

 形態素解析器を使ったチャットボットは、比較的自然な日本語を話しますが、おもしろさという観点でいうと

 N-gram方式の解析器を使ったほうが可能性が広がるように思います。

  • ログから学習して辞書を生成し、辞書から発言を生成する方式のチャットボットにする。

 ログ学習型のチャットボットは大好きです。

  • フロントエンドの部分は作らない、あくまで「チャットボットエンジン」のみをつくる。

 エンジン単体で作った方が、いろいろと使いまわしがしやすいのでそうします。

  • 外部との入出力は、HTTP(REST)にする。

 たとえ、なんちゃってRESTだとしても、とりあえRESTっぽく作っておけば他の言語からも制御できるから。

  • 文章を生成するロジックは複数もって、それらを評価して組み合わせるようなイメージ。

 せっかく、1からチャットボットを作るのだからいろいろやってみたい。

  • 文章を解析するパーサは、特定の言語や環境に依存しないようなものにしたい。

 日本語でも英語でも一行AAでもパースできるのが理想。何を入力されてもパースできるパーサを作りたい。

RubyistなのにErlangで作ろうと思った理由。

  • 並列という概念をチャットボットに取り入れることで、おもしろいものが作れそう。

構想

  • 入力された文章をパースして構文にする部品を作る。
    • N-gramでパースするパーサを作る。
    • パーサの最適化を行う部品を作る。
    • パーサの評価を行う部品を作る。
    • パースした構文を辞書に格納する。
  • 文章を生成する部品を作る。
    • 種となる構文と近似する構文を選ぶ部品を作る。
    • 構文の近似性を判定するロジックをいくつか作る。
    • 構文から文章を生成する部品を作る。
    • 構文から文章を生成するロジックをいくつか作る。
    • 外部からの評価を受けて何らかの形で反映させてみたい。
  • 異なる環境で成長させたチャットボット同士で情報の並列化をさせてみたい。

作りたいもののイメージ。

攻殻機動隊に登場するAI、タチコマのような「並列化されたしゃべるロボット」を作りたい。

Erlangならなんか作れそうな気がした。

たぶん、ゴーストは宿らないと思うけど^^;

2008-07-13

[][]パーサつくるよ パーサつくるよ - Erlangで人工知能に挑戦してみるよ日記 を含むブックマーク はてなブックマーク - パーサつくるよ - Erlangで人工知能に挑戦してみるよ日記

-module(parser).
-export(parse/2]).
-export(find_prefix_of_tail/2]).
-export(original_flatten/1]).
%% find for list of prefix, return list or tail.
find_prefix_of_tail(_Prefix, List) -> [];
find_prefix_of_tail(Prefix, List) ->
  case lists:prefix(Prefix, List) of
    true ->
      [[hd(List)|find_prefix_of_tail(Prefix, tl(List))]];
    false ->
      lists:append([hd(List), find_prefix_of_tail(Prefix, tl(List)))
  end.

%% shallow flatten.
original_flatten(List) ->
  Split = fun(L) ->
    lists:splitwith(fun(X) -> is_integer(X) end, L) end,
  {First, [Second]} = Split(List),
  case is_list(lists:last(Second) of
    true ->
      lists:append([First], original_flatten(Second));
    false ->
      [First, Second]
  end.

%% parse from target(list) for list. return on target_words(list).
parse(Target, List) ->
  original_flatten(find_prefix_of_tail(Target, List)).

やりたいこと。

  • 並列化、分散化された人工知能がつくりたい
  • 要件、評価つきで自己学習できる
  • 要件、N-gram方式で文章解析する

今回つくったパーツ。

  • 文章解析のパーサ。

こんなのをつくったつもり。

parser:parse("は", "今日は、僕は田中一郎です。").

#=> ["今日", "は、僕", "は田中一郎です。"]*1

*1:実際には文字列ではなく、文字列を表現するバイトのリストで返る