今年的F8 開(kāi)發(fā)者大會(huì),Facebook大談他們看好聊天機(jī)器人的未來(lái) ,。通過(guò)這些聊天機(jī)器人,,用戶可以在交談中完成許多任務(wù),,在線購(gòu)物,,航班查詢,、組織會(huì)議等,。如此一來(lái),,用戶再不必下載一堆a(bǔ)pp,而只需打開(kāi)一個(gè)簡(jiǎn)單的文本對(duì)話框,你就可以對(duì)著它說(shuō):神燈神燈,,我的第三個(gè)愿望是我還要三個(gè)愿望 你是不定想到了:hi siri 說(shuō)不定又是一次用戶入口的重新洗牌,,這樣就不難解釋科技界的大公司們蜂擁而至了 緣起我一直對(duì)自然語(yǔ)言處理(NLP)興致勃勃,這大半年對(duì)機(jī)器學(xué)習(xí)/深度學(xué)習(xí)興致盎然,而聊天機(jī)器人恰好結(jié)合了兩者,。 對(duì)聊天機(jī)器人最早的興趣可能追溯到大學(xué),。當(dāng)時(shí)關(guān)注過(guò)一段時(shí)間風(fēng)靡人人網(wǎng)的小黃雞,后來(lái)發(fā)現(xiàn)它只是調(diào)用了一個(gè)閉源的云服務(wù),,轉(zhuǎn)而折騰AIML,。 最近下班后喜歡到星巴克看看課程(近期在跟udacity的這門課:Deep Learning),寫寫博客,今天也是如此,,怕往后的時(shí)間會(huì)更多花在深度學(xué)習(xí)上(對(duì)RNN尤其感興趣),,這幾天陸續(xù)對(duì)折騰過(guò)的聊天機(jī)器人做個(gè)筆記 聊天機(jī)器人 & 開(kāi)源框架目前聊天這塊的云服務(wù)倒是不少,facebook也好微軟也好,,都有自己的框架,。相比而言,開(kāi)源的項(xiàng)目倒是沒(méi)有很耀眼的,,也許是起步不久的原因,,大神們還在憋大招。 我們到github逛一圈,,發(fā)現(xiàn)ChatterBot看起來(lái)挺酷, 項(xiàng)目活躍, 文檔清晰,,代碼也算干凈利落。 由于項(xiàng)目還小,,源碼讀起來(lái)十分容易,,作為構(gòu)建自己的智能聊天機(jī)器人的腳手架是不錯(cuò)的 ChatterBotChatterBot是一個(gè)基于機(jī)器學(xué)習(xí)的聊天機(jī)器人引擎,構(gòu)建在python上,可以 原理一個(gè)未經(jīng)訓(xùn)練的ChatterBot機(jī)器人,并沒(méi)有與用戶交談所需的知識(shí)。每當(dāng)用戶輸入一句話,,機(jī)器人將存下它,,同時(shí)也存下答復(fù)的句子。 隨著機(jī)器人接受的輸入的增加,,它能夠回答的問(wèn)題的數(shù)量和準(zhǔn)確度都會(huì)相應(yīng)提升.程序是如何響應(yīng)用戶輸入的呢,?首先從已知句子中匹配出與用戶輸入最相近的句子(如何衡量 安裝和使用安裝pip install chatterbot 基本使用from chatterbot import ChatBotfrom chatterbot.training.trainers import ChatterBotCorpusTrainerchatbot = ChatBot('myBot')chatbot.set_trainer(ChatterBotCorpusTrainer)# 使用英文語(yǔ)料庫(kù)訓(xùn)練它chatbot.train('chatterbot.corpus.english')# 開(kāi)始對(duì)話 chatbot.get_response('Hello, how are you today?') 采用中文語(yǔ)料庫(kù)我已經(jīng)給這個(gè)填充了中文語(yǔ)料庫(kù),作者把我的提交合并到master了,目前還沒(méi)有打包發(fā)布到pypi,,如果你想使用默認(rèn)的中文預(yù)料來(lái)訓(xùn)練你需要這樣做: https://github.com/gunthercox/ChatterBotpip3 install./ChatterBot # 需要使用python3,,否則會(huì)有unicode問(wèn)題,,暫時(shí)沒(méi)空做python2的兼容 使用中文語(yǔ)料庫(kù)來(lái)訓(xùn)練機(jī)器人 from chatterbot import ChatBotfrom chatterbot.training.trainers import ChatterBotCorpusTrainerdeepThought = ChatBot('deepThought')deepThought.set_trainer(ChatterBotCorpusTrainer)# 使用中文語(yǔ)料庫(kù)訓(xùn)練它deepThought.train('chatterbot.corpus.chinese') # 語(yǔ)料庫(kù) 開(kāi)始玩耍print(deepThought.get_response('很高興認(rèn)識(shí)你'))print(deepThought.get_response('嗨,,最近如何?'))print(deepThought.get_response('復(fù)雜優(yōu)于晦澀')) #語(yǔ)出 The Zen of Pythonprint(deepThought.get_response('面對(duì)模棱兩可,拒絕猜測(cè)的誘惑.'))# print(deepThought.get_response('生命,、宇宙以及世間萬(wàn)物的終極答案是什么?')) FAQ(非官方)默認(rèn)配置默認(rèn)情況下, ChatterBot 使用 只讀模式
創(chuàng)建自己的訓(xùn)練類創(chuàng)建自己的adapters參考默認(rèn)使用的ClosestMatchAdapter,、VariableInputTypeAdapter即可 諸如我們可以寫一個(gè)輸入/輸出 adapters,對(duì)接到微信(我偏好werobot) io的一個(gè)案例是chatterbot-voice(使用方法參考examples/example.py),這個(gè)adapters讓我們可以使用語(yǔ)音與我們的機(jī)器人溝通,,原理很簡(jiǎn)單,,我此前折騰過(guò)BaiduYuyin,國(guó)內(nèi)用戶可以使用它 案例參考examples ,,案例中已經(jīng)有很多種機(jī)器人了 訓(xùn)練好的模型如何分發(fā)訓(xùn)練好的數(shù)據(jù),,默認(rèn)存在 算法相關(guān)默認(rèn)情況下,,使用 ClosestMatchAdapter 作為 logic adapter ,用來(lái)找出與用戶輸入最接近的一句話 核心代碼為: from fuzzywuzzy import processclosest_match, confidence = process.extract( input_statement.text, text_of_all_statements, limit=1)[0] 這里我們用到了fuzzywuzzy,,具體用法參考fuzzywuzzy#process fuzzywuzzy用于計(jì)算句子直接的相似度,,采用的字符串相似度算法為 Levenshtein Distance(編輯距離算法) Levenshtein Distance編輯距離,又稱Levenshtein距離(也叫做Edit Distance),,是指兩個(gè)字串之間,,由一個(gè)轉(zhuǎn)成另一個(gè)所需的最少編輯操作次數(shù),如果它們的距離越大,,說(shuō)明它們?cè)绞遣煌?。許可的編輯操作包括將一個(gè)字符替換成另一個(gè)字符,插入一個(gè)字符,,刪除一個(gè)字符,。(引用自維基百科) 從上述描述我們可以看出,這種算法適用于任何文字,,而且我們使用 from fuzzywuzzy import fuzzfuzz.ratio(u'你好', u'你好!') #80 fuzz.ratio(u'你好', u'你好') #100 其他算法time_adapter.py中用到樸素貝葉斯: 接受的數(shù)據(jù)很簡(jiǎn)單,,形如 nltk的使用目前主要用了nltk的 todo
聊天語(yǔ)料庫(kù)聊天語(yǔ)料涉及隱私,網(wǎng)上幾乎沒(méi)有公開(kāi)的中文語(yǔ)料,,我們開(kāi)腦洞:
坑ChatterBot本身支持python2/python3,,如果要使用中文,目前只支持python2 Python2中文問(wèn)題出在:
得到的 解決思路可以參考我的這篇博客:編碼相關(guān)的筆記 結(jié)語(yǔ)當(dāng)前這個(gè)項(xiàng)目給出了一個(gè)漂亮的bot骨架,,插件式的設(shè)計(jì),,十分利于插入強(qiáng)大的功能,,這也是這個(gè)項(xiàng)目中我最喜歡的地方,就chat bot功能而言,,功能比較簡(jiǎn)單,、清晰 |
|