1. 程式人生 > >[轉]淺談聊天機器人設計思路

[轉]淺談聊天機器人設計思路

果你是我以前的博友,那你一定知道小D是誰了,小D是我設計的第一個WEB聊天機器人,雖然只花了兩天的時間完成他,但也花了我不少的心思,今天我就給大家談談我做小D時的設計思路以供交流,如果你對智慧聊天感興趣,或許能幫你節省大量查詢資料的時間。

        1   知識庫

        機器人要想回答出你所提出的問題,那麼首先它就要具備自己的知識庫,就和人一樣,邏輯分析的前提,需要你具備對這個問題所儲備的知識以供參考,所以知識庫的重要性就不可避免的成了很重要的成分,那麼我們怎麼描述聊天機器人的知識庫呢,由於當初只是做來玩玩,所以我只是很簡單的做出了一一對應關係的資料庫。

        例如:我們生活在哪個星球上? 對應回答就是:地球!

        由此很多問題和相對應的答案便組成了我們的知識庫(也就是資料庫,我用的是MySql)!知識庫的大小直接關係到你的機器人是不是聰明。

         2  語句分析

        當然,僅有知識庫是不能進行對問題分析並做出答案的,所以我們必須要賦予程式能夠自我分析的能力。程式要想更加聰明,那不得不依靠強大的智慧演算法,因為我不是專業人士,所以開始也沒使用到很多智慧演算法,只是簡單的把句子中的分詞提煉出來。

        我是這樣設計我的小D的,先是進行完全匹配,然後是語句分析,最後是模糊匹配。

        完全匹配就是把問題的整個字串拿到資料庫中去查尋答案,如果能查到記錄便把對應的答案返回給提問者!如果不能查到,就進行模糊匹配,所謂模糊匹配就是最大限度的把整句話的意思放到知識庫去查詢(我的方案是先進行語句分析,再模糊匹配)。

         例如:地球的半徑是多少?

         如果完全匹配並沒從知識庫中檢索到資訊,那麼下個過程就是語句分析了,我們先把整個句子的各個詞語分開!

         例如:地球/的/半徑/是/多少?

         在這裡不得不提到分詞演算法,分詞就是將連續的字序列按照一定的規範重新組合成詞序列的過程。而我們要做的就是要將這一個又一個的分詞從句子中提煉出來。

         這裡有個分詞演算法的PPT,點選下載

         感興趣的朋友可以仔細研究下他們是做分詞系統出了名了,我們可以借鑑其中的方法,如圖:

         當我們把分詞提煉出來了,我們就可以進行最大的匹配了---也就是模糊查詢,我把它分為了兩步,一就是進行整句模糊查詢,因為可以儘可能的保留全句的意思:

         例如:select * from QY where question like "*地球*的*半徑*是*多少*"

         這樣就能從知識庫中查到更多關聯的問題了,也有更多的答案選擇!

         如我們可以查到:你知道地球的半徑是多少嗎? 等很多包含整句的問題!

         當然如果資料庫中完全沒有完全匹配的問題,那麼可以提出關鍵詞,我的方法是分詞最長原則!

         如:地球/的/半徑/是/多少?

         其中[地球] [半徑] [多少]就是裡面的最長關鍵詞,我們可以設計演算法,通過組合來匹配!

         例如:可以把[地球][半徑]組合在一起

         select * from QY where question like "*地球*半徑*"

         這樣即使全句模糊匹配找不到也能找到,當然這樣的組合就要看你的程式是怎麼寫的,當然組合的要求要符合程式的特點,如果組合次數過於大多會影響程式的反應速度!所以最合理的組合能提高程式的使用性!當然如果經過這三個步驟沒有相關匹配問題,我的小D就不能回答你所提出的問題了!它會很老實的回答:“我不知道?”等意思!

         這裡要強調個技巧,比如在匹配問題的時候很可能會檢索到很多的答案,這時候我們可以設計個隨機選擇函式,任意性的選擇答案,那樣程式就比較人性化了?比如你問到:“你吃飯沒?” 那麼它可以回答“吃了” “沒有” “我不吃飯”    

        而不是單一的回答。。。

        我只是簡要的談到了聊天程式設計的方法,當然這和那些真正專業的程式比較起來還是有很大的差距,如果你只是做來玩玩,以上這些就足夠了,比如現在我在小D的程式裡應用了縮句的方法,這也只是想提高它分析問題的能力,如果朋友你真想在智慧聊天方面繼續深究,那麼就要下更大的工夫了。