辞書型人工無能?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
あんじ

辞書型人工無能?

#1

投稿記事 by あんじ » 10年前

winbows7でVC++を使って辞書型人工無能を作ろうとしています

辞書型人工無能と言っても、フリーゲームの付属品でそのゲームの中の単語を入れると
「これこれこう言う風だよ」と答えてくれる簡単な代物です
どちらかと言うと、デスクトップマスコットに近いかもしれません

そこでここの掲示板などを拝見させてもらい
KeyInputString などで日本語入力できるようにはなったのですが
どうしたら そこで入力した文字を判別し、言葉を返すようなプログラムができますか?

調べても「会話をする」プログラムしか出てきません

C++を使い初めて三日目ぐらいの洟垂れ小僧に
どうかご指導ご鞭撻よろしくお願いいたします

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 辞書型人工無能?

#2

投稿記事 by みけCAT » 10年前

とりあえず、一番簡単なのは完全一致判定です。
単語をstd::mapなどの連想配列に登録しておき、入力された文字列をキーとしてアクセスします。
単純な実装では「三毛猫」で登録してある場合、「みけねこ」「三毛猫とは」などの文字列を入力してもマッチしません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 辞書型人工無能?

#3

投稿記事 by softya(ソフト屋) » 10年前

C++を3日で使えるはずがないので、そもそもそれが不思議ですが本当にC++を勉強されているんでしょうか?
DXライブラリを始めて3日で、C++の勉強は特にしていないと言うことはないですか?

>調べても「会話をする」プログラムしか出てきません

それの仕組みが理解できるなら作れるはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 辞書型人工無能?

#4

投稿記事 by みけCAT » 10年前

サンプルです。

コード:

#include <cstdio>
#include <cstring>
#include <string>
#include <map>

int main(void) {
	std::map<std::string,std::string> dictionary;
	dictionary["三毛猫"]="かわいい動物";
	dictionary["小林幸子"]="有名な歌い手";
	dictionary["ヒャダイン"]="氷の呪文";
	for(;;) {
		char input[10000];
		char* nlp;
		puts("何について聞きたいの?");
		puts("ENDと入力すると終了します。");
		putchar('>');
		fgets(input,sizeof(input),stdin);
		if(nlp=strchr(input,'\n'))*nlp='\0';
		if(strcmp(input,"END")==0) {
			puts("さようなら、また会えるといいな!");
			break;
		}
		else if(dictionary.find(input)==dictionary.end()) {
			puts("ごめんなさい、わかりません。");
		} else {
			printf("それは%sだよ。\n",dictionary[input].c_str());
		}
	}
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

あんじ

Re: 辞書型人工無能?

#5

投稿記事 by あんじ » 10年前

みけCAT さん
すいません ありがとうございます!
完全一致判定…
「みけねこ」が認識されないのはいいとして、「三毛猫とは」も認識されないんですね…
それじゃあ「君のスリーサイズは?」も無理ですねwww………………すいません変な事言って
サンプルを見つつ「三毛猫」「みけねこ」「三毛猫とは」などだいたい入力しそうな言葉を絞って
何回も入力してみることにします!!(出す言葉もすくないので)
忙しい中お時間を削っていただきありがとうございました!!


softya(ソフト屋) さん
C言語「何でも」掲示板の字を見てついつい稚拙な質問をしてしまったかもしれません

それと日本語もおかしかったようで申しわけございませんでした
>C++を使い初めて三日目ぐらいの洟垂れ小僧に
は「全然C++を使いこなせていませんよ」と表したかったのです さわりだけです
>そもそもそれが不思議ですが本当にC++を勉強されているんでしょうか?
私の文章が誤解しやすい文章ですいません 「C++を勉強している 習得している」と誤解させてしまったみたいですね
>DXライブラリを始めて3日で、C++の勉強は特にしていない
こちらの方が今の私に正しい状況です…誤解させてすいませんでした

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 辞書型人工無能?

#6

投稿記事 by softya(ソフト屋) » 10年前

老婆心で書き込みんでおきますがC言語とC++は別の言語です。まず、ここが区別できているか疑問です。
みけCATさんのサンプルは難しい方のC++で書かれています。
ちなみに、C++は言語の名前でVisualC++は開発環境の名前です。
これらをちゃんと区別しないと話がややこしくなります。

※ C言語にしろC++にしろ言語を勉強しないと始まりませんので、まず言語の入門書を買って勉強なさる事をおすすめします。C++の場合は軽く半年以上基礎にかかる気がしますので、C言語のほうが良いでしょうし、「辞書型人工無能」に拘るならJavaとか他の言語の方が習得が容易です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんじ

Re: 辞書型人工無能?

#7

投稿記事 by あんじ » 10年前

お気遣いありがとうございます! その優しさに感謝感激雨あられです!!
>C言語とC++は別の言語です
はい区別できております
「この掲示板をみています」から一応それぐらいは…
>みけCATさんのサンプルは難しい方のC++で書かれています。
そ、そうなんですか…じつは明日試そうとじっくりとは見ていませんでした
こんな私にサンプルを下さったことに満足しておりました
みけCATさん申しわけありません! softya(ソフト屋) もごめんなさい!!
>C++は言語の名前でVisualC++は開発環境の名前です
はい存じております
まずはOSと開発環境を書き込めば良いと思っておりました。すいません

>※ C言語にしろC++にしろ言語を勉強しないと始まりませんので、まず言語の入門書を買って勉強なさる事をおすすめします。C++の場合は軽く半年以上基礎にかかる気がしますので、C言語のほうが良いでしょうし、「辞書型人工無能」に拘るならJavaとか他の言語の方が習得が容易です。

そうですよね 「まずはチャレンジ、調べて調べてわかんなくなったら質問」の方式ではなく
「まずは勉学」の方ですよね……
10月までには作ろうと少し焦っていたのかもしれません…
「C言語」を半年ぐらい勉強し、
いつかもっと高度な質問をすることを目標としていきます!!(だめだこりゃ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 辞書型人工無能?

#8

投稿記事 by softya(ソフト屋) » 10年前

みけCATさんのは正確に書くとC言語とC++のミックスです。

>そうですよね 「まずはチャレンジ、調べて調べてわかんなくなったら質問」の方式ではなく
>「まずは勉学」の方ですよね……

この場合は分からないのではなく、手が付けれない状況だと思います。
理解できるようにする事を、まず考えないと何も作れません。
あと10月目標はかなり厳しいと思います(まず無理です)。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんじ

Re: 辞書型人工無能?

#9

投稿記事 by あんじ » 10年前

>この場合は分からないのではなく、手が付けれない状況だと思います。
ええ、はいそうかもしれませんね(汗)
>理解できるようにする事を、まず考えないと何も作れません。
はい、ですから半年間ほど勉学をいたし…C++言語を理解していこうと思います!
>あと10月目標はかなり厳しいと思います
またもや書き方が悪く申しわけありませんでした。
>10月までには作ろうと少し焦っていたのかもしれません…
「C言語」を半年ぐらい勉強し、
いつかもっと高度な質問をすることを目標としていきます!!

の部分で10月に完成はあきらめ半年後に完成を目標に(これも無理かもしれないけど)することに変えたのです
申しわけありません 文章もプログラムもくっちゃくちゃですよね…
こんなど素人の質問に長々とつきあわせてしまってすいません

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 辞書型人工無能?

#10

投稿記事 by softya(ソフト屋) » 10年前

半年でC++は基礎がやっとだと思います(C++の大半は理解できなまま)。これに耐えれる人も少ないので挫折者多数です。本当に半年で出来るかも保証はまったく出来ません。
単にC言語のよりも時間がかかるという意味で書いたに過ぎませんので。
半年やって、やっとプログラムを作る入り口に立つだけですので、ここで「辞書型人工無能」が作れるわけではありません。
ここから更に半年後になるか、一年かかるか誰にもわかりません。その前に挫折している可能性のほうがはるかに高いです。

なので、C++をやるのは避けたほうが良いと言う意味で書いたつもりです。
期待させたのなら申し訳ないですが、C言語の方が良いと思います。
それでも数ヶ月でプログラムが組めるように成るには、相当生活の時間をプログラムに回さないと行けません。
つまり、ほぼ半年間をプログラムにまわしてC言語をやって、「辞書型人工無能」が作れたら才能があった方と言ってよいでしょう。
C言語でも高い確率で挫折者が出来ます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんじ

Re: 辞書型人工無能?

#11

投稿記事 by あんじ » 10年前

荒らしのためスポイルしました。
► スポイラーを表示

アバター
usao
記事: 1887
登録日時: 11年前

Re: 辞書型人工無能?

#12

投稿記事 by usao » 10年前

では不肖私めが換わりにマジレスをば.

まぁ言語は目標物を作るための道具ですから 目標物を作りながら必要な事柄を勉強していくのでも良いと思います.
(とは言え,手を付けるためには最低限の言語の勉強はやはり必要でしょうけど)
このトピックの話で言えば,重要というか難しいのはむしろ「実現方法(アルゴリズムというか)」を考えることだと思います.

自然言語的な”まともな受け答え”を作るのは超絶難しいと思いますので,
例えばユーザからの入力を
・名詞のみ(知りたい単語でググる感じ.「○○とは?」みたいな文章では訊かない)
・{みけねこ,三毛猫,三毛ねこ,…}の例みたく書き方がいろいろあると網羅が大変なので最初はローマ字表記とかに限定
とか絞るなどして,さいしょは複雑さを極力軽減した条件でやってみるとよいのではないでしょうか.
オフトピック
プログラミング自体の経験が乏しいという話であれば,
前段階として,「a~zの26種類(一文字)の入力に対して,何かしら入力に対する出力を返す」とかいうような
練習問題的なものから始められた方がいいかも.(本当に初心者ならこれだけでも結構大変かもしれない)
それができたら 入力→判定→出力 の仕組み自体は原始的にでもできるので
後は任意文字数の入力に対応すれば,とりあえず最低限の形にはなるんじゃないかな.
以降,「賢く」する工夫やら方法やらが必要なのであれば,その分野を調べていけば何かしら見つかるかと.

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 辞書型人工無能?

#13

投稿記事 by みけCAT » 10年前

空気が読めていない気がしますが、どうしても追加のサンプルを投稿したくなったので失礼します。

部分一致判定
入力された文字列に、辞書に載っている言葉と一致する部分があるかどうか探します。
「三毛猫」が登録されている場合、「三毛猫とは?」にもマッチすることができます。
ただし、単純な実装では「ヒャダインズ・ゲートとは?」という入力が「ヒャダイン」にマッチしてしまいます。
また、「みけねこ」では「三毛猫」にマッチしません。

コード:

#include <cstdio>
#include <cstring>
#include <string>
#include <map>

typedef std::map<std::string,std::string> ssmap;

/**
 * 指定された文字列の中から辞書にマッチする言葉を探す
 * @param matchedWord マッチした言葉を入れる変数の参照
 * @param explanation マッチした言葉の説明を入れる変数の参照
 * @param query 辞書にマッチする言葉を探したい文字列
 * @param dictionary 辞書
 * @return 見つかったらtrue、みつからなかったらfalse
 */
bool searchTheWord(std::string& matchedWord,std::string& explanation,
		const std::string& query,const ssmap& dictionary) {
	for(int i=0;i<query.length();i++) {
		for(int j=query.length();j>i;j--) {
			ssmap::const_iterator ssi=dictionary.find(query.substr(i,j-i+1));
			if(ssi!=dictionary.end()) {
				matchedWord=ssi->first;
				explanation=ssi->second;
				return true;
			}
		}
	}
	return false;
}

int main(void) {
	ssmap dictionary;
	dictionary["三毛猫"]="かわいい動物";
	dictionary["小林幸子"]="有名な歌い手";
	dictionary["ヒャダイン"]="氷の呪文";
	for(;;) {
		char input[10000];
		char* nlp;
		std::string matchedWord("");
		std::string explanation("");
		puts("何について聞きたいの?");
		puts("ENDと入力すると終了します。");
		putchar('>');
		fgets(input,sizeof(input),stdin);
		if(nlp=strchr(input,'\n'))*nlp='\0';
		if(strcmp(input,"END")==0) {
			puts("さようなら、また会えるといいな!");
			break;
		}
		else if(searchTheWord(matchedWord,explanation,input,dictionary)) {
			printf("%sは%sだよ。\n",matchedWord.c_str(),explanation.c_str());
		} else {
			puts("ごめんなさい、わかりません。");
		}
	}
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
usao
記事: 1887
登録日時: 11年前

Re: 辞書型人工無能?

#14

投稿記事 by usao » 10年前

私の文章が誤解しやすい文章ですいません 「C++を勉強している 習得している」と誤解させてしまったみたいですね
>DXライブラリを始めて3日で、C++の勉強は特にしていない
こちらの方が今の私に正しい状況です…誤解させてすいませんでした
という質問者側の状況に対して,サンプルとして提示するには厳しいコードなのでは…
オフトピック
ある単語を完全に含む別の単語 がある場合,例えば
"三毛猫" の他に "箱入り三毛猫" と "三毛猫(遺伝子組み換えでない)" の3種類を登録してあったら
2番目が知りたいのに1番目が出てきてしまったりとかしそうですね.
正しいのを見つけるには辞書内を全探索する必要があるのだろうか?

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 辞書型人工無能?

#15

投稿記事 by みけCAT » 10年前

usao さんが書きました:
オフトピック
ある単語を完全に含む別の単語 がある場合,例えば
"三毛猫" の他に "箱入り三毛猫" と "三毛猫(遺伝子組み換えでない)" の3種類を登録してあったら
2番目が知りたいのに1番目が出てきてしまったりとかしそうですね.
正しいのを見つけるには辞書内を全探索する必要があるのだろうか?
実装によってはその可能性がありますが、自分のコードでは一番最初から始まる文字列のうち一番長いものにマッチする仕様なので、
この例なら大丈夫だと思います。
ご自分でテストしてみたらいかがですか?

逆に辞書内を全探索しても、実装によっては"箱入り三毛猫"の前に"三毛猫"が登録されていればアウトかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: 辞書型人工無能?

#16

投稿記事 by naohiro19 » 10年前

あんじ さんが書きました:あなたとの会話に挫折しました
こちらが質問した側なのでなるべく丁寧な応対をしようと思ったのですが
しつこさ、上から目線、見下し、粘着質、文章を読まない(これは私の方が悪いけど)
にあきれました
あなたは多分、自分の性格悪さに気付いていないでしょうが…

私が質問したのにこんなこと言うなんて本当に心苦しいのですが
…もう回答しないでください、気持ち悪いを通りこしてその執念が何だか怖いです
それはあなたの言い訳というのですよ。

アバター
あたっしゅ
記事: 664
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: 辞書型人工無能?

#17

投稿記事 by あたっしゅ » 10年前

naohiro19 さんが書きました:
あんじ さんが書きました:あなたとの会話に挫折しました
こちらが質問した側なのでなるべく丁寧な応対をしようと思ったのですが
しつこさ、上から目線、見下し、粘着質、文章を読まない(これは私の方が悪いけど)
にあきれました
あなたは多分、自分の性格悪さに気付いていないでしょうが…

私が質問したのにこんなこと言うなんて本当に心苦しいのですが
…もう回答しないでください、気持ち悪いを通りこしてその執念が何だか怖いです
それはあなたの言い訳というのですよ。
自分は、あんじさんの意見を支持します。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

moriya

Re: 辞書型人工無能?

#18

投稿記事 by moriya » 10年前

荒らしのため。スポイルしました。
► スポイラーを表示

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 辞書型人工無能?

#19

投稿記事 by Dixq (管理人) » 10年前

あんじさんの回答については取りあえず置いておくとして・・。

moriyaさんは、今まで何度も以下のような数々の名前を利用して自演コメント投稿や質問を繰り返していますよね。
まずそれを止めて下さい。
何度も言っていると思いますが何故やめて頂けないのでしょう。
たまたま同じPCを他の人が使ったのだという言い訳はもうやめて下さい。

ummさん
VWXYZwwwwwwwさん
あおいうえさん
aguroqさん
くれらっぷさん
・・・等々

sozai
記事: 57
登録日時: 10年前
住所: 日本-関東
連絡を取る:

Re: 辞書型人工無能?

#20

投稿記事 by sozai » 10年前

あんじさんが見てくだっさているかは分かりませんがアドバイス(?)を。
もし、C言語を理解しているのであれば、みけCATさんのサンプルコードで分からないところを入門サイトや本などで調べる
とよいのではないかと思います。
※これは「遅延評価勉強法」と呼ばれるものです(多分...)。
[hr]
Is it true?
Function = a==b;

閉鎖

“C言語何でも質問掲示板” へ戻る