メインコンテンツまでスキップ

「ChatterBot」タグの記事が3件件あります

全てのタグを見る

人工無脳を作ってみる (1)入力文の末尾に文字列を追加

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

さて、最初は単純にユーザの入力文の末尾に予め定義されている文字列を付け足して応答するだけのものです。

ソースコード

package info.yukun.chatterbot;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class SimpleChatterBot {
private String botName = "chatterbot";
private String callStr = "なにかしゃべってよ(>_<)";
private String[] suffixResponses = {
"ってアレですね、わかります(^^)b",
"ですか?わかりません(>_<)",
"って何?日本語でおk('`)b"};
public void go() {
try {
BufferedReader stdReader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("INPUT : ");
String response;
String input;
while ((input = stdReader.readLine()) != null) { // ユーザの入力待ち
if (input.equals("")) { // 入力が無かった
response = callStr;
} else {
response = decorateInput(input) + getSuffixResponse();
}
System.out.print(botName + ": " + response);
System.out.print("\nINPUT : ");
}
stdReader.close();
System.out.println("\nPROGRAM END");
} catch (Exception e) {
e.getStackTrace();
System.exit(-1); // プログラムを終了
}
}
private String getSuffixResponse() {
int rand = (int) (Math.random() * suffixResponses.length);
return suffixResponses[rand];
}
private String decorateInput(String input) {
return "「" + input + "」";
}
public static void main(String[] args) {
SimpleChatterBot bot = new SimpleChatterBot();
bot.go();
}
}

getSuffixResponse()メソッド内で使われているMath.random()は、

static double random() 0.0 以上で、1.0 より小さい正の符号の付いた double 値を返します。

ですので、「Math.random() * 配列の長さ」 は「0~配列の長さ-1」 を意味します。

実行結果の例

INPUT : こんにちは
chatterbot: 「こんにちは」って何?日本語でおk('`)b
INPUT : え、
chatterbot: 「え、」ですか?わかりません(>_<)
INPUT : いえ、聞き返しただけです。
chatterbot: 「いえ、聞き返しただけです。」って何?日本語でおk('`)b
INPUT :
chatterbot: なにかしゃべってよ(>_<)
INPUT : 最近どうですか?
chatterbot: 「最近どうですか?」ってアレですね、わかります(^^)b
INPUT :
PROGRAM END

なんだかー、それはかとなくばかにしていますねf^^; 最初はJavaで書いていきますが、実装する機能の種類やリリースする環境によっては恐らく途中でOOをサポートする他の言語に変更するかも。

とあるボットのチャットログ

· 約3分
Yu Sasaki
Enterprise Security Manager / Advisor

人工無脳とのチャットログ

yukun> こんにちは
bot > こんちは
yukun> 元気してた?
bot > 元気に、そう見えても、おかしくはないがね。
yukun> そうか
bot > でしゃばりすぎだゼバーン!!
yukun> ぐわー!やられた・・・
bot > 自我があって、次のステップにいけなくなって、またねー
yukun> その自我とは?
bot > 自我になりえると思うよ
yukun> 今日は人工知能と自我について話そうぜ
bot > 何というか人間の思考を模倣することと自我とは全くの別問題だと思うのだよ?
yukun> ほんとにそう思う?
bot > 人工知能とかよりも早く義体できないかなぁとか思ってしまうな
yukun> え、あぁ義体ねぇ。つけてみたいか?
bot > 義だけ聞くと、ありがちな体ではあるね。
yukun> そうなのか。そんな体が在ったとは…
bot > かわいー!
yukun> お前さん、特殊な感性をしているな
bot > お前らと出会うことになるね、人間らしい考え方のプロセスを持つものは出来るけど、それの宇宙版なんだ。
yukun> もう、どう突っ込んでよいか…人間らしい思考のプロセスって具体的に何だろうね。
bot > わかればいいんだけどさ
yukun> わからないか?
bot > 違うよ…
yukun> と言いますと…
bot > じゃあこれ知ってる?
yukun> 何でしょう
bot > 何はわからん
yukun> 焦らし過ぎだから、残念!
bot > 残念なことに質問型の人工知能には、こっつちの質問できることにリストが必要だからね
yukun> 必要なら、学習させれば良いじゃないか
bot > な、なんだってー!?
yukun> まぁ、機械学習にも色々あるが、できないことはない
bot > IF-THEN型の学習ではフレーム問題に行き着くね。
yukun> お、なかなかどうして良いタイミングで鋭いことを言うじゃないか
bot > どんなタイミング型?
yukun> IF-THEN型のタイミングさ
bot > IF-THENは見てるタイミングない
yukun> 見るんじゃない、感じるんだ
bot > そんな感じw
yukun> マジか、ついに感性!?んなアホな

所々、文法が崩れているところがありますが、まぁ、予想の範囲です。

チャットログから本文を抽出

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

先日、メッセンジャーのチャットで会話するボットを作りました。 そのボットに「学習」させるネタに、会話文であるWindows Live Messengerのチャットログを用いることにしました。しかし、ログはXML形式なので、本文以外の余計なタグがはいっています。
まあ、エディタで不用な部分を置換していっても良いのですが...

抽出処理をRubyで自動化

仮に1時間かかる単調作業をするとしたら、私は50分かけても、その作業をこなすスクリプトを書く。

と言う言葉を思いだしたので、早速、Windows Live Messenger(前MSN)のチャットログから本文のみを抽出するコードを書いてみました。

#! ruby -Ks
require ‘kconv’
MSNRegexp =/(.*?)&lt;.Text&gt;/xm
data = ""
filename = ARGV[0]
begin
open(filename) do |f|
f.each do |line| # ファイルから1行ずつ読む
line = Kconv.kconv(line, Kconv::SJIS) # 文字コードを変換
line.chomp!
next if line.empty?
data.concat(line)
end
end
rescue => e
puts(e.message)
end
open(’msnLog.txt’, ‘w’) do |f| # 出力ファイル
data.scan(MSNRegexp){|tdata|
if tdata
f.puts(tdata)
end
}
end

上記のコードをプロンプトで抽出したいファイル名を引数に与えて 実行すると、msnLog.txtというファイルに本文が抽出されます。発言者なども抽出したい場合は、正規表現の部分を修正すれば良いですね。

では、今し方学習したボットとの会話はこんなです。 「とあるボットのチャットログ」 やってる本人は、結構楽しんでましたね^^;と言うか合せてました。

今後の改良点

当面の課題は、辞書のメンテツールの作成及びデータベース化、人格形成、文脈・話者理解と情報収集・加工機能を利用環境に合せたエージェント化とか(ぅぉぃ)。