ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュの人工無脳を作りたいと思っています

  • mixiチェック
  • このエントリーをはてなブックマークに追加
アプレットで動く人工無脳を作りたいと思っています。
ソースとは別にtxtファイルでパターン辞書を作り、パターンマッチングで返答するタイプのモノです。
また、辞書にない単語には、「〜って何?」と返答し、回答すると新しいパターンを学習するようにしたいです。
形態素解析やマルコフ連鎖については考えてません。
パターン、学習、ランダムのみの単純なモノです。

どなたか教えていただけますでしょうか
よろしくお願いします。

コメント(25)

辞書はDBで良くない?
あと具体的な会話イメージがないとわからない
ありがとうございます。

以下のソースはネット上で見つけたものですが、非常に単純な返答しかしません。
これをうまく改造して「〜って何」と人工無脳に聞かれたら「〜〜は○○だよ。」とユーザーが答えたときにそれをパターンで学習させたいと思っています。
文章の中にマッチした単語があったら、それに対応した文章を返したいです。(形態素解析必要でしょうか。)

ユーザー「〜〜は○○だよ。」と入力

パターン辞書に〜〜 と ○○が対応させられて登録。

次回ユーザーが〜〜を含む文章を発言したら、
「〜〜って○○だよね。」
と発言する。(できれば一つの単語の入力に対して、複数のパターンがランダムに発せられるようにしたい。)

会話パターンは最初はあいさつ程度と「〜〜って何」程度で、会話からパターンを学習させたいです。
DBは経験が無いので出来ればtxtファイルなどを使いたいです。

yuichirwさんのソースは参考にさせていただきます。
ありがとうございます。

メインクラス
import java.awt.Container;

import javax.swing.JFrame;

public class Main extends JFrame {
public Main() {
setTitle("人工無脳");

MainPanel panel = new MainPanel();
Container contentPane = getContentPane();
contentPane.add(panel);

pack();

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}

public static void main(String[] args) {
new Main();
}
}

チャットボットクラス
public class Chatbot {
private String name;

public Chatbot(String name) {
this.name = name;
}

public String getResponse(String message) {

return message;
}

public String getName() {
return name;
}
}

メインパネルクラス
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class MainPanel extends JPanel implements ActionListener {
private static final int WIDTH = 480;
private static final int HEIGHT = 480;
private JTextArea dialogueArea;
private JTextField inputField;
private Chatbot chatbot = new Chatbot("あなた");
public MainPanel() {
setPreferredSize(new Dimension(WIDTH, HEIGHT));
initGUI();
}
private void initGUI() {
setLayout(new BorderLayout());

dialogueArea = new JTextArea();
dialogueArea.setEditable(false);
dialogueArea.setLineWrap(true);
dialogueArea.append("こんにちは、何か話してください。\n\n");

inputField = new JTextField("ここにコメントを書いてください。");
inputField.selectAll();

JScrollPane scrollPane = new JScrollPane(dialogueArea);
scrollPane.setAutoscrolls(true);
add(scrollPane, BorderLayout.CENTER);
add(inputField, BorderLayout.SOUTH);

inputField.addActionListener(this);
}

public void actionPerformed(ActionEvent e) {
String input = inputField.getText();
dialogueArea.append(input + "って何ですか。\n");

String response = chatbot.getResponse(input);
dialogueArea.append(chatbot.getName() + "\t" + response + "\n");
dialogueArea.setCaretPosition(dialogueArea.getText().length());

inputField.setText("");
}
}
横から失礼

ざっと読んだ印象としては,「まず"パターン辞書"とは何なのか」を具体的に定義するところからだろうなぁという感じ
例えばここまでの書き込みを読んで頭に浮かんだのは以下の3つぐらいだけど,どれにするつもりなのか,あるいはこれ以外なのか.

(1) <単語>→<文>関連の集合
「入力文中に<単語>があったら<文>を出力する」という使い方

(2) <1つ以上の単語の組合せ>→<文>関連の集合
「入力文中に<1つ以上の単語の組合せ>のうちのいずれか(あるいは全て)があったら<文>を出力する」という使い方

(3) <単語A>→<単語B>関連の集合
「入力文中に<単語A>があったら"<単語A>って<単語B>だよね"と出力する」という使い方
トリーヴァさん、とても良い指摘をいただいてありがとうございます。

実は、独学でなんとかやろうとしていたのが、(3)なんです。
しかし、これは無脳として限界があるのに気付いていました。

今回は、できれば、(2)の反応をする無脳が作りたいです、

(2)のマッチングに引っ掛からなかったら、一つの単語のパターンにマッチした単語を含む文章の出力。(3)ですね。

全くマッチしなかったら、無意味発言「あ〜〜眠い。」などと質問発言「〜〜って何?」(辞書作成のための)をランダムに発言させるにしたいと思っています。

これが理想なのですが、もし無理でしたら、最も基本的な(3)でも構わないです。

よろしくお願いします。
ユーザインタフェースとして、テキスト入力に用いる言語は日本語でしょうか?
だとすれば、単語A→単語Bというパターンマッチングだけでも、
形態素解析抜きでは難しいものがあると思います。

例えば英語は、単語間にスペースがあるので、
スペースで区切られていれば、自分の知らない単語でもそれが「単語」だと認識できますが、
日本語は、単語間の区切りを見つけるために、
ある程度の種類の単語を既に知っている必要があります。
これが、いわゆる形態素解析の役割です。

例えば、「マッチング」というユーザからの入力テキストに対して、
システムに「マッチング」という単語の登録がなく、
「マッチ」という単語のみ登録されていたとすれば、「マッチ」にマッチングさせてしまうでしょう。

複数の単語の組み合わせに反応するようにするには、
なおさらそういう部分に気を遣う必要がありそうです。

人工無能を設計する上での目標にもよりますが、
単純な応答を実現したいだけであれば、英語を軸に考えられた方が、システム設計が簡単かと思います。


あと、これは言語に依存しない問題ですが、
語形変化による複雑さを回避したいなら、名詞に限定した入力にした方が良いかもしれません。

システムが「シェパードって何?」とユーザに問うた時、
ユーザが、「犬」と単語で答える場合と、
「シェパードは犬です。」、「それは犬だよ。」など文で答える場合とでは、
明らかに後者の方が辞書作成のアルゴリズムが複雑です。
この場合もやはり形態素解析が必要なのと、
必要に応じて代名詞の内容解析も必要だからです。

複数の単語の組み合わせに対して文で応答する、というのは、
おそろくはユーザの入力テキストから抽出した複数の単語の組み合わせに対して、
ということを想定していらっしゃるかと思いますが、
形態素解析を避けてそれを行うのは難しいかなぁ、と思いました。


何かの参考にしていただければ幸いです。
ご指摘ありがとうございます。

私が現在使用しているレンタルサーバーにアップしてアプレットとして人工無脳を実現したいのですが、以前、形態素解析機をアップしようとしたところ非常に容量が大きくアップできませんでした。
そういう問題もあり、形態素解析をしないか、非常に軽量な解析機を探すか、どちらかにしています。
現在の私の技術力ではどちらかしか思い浮かびません。
Yahoo Web APIなどつかってみては?
http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html

個人的には「アプレット」ってところの方が気になった.
あくまでUIをアプレットで作るだけで処理はサーバにやらせるのならいいけど.
というか,そうしないと学習できないよねw
動かしてみました。
これを拡張すればいろいろとできそうですね。

アルファベットではなく、日本語で入力するにはどうすればできますか。
それと、アプレットで動かすことはできますか。

自分でDBの勉強もしてみようと思います。
ACCESSなどでも良いのでしょうか。
DBについては全く無知なので・・・。
んではyuichirwさんのコードを拡張していく感じでコメントしていきましょうか.


>アルファベットではなく、日本語で入力するにはどうすればできますか。

今のコードのままでできますよ.
「日本語より英語の方が簡単」というのは,あくまで"文"の中から"単語"を切り出す処理が,英語はスペースで切るだけだから簡単という意味です.このあたりの処理を追加していくときになったら,英語か日本語か考える必要がありますが,現時点ではとりあえず英語でも日本語でも動きます.

また,一応補足しておくと,もしEclipseを使って実行して日本語入力に失敗しているなら,それはEclipseのコンソールが日本語に対応しきれていないことが原因である可能性がありますので,(Windowsなら)コマンドプロンプトで実行するとうまくいきますよ.


>アプレットで動かすことはできますか。

これも,「今の仕様でいいのならできる」と答えざるを得ませんね.
ただし,今後拡張していった場合に,アプレットであるが故の問題が発生します.「mysqlなどのdbを使ってみたり、テキストファイルに書き込んでみる」あたりで(絶対解決不可能とは言いませんが).この問題に関して1から10まで説明するとすごく長くなってしまうのでとりあえず省略します.聞きたいことがあれば聞いてください.

以上のことを認識した上で,アプレットとして動かしてみたいのであれば,#3にいいださんが書かれているコードと組み合わせて動かすことはできると思います.必要なら書いてみますよ.


>ACCESSなどでも良いのでしょうか。

ACCESSで作ったデータをJavaで扱うこともできますので,ACCESSでもいいですよ.
ただ,ACCESSって普通のDBMSと立ち位置が違うので,「ACCESSの勉強をしよう」というつもりで勉強すると,「DBの勉強」と全く違う方向に行きかねないので注意してください.「あくまで勉強するのはDBで,試しに動かしてみるときにはACCESSでやってみる」というやり方が良いと思います.

ちなみに皆さんDBの勉強って何から始めてるんでしょうか・・・
私の場合,初めてDBを勉強したのは大学の講義だったので,勉強の仕方なんて意識したことないんですよね.
一応参考までに,その講義で使った教科書のリンクだけ貼っておきます.
http://www.amazon.co.jp/dp/4785620463
先ほどmySQLをダウンロードしてみました。
まずSQLの使い方から勉強します。
その前に、インストールができません。SETUP.EXEが見つからない・・・・。

DBについては、週末にでも勉強してみようと思います。

アプレットを通して、いろいろな人が言葉を仕込んで頭がよくなる無脳が作りたいです。
そういうの作ろうと思うと、Servletとかも必要になりますよ
就活を考えていなければパターン定義はFILEにするメリットもある
特に検索アルゴリズムを勉強しなければならないから勉強になる
そういうのは仕事ではできない(普通はDBつかうから)

逆にDBは環境構築を1人でやるのがきつい
可搬性が低いというのもデメリット
>現場では第三正規化まではやりすぎですよーとかいわれたりします。

えー?
それはひどくない?
たまに性能要件に見合わない場合は逆正規化するけど、通常は第3かボイスコッドかまでやるでしょ

単にDB知らない人のいいわけじゃないの?

データベースに関する話題も興味深いですが,とりあえず話を戻してみます.

試しに#3をアプレット化して,#9を無理やり組み込んでみました.
http://www.treva-note.com/java/chat/

こんな感じで動かすことはできますが,1つ問題があります.#15でyuichirwさんがおっしゃられているように辞書をファイルに書き出すことが,アプレットではできないんですよね.
なぜできないかと言うと,アプレットはクライアントサイドだからです.サーバサイドとクライアントサイドの違いについて解説しているページがあったので一応貼っておきます(もっと分かりやすくて詳しいページないかなぁw).
http://css-php.com/php/1-2.html

か ず き ちさんもおっしゃられているように,「いろいろな人が言葉を仕込んで頭がよくなる無脳」を作るためにはどうしてもサーバサイドが必要になると思います(私が「アプレットってのが気になる」って言っていたのはこういうことなんですけど,ご理解いただけたでしょうか).


>yuichirwさん
Eclipseコンソールに関しては,自分もハマって調べてみたらどうもEclipseコンソールが怪しいらしいって分かっただけですけどねw
トリーヴァさんありがとうございます。

確かにやってみると、一度覚えた言葉もアプレットを終了してしまうと、また忘れてしまうんですね。
つまり、CGIのようにユーザーからサーバーにはアクセスできないんですね。

とすると、WEBで動く人工無脳を作るにはアプレットでは無理なのでしょうか。

それとも、CGIを動かすプログラムなどで最初から書いた方が良いのでしょうか。
CGIで作れるようなものをJavaで作るテクノロジにServletがあります。
GUIを素敵なものにしたいのなら、画面をアプレットで作って、裏の処理をServletで作るとか。
もし、HTMLベースの画面でいいなら、Servletだけで作ることも出来ます。

実際には、JSPとServletあたり使うことになると思います。
お願いします。やりかた教えてください。
私はアプレットでしかJAVAをやったことがありません。
>CGIのようにユーザーからサーバーにはアクセスできないんですね。

一応アプレットからサーバにアクセスすることは可能です.
しかし,結局はアプレットから何らかの形式でデータを受け取ってサーバに保存する処理が必要ですので,サーバサイドのプログラム作成を避けて通ることはできないと思います.


>WEBで動く人工無脳を作るにはアプレットでは無理なのでしょうか。

不可能ではありませんが,望ましくないと思います.
もし,人工無能における返答生成をアプレットに全て実装するとなると,
・クライアント側のリソースを消費してしまう
・辞書データは不要なものも含め全てクライアントに送信しなければならない
ということになってしまうと予想されます.

やはり理想は,サーバサイドで全ての機能を実装し,
クライアントから人間の発話を送信→サーバから人工無能の応答を送信
と繰り返すというシステムになると思います.

(ちょっとこの辺説明省略しすぎですか?わからなかったら聞いてください)


>やりかた教えてください。

ServletやJSPに関して参考になるWebページを貼ったりすることはできますが,その前に運用する予定のサーバでこれらの動作が可能か確認してみてください.レンタルサーバですと,JSP・Servletの利用が許可されているものは少数派だったと思います(最近のレンタルサーバ事情には詳しくありませんがw)
条件次第では,Javaでの実装をあきらめてPHPなどで作った方がいいかもしれません.
phpはやったことはないんですが、以前Rubyを学習したことがあります。まだ初心者ですが。
CGIで作ることを考えてみようと思います。
ありがとうございました。
> 21 いいださん
> お願いします。やりかた教えてください。
> 私はアプレットでしかJAVAをやったことがありません。
本買ってください。まじめな話、1トピック使っても教えきれないと思います。

ログインすると、残り5件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング