Posts tagged: 無能bot

会話は難しい。

このエントリーをはてなブックマークに追加
はてなブックマーク - 会話は難しい。

無能BOTに関連検索ワードWeb APIを用いてリプライに対応させることにした。
リプライ飛んで着たらテキトーに関連語探してマルコフ+DBで。


まだまだ実装したばっかりで適当。
もっとしっかり構想を練らなければ。

とりあえず適当に質問やら会話文やらを入力してみた。


最近アニメ見てる?


最近ソング見てるんですから……!いや、どうしましたよ!!
最近無料見てる方が偉いんだろ!!ヒーロー気取りかぁ?

許容範囲内。

カーディガンズってそんなに昔なの?

カーディガンズってそんなに酷いかな?

質問返しw

あれ見てたんだw


ごめんね、ごめんね…姉さん…良い?

姉さんじゃねえ!!!しかも何かえろいぞ!!!

テストは嫌いだな

センターは…知ってるの?
テストは沢尻エリカきらいだな、これで……ダメですね

テストは沢尻知りません><そもそもテストは生き物じゃありません><

まーそれでもなかなかいい感じだ。



問題は処理時間。
毎回毎回関連検索API使ってるから、10件もリプライ飛んでこようものならだいぶ時間がかかるだろう。


ここは関連語もDBに入れるか・・・?




まあまだ許容範囲内の速度だ。とりあえずこれでうpしてみるか。
単語1文字でリプライされると仕様上うまくマルコフ連鎖できない。

1文字で来たら・・・検索APIでその語句を含む適当な文章取得してそれマルコフ用テーブルにぶち込んで新たな文章生成するか。





とりあえず今日は引きこもった。部屋から出たのは食事と風呂くらい。
TVも見なかった。まあ母親も仕事でいなかったし。


C#の教本半分ほど終わった。
前半は簡単だったからサクサク、結局BOT作って遊んだ。


カバンはTHE NORTH FACEのやつ通販で頼もう。
明日は余裕があったら立川いって靴と洋服見てこよう。


ついでにC#の基礎固めも。今月中にC#終わらせてC++の基礎くらいは出来るようにしたい。
ああそうだあとDuoかってTOEICに備えよう。

このエントリーをはてなブックマークに追加
はてなブックマーク - 会話は難しい。

無能風BOT完成

このエントリーをはてなブックマークに追加
はてなブックマーク - 無能風BOT完成

ひとまず完成。
主にMeCab+Yahoo形態素分析API+SQLiteを利用した。



MeCabの辞書にwikipediaのタイトルとHatenaKeyWordを追加、んで2chのSSスレから会話分6万行ほど抜き出してそれをMeCabで分かち書き、マルコフ連鎖用テーブル作ってDBにぶち込んだ。

で、あとはTLからpostを取得、その文章とDBを元にマルコフ連鎖で新たな文章を生成、post。

 


近々このブログを知り合い等に公開する(・・・のだろうか)ことも考えてIDは乗せないことにしよう。


しかし全く新しい文章が出来たときのwktkは半端じゃないな


反捕鯨団体シー・シェパードの元船長、ピーター・ベスーン容疑者(44)が、調査捕鯨船団の監視船「第2昭南丸」に侵入した事件で、海上保安庁は14日午前、ベスーン容疑者を艦船侵入容疑で東京地検に送検した。ベスーン容疑者の身柄は同日中に、東京・葛飾区の東京拘置所に移される。


反捕鯨団体シー・シェパードの元メイドに会うとそんなに嫌そうなのか…ま、まあいいや、やっぱり地の文のやりとりの中に出して食べてみます

いまどうしてる?

いまどうした所で何がなんだかわからねぇが敵の隙に小用を済まそうと思っているだけで完全に私を笑わせてあげるよね、その………

2chのSSスレから会話分6万行ほど抜き出してそれをMeCabで分かち書き

2chのアニメキャラ板のビリビリスレ、mixiのビリビリコミュ、その他ビリビリ関係の無い人を好きになってますぅ!!

結局のところ最初の2単語しか利用してない。
若干、というかしばしば電波的な内容になるゆえBOTだと疑う人も多いだろう。



意味不明な文章をできるだけ減らす方向で行くか、それとも電波多めを目指すか。
今後の方向性を定めなければ。



できるだけ減らすなら・・・やはり”学習”させることが必要だな
「不適切な文章を報告」みたいに、1文ずつこれはいい、これはだめって評価して、単語のつながりの”正しさ”をパラメータ化しようか。

いずれにしてもDB再再再再構築だけはゴメンだ。方向性と仕様を定めよう。


 


今後の目標


  • まともな文章を出力するようにする

このエントリーをはてなブックマークに追加
はてなブックマーク - 無能風BOT完成

C#でMeCabを用いてマルコフ連鎖

このエントリーをはてなブックマークに追加
はてなブックマーク - C#でMeCabを用いてマルコフ連鎖

C#からマルコフ連鎖で文章生成するサンプルが見当たらなかったから書いてみた。
稚拙だと思うのでよくないところを指摘してくれるとうれしいのですが・・・

button1やらtextBox1やらtextBox2やら設置してポンッと。


        [DllImport("libmecab.dll")]
        extern static IntPtr mecab_new2(string arg);
        [DllImport("libmecab.dll")]
        extern static IntPtr mecab_sparse_tostr(IntPtr m, string str);
        [DllImport("libmecab.dll")]
        extern static void mecab_destroy(IntPtr m);


       private void button1_Click(object sender, EventArgs e)
        {
            //分かち書きした個々の言葉を配列に格納
            string wakatiText = makeWakati(textBox1.Text);
            string[] Words = wakatiText.Split(" ".ToCharArray());

            if (Words.Length - 2 < 0)
            {
                textBox2.Text = "単語数が不足しています";
                return;
            }

            //マルコフテーブル作成
            string[,] table = makeMarkovTable(Words);


            StringBuilder result = new StringBuilder();
            int wordNum = 0;
            HashSet addword = new HashSet();
            Random rand = new Random();
            List hitNo = new List();

            string firstWord_1 = Words[0];
            string firstWord_2 = Words[1];
                
            //最初の2文節をあらかじめ追加
            result.Append(firstWord_1+firstWord_2);

            //マルコフテーブルより文章生成
            while (true)
            {
                hitNo.Clear();
                for (int j = 0; j < table.GetLength(0); j++)
                {
                    if (table[j, 0] == firstWord_1 && table[j, 1] == firstWord_2 
                        && !addword.Contains(j))
                    {
                        hitNo.Add(j);
                    }
                }

                wordNum = hitNo[rand.Next(hitNo.Count)];
                result.Append(table[wordNum, 2]);

                addword.Add(wordNum);

                firstWord_1 = firstWord_2;
                firstWord_2 = table[wordNum, 2];


                if (firstWord_2 == "\n")
                    break;

            }
            textBox2.Text = result.ToString();
        }
        //MeCab用いて分かち書きした文字列を返す
        private string makeWakati(string text)
        {
            string result = null;
            IntPtr mecab = mecab_new2("-O wakati");
            IntPtr s = mecab_sparse_tostr(mecab, text);

            result = Marshal.PtrToStringAnsi(s);
            mecab_destroy(mecab);            
            return result;
        }
        //単語の配列からマルコフテーブル作成して返す
        private string[,] makeMarkovTable(string[] text)
        {
            string[,] MarkovTable = new string;
            try
            {
                for (int i = 0; i < (text.Length); i++)
                {
                    if (i + 2 >= text.Length)
                    {
                        MarkovTable[i, 0] = text[i];
                    }
                    else
                    {
                        MarkovTable[i, 0] = text[i];
                        MarkovTable[i, 1] = text[i + 1];
                        MarkovTable[i, 2] = text[i + 2];
                    }
                    if (text[i + 2] == "\n")
                        break;
                }
            }
            catch
            {
                return null;
            }
            return MarkovTable;
        }

で、結果はこんな感じに。


反捕鯨団体シー・シェパードの元船長、ピーター・ベスーン容疑者(44)が、調査捕鯨船団の監視船「第2昭南丸」に侵入した事件で、海上保安庁は14日午前、ベスーン容疑者を艦船侵入容疑で東京地検に送検した。ベスーン容疑者の身柄は同日中に、東京・葛飾区の東京拘置所に移される。

反捕鯨団体シー・シェパードの元船長、ピーター・ベスーン容疑者(44)が、調査捕鯨船団の監視船「第2昭南丸」に侵入した。ベスーン容疑者を艦船侵入容疑で東京地検に送検した事件で、海上保安庁は14日午前、ベスーン容疑者の身柄は同日中に、東京・葛飾区の東京拘置所に移される。




多分、サンプル見るよりもマルコフ連鎖は何なのかを調べたほうが早いと思います。
実際、PHPやらPythonのばっかりでどういうアルゴリズムなのかが良く分からず戸惑いました。



分かち書きして文節ごと(?)に分けて、[接頭語前,接頭語後,接尾語]のテーブル作って
接頭語後と接尾語をキーにして\n出るまで延々とループさせてるだけです。



人工無能を作ろう~マルコフ連鎖(2接頭語と1接尾語の場合)がとても参考になりました。

人工無能を作ろう~マルコフ連鎖(2接頭語と1接尾語の場合)人工無能を作ろう~マルコフ連鎖(2接頭語と1接尾語の場合)

このエントリーをはてなブックマークに追加
はてなブックマーク - C#でMeCabを用いてマルコフ連鎖

Dansette