none
中文化 聊天機器人AIMLbot 核心程式 RRS feed

  • 問題

  • 小弟最近將聊天機器人動工到VB.NET上 (小弟母語VB)   和 中文化的作業  但遇上了麻煩了

    以下是我將中文化的句子存到AIML 的圖片  並且試著運行它

    AIMLbot的.NET引擎是用C#設計  是藉由搜索 <pattern> 標誌裡文字 來組合出回復的語句的  

    資料存在AIML檔的文字格式是 encoding="utf-8"  這是unicode編碼  應該能支持中文吧!  但當我輸入中文對話

    它卻不能答覆 回復出空白的資料

    所以目前遇到最大的難題就是  這個開源的AIMLbot 引擎似乎不支持中文化正則運算式的搜索  

    我似乎得去修改AIMLbot 的正則運算式

    但我對中文的正則運算 概念也不太熟悉 之前只處理過英文跟數字的 煩請各位能提供中文化AIMLbot核心引擎的幫助

    協助我修改 AIMLbot 的引擎 

    附上我修改的VB.NET聊天機器人程序及C# AIMLBOT 引擎 給各位大大 

    VB.NET AIMLBOT

    AIMLBOT C# 引擎


    • 已編輯 向恩 2012年4月1日 上午 07:39
    2012年4月1日 上午 07:39

解答

  • 你確定是unicode編碼嗎?

    你在屬性視窗看到的是它的宣告,實際儲存時不一定就是unicode。

     

    你得看「檔案--進階儲存選項」這個地方

    2012年4月5日 上午 01:28

所有回覆

  • 嗯~ 能否只針對問題點,列出Key Point來發問? 

    在論壇上發問,應該很少人會肯看完整個專案在回答怎麼修改。


    學無止境

    2012年4月3日 上午 03:15
  • 目前小弟先鎖定了幾個點下去著手 做了點小功課  先講講我寫的VB的代碼

    Dim r As New Request(input, myUser, myBot)
                    Dim res As Result = myBot.Chat(r)    '研究 Chat 函數
                    'Console.WriteLine("機器人說: " + res.Output)
                    RichTextBox1.Text = "我說什麼: " & input & vbCrLf & "機器人說: " & res.Output

    這裡有一個重點就是丟進去句子之後  它得經由myBot.Chat(r)   也就是透過mybot類的chat方法 來傳遞要回復的句子

    所以我回到C#原代碼仔細檢查了 mybot這個類 跟chat有關的所有代碼及相關細節

            public Result Chat(Request request)           //關鍵代碼
            {
                Result result = new Result(request.user, this, request);
                if (this.isAcceptingUserInput)
                {
                    // Normalize the input
                    AIMLLoader loader = new AIMLLoader(this);   
                    AIMLbot.Normalize.SplitIntoSentences splitter = new AIMLbot.Normalize.SplitIntoSentences(this);
                    string[] rawSentences = splitter.Transform(request.rawInput);
                    foreach (string sentence in rawSentences)    //遞迴方式搜尋符合搜尋字串
                    {
                        result.InputSentences.Add(sentence);
                        string path = loader.generatePath(sentence, request.user.getLastBotOutput(), request.user.Topic, true);
                        result.NormalizedPaths.Add(path);   //將遞迴搜索結果存入path 做第二重遞迴搜索
                    }
                    // grab the templates for the various sentences from the graphmaster
                    foreach (string path in result.NormalizedPaths)
                    {
                        Utils.SubQuery query = new SubQuery(path);
                        query.Template = this.Graphmaster.evaluate(path, query, request, MatchState.UserInput, new StringBuilder());
                        result.SubQueries.Add(query);
                    }
                    // process the templates into appropriate output
                    foreach (SubQuery query in result.SubQueries)
                    {
                        if (query.Template.Length > 0)
                        {
                            try
                            {
                                XmlNode templateNode = AIMLTagHandler.getNode(query.Template);
                                string outputSentence = this.processNode(templateNode, query, request, result, request.user);
                                if (outputSentence.Length > 0)
                                {
                                    result.OutputSentences.Add(outputSentence);
                                }
                            }
                            catch (Exception e)
                            {
                                if (this.WillCallHome)
                                {
                                    this.phoneHome(e.Message, request);
                                }
                                this.writeToLog("WARNING! A problem was encountered when trying to process the input: " + request.rawInput + " with the template: \"" + query.Template + "\"");
                            }
                        }
                    }
                }
                else
                {
                    result.OutputSentences.Add(this.NotAcceptingUserInputMessage);
                }
                // populate the Result object
                result.Duration = DateTime.Now - request.StartedOn;
                request.user.addResult(result);
                return result;
            }

    這裡使用了不少遞迴在這裡

     string path = loader.generatePath(sentence, request.user.getLastBotOutput(), request.user.Topic, true);
                        result.NormalizedPaths.Add(path);   //將遞迴搜索結果存入path 做第二重遞迴搜索

    在這裡 有個地方 引起我的高度關注 就是上面這幾行

    我到Result這個類下  仔細研究了一番

    這裡的幾行代碼看起來就是影響搜索路徑的代碼

          public string Output     //關鍵
            {
                get
                {
                    if (OutputSentences.Count > 0)
                    {
                        return this.RawOutput;    //Output 會反饋值給RawOutput
                    }
                    else
                    {
                        if (this.request.hasTimedOut)
                        {
                            return this.bot.TimeOutMessage;
                        }
                        else
                        {
                            StringBuilder paths = new StringBuilder();
                            foreach (string pattern in this.NormalizedPaths)  //關鍵點
                            {
                                paths.Append(pattern + Environment.NewLine);   //關鍵點
                            }
                            this.bot.writeToLog("The bot could not find any response for the input: " + this.RawInput + " with the path(s): " + Environment.NewLine + paths.ToString() + " from the user with an id: " + this.user.UserID);   //關鍵
                            return string.Empty;
                        }
                    }
                }
            }

    這裡有個AIML檔的註記區塊 pattern    這裡應該跟AIML檔 各種主題回復語句做的pattern   註記有關

    還有下面這裡有一串英文信息

    The bot could not find any response for the input

    意思是找不到任何輸入的回應   所以我現在正下功夫在研究這裡 

    不過這裡似乎還跟正則扯不上關係   小弟目前只研究到這裡 望各位能多多幫忙

    2012年4月3日 下午 01:34
  • 你確定是unicode編碼嗎?

    你在屬性視窗看到的是它的宣告,實際儲存時不一定就是unicode。

     

    你得看「檔案--進階儲存選項」這個地方

    2012年4月5日 上午 01:28
  • 

    我開來看一下 它也是存unicode 的沒問題  前幾天用C#去編寫  然後調用DLL 發現可以回傳字串出來了

    這樣的情況 是因為某些情況下C# 編寫的資料 不能回傳至VB.NET 的關係嗎?

     

    我還第一次碰到這種問題的

    2012年4月6日 下午 12:44
  • 你好,请问你用的ALICE  C#版本的原码吗?我用的是Java版本的,我想应该注意两个问题,一个是编码问题:1,你的AIML文件是否是UTF-8的。2,当你输入你说的话的时候,你在打印出来看看是不是乱码了,如果乱码了当然不行了。第二个问题:在我的java版本的源码里面,我定位到这么一个方法,它的注释写的很明白,就是把非字母和数字的字符全部替换成一个空格,如果我没有猜错的话,楼主输入“你好吗”,那么机器人回答的是一个空格。我也遇到和楼主一样的问题,我解决方法就是把那个方法给注释掉了,使得我输入的中文不会被过滤掉,然后就可以了,但实际上我还没有完全弄懂那个方法的其他作用,这样做很危险呵呵。

    我没看过C#版本的原码,建议楼主找找看。

    我最近在搞在线客服机器人,我的邮箱a542107840#qq.com

    2012年6月17日 上午 03:14