摘要:使用圖靈機器人訓(xùn)練之前在對比聊天機器人實現(xiàn)方案的時候,我試用過圖靈機器人,他們號稱中文語境下智能渡最高的機器人大腦。
上一篇 一小時搭建微信聊天機器人 介紹了如何搭建一個可用的聊天機器人,但是和機器人聊完你會發(fā)現(xiàn),聊天機器人實在是太傻了,來回就那么幾句。這是因為我們給聊天機器人的數(shù)據(jù)太少,他只能在我們給的訓(xùn)練集中找它認為最合適的。那么,如何導(dǎo)入更多的訓(xùn)練數(shù)據(jù)呢?
我能想到最簡單的方法是找對話的數(shù)據(jù),然后把這些數(shù)據(jù)作為訓(xùn)練數(shù)據(jù)訓(xùn)練機器人。
感謝 candlewill 已經(jīng)收集好了大量的訓(xùn)練數(shù)據(jù),dialog_corpus https://github.com/candlewill/Dialog_Corpus 。
這個庫中包含電影臺詞、中英文短信息、自然語言處理相關(guān)的數(shù)據(jù)集、小黃雞語料等。這里我選擇電影臺詞語料。
chatterbot 訓(xùn)練邏輯處理模塊語料地址為:dgk_lost_conv:https://github.com/rustch3n/dgk_lost_conv
這個模塊提供訓(xùn)練機器人的方法,chatterbot自帶了通過輸入list來訓(xùn)練(["你好", "你好啊"] 后者是前者的回答)以及通過導(dǎo)入Corpus格式文件來訓(xùn)練的方式。
這里我們選擇使用第一種,通過輸入list來訓(xùn)練機器人。
處理訓(xùn)練數(shù)據(jù)首先下載數(shù)據(jù)集:
wget https://codeload.github.com/rustch3n/dgk_lost_conv/zip/master # 解壓 $ unzip dgk_lost_conv-master.zip
我們先打開一個文件看下數(shù)據(jù)結(jié)構(gòu):
E M 你得想想辦法 我弟弟是無辜的 M 他可是美國公民啊 M 對此我也無能為力 M 你當然能 M 再去犯罪現(xiàn)場看看 定能證實清白 M 你看 我不過是個夜間辦事員而已 M 你若真想解決問題 M 最好等領(lǐng)事來 M 他早上才上班 M 我很抱歉 E M 那我自己來搞定 M 你兄弟 M 關(guān)在哪個監(jiān)獄? M 索納監(jiān)獄 E M 怎么了? M 那里關(guān)的都是最窮兇極惡的罪犯 M 別的監(jiān)獄都不收
.conv 語料文件中:E 是分隔符 M 表示會話。因為我是使用輸入list 的方式訓(xùn)練數(shù)據(jù),這時我可以以分隔符E為分隔,將一段對話放入一個list中,那么上述例子中的訓(xùn)練數(shù)據(jù)應(yīng)該被格式化為:
convs = [ [ "你得想想辦法 我弟弟是無辜的", "他可是美國公民啊", "對此我也無能為力", "你當然能", "再去犯罪現(xiàn)場看看 定能證實清白", "你看 我不過是個夜間辦事員而已", "你若真想解決問題", "最好等領(lǐng)事來", "他早上才上班", "我很抱歉" ], [ "那我自己來搞定", "你兄弟", "關(guān)在哪個監(jiān)獄?", "索納監(jiān)獄", ], [ "怎么了?", "那里關(guān)的都是最窮兇極惡的罪犯", "別的監(jiān)獄都不收", ] ]
導(dǎo)入訓(xùn)練數(shù)據(jù)的腳本如下:
from chatterbot import ChatBot from chatterbot.trainers import ListTrainer # 初始化聊天機器人 momo = ChatBot( "Momo", storage_adapter="chatterbot.storage.MongoDatabaseAdapter", # 使用mongo存儲數(shù)據(jù) logic_adapters=[ # 指定邏輯處理模塊 "chatterbot.logic.BestMatch", "chatterbot.logic.MathematicalEvaluation", "chatterbot.logic.TimeLogicAdapter", ], input_adapter="chatterbot.input.VariableInputTypeAdapter", output_adapter="chatterbot.output.OutputAdapter", database="chatterbot", # 指定數(shù)據(jù)庫 read_only=True ) # 讀取.conv 數(shù)據(jù)文件,因為我服務(wù)器配置較低,所以選擇了一個內(nèi)容較少的文件 # 這個函數(shù)是一個生成器 def read_conv(filename="prisonb.conv"): with open(filename, "rt") as f: conv = [] # 逐行讀取 for line in f: _line = line.replace(" ", "").strip() # 預(yù)處理字符串 去掉首位空格 if _line == "E": # 如果是分隔符 表示對話結(jié)束 返回對話列表 yield conv conv = [] # 重置對話列表 else: # 不是分隔符則將內(nèi)容加入對話列表 c = _line.split()[-1] # 其實這里如果對話中包含空格 對話數(shù)據(jù)會不完整,應(yīng)該只去掉M和開頭的空格 conv.append(c) def traine_momo(): for conv in read_conv(): print(conv) momo.set_trainer(ListTrainer) # 指定訓(xùn)練方式 momo.train(conv) # 訓(xùn)練數(shù)據(jù) def main(): traine_momo() if __name__ == "__main__": main()
這個腳本比較簡單,只是簡單的將數(shù)據(jù)從對話文件中讀取出來,然后拼接為對話列表輸入聊天機器人。
由于這里對話大部分都是多行數(shù)據(jù),聊天機器人匹配結(jié)果時運算量會大幅提升,我單核cpu的服務(wù)器在導(dǎo)入一個700k 的語料文件后每次聊天都會讓cpu飚到100%!?? 無奈之下只能刪掉大半數(shù)據(jù)。
對話示例如圖:
導(dǎo)入電影臺詞后,雖然訓(xùn)練數(shù)據(jù)大幅提升,但是你會發(fā)現(xiàn)聊天機器人開始答非所問了,這是因為聊天數(shù)據(jù)噪音太大,對白也有點問題。
使用圖靈機器人訓(xùn)練之前在對比聊天機器人實現(xiàn)方案的時候,我試用過 圖靈機器人,他們號稱中文語境下智能渡最高的機器人大腦。他們的對話比我自己的搭建的靠譜很多,那么我們是不是可以利用一下他的數(shù)據(jù)呢?
我的方案是這樣的,在圖靈機器人新建兩個機器人教練A 和 教練B,讓兩個機器人互相對話,然后把訓(xùn)練數(shù)據(jù)導(dǎo)入chatterbot。
打開 http://www.tuling123.com,注冊賬號
新建兩個機器人(免費用戶最多可以創(chuàng)建5個,每個機器人每天最多請求5000次)
調(diào)用對話API,讓兩個機器人互相聊天
建好機器人后的界面:
訓(xùn)練示例代碼如下:
# tuling_trainer.py import sys from time import sleep from chatterbot import ChatBot from chatterbot.trainers import ListTrainer import requests API_URL = "http://www.tuling123.com/openapi/api" API_KEY0 = "" # 機器人1 的key API_KEY1 = "" # 機器人2 的key # 初始化chatterbot momo = ChatBot( "Momo", storage_adapter="chatterbot.storage.MongoDatabaseAdapter", logic_adapters=[ "chatterbot.logic.BestMatch", "chatterbot.logic.MathematicalEvaluation", "chatterbot.logic.TimeLogicAdapter", ], input_adapter="chatterbot.input.VariableInputTypeAdapter", output_adapter="chatterbot.output.OutputAdapter", database="chatterbot", read_only=True ) # 請求圖靈機器人接口 def ask(question, key, name): params = { "key": key, "userid": name, "info": question, } res = requests.post(API_URL, json=params) result = res.json() answer = result.get("text") return answer def A(bsay): # 打印 A 和 B 的對話內(nèi)容 print("B:", bsay) answer = ask(bsay, API_KEY0, "momo123") print("A:", answer) return answer def B(asay): print("A:", asay) answer = ask(asay, API_KEY1, "momo456") print("B", answer) return answer def tariner(asay): momo.set_trainer(ListTrainer) # 設(shè)置處理方式 while True: # 兩個機器人訓(xùn)練的主循環(huán) conv = [] conv.append(asay) # 先把 A 說的第一句加入到對話列表 bsay = B(asay) # A 先問 B conv.append(bsay) # 將B 的回答加入到對話列表 momo.train(conv) # 將對話用于訓(xùn)練 print(conv) conv = [] conv.append(bsay) # 用B的對話 去問 A 步驟和上述方式一致 asay = A(bsay) conv.append(asay) momo.train(conv) print(conv) sleep(5) # 控制頻率 def main(asay): tariner(asay) if __name__ == "__main__": main(*sys.argv[1:]) # 接收參數(shù)作為開始的第一句話 # 執(zhí)行腳本 # python tuling_trainer.py 你好?
使用圖靈聊天機器人訓(xùn)練的時候是需要監(jiān)測的,因為如果兩個機器人說的內(nèi)容一樣的時候,機器人可能會一直重復(fù)同一句話,直到調(diào)用次數(shù)耗盡,你需要看一下兩個機器人的對話是否陷入了僵局。
當然也可以在程序中加入判斷,先多設(shè)定幾個開始打招呼的句子,如果一句話連續(xù)出現(xiàn)多次的時候,換下一個句子糾正他們。
以下是我訓(xùn)練了兩天之后的結(jié)果:
雖然還是答非所問,但是已經(jīng)比之前像樣了。
圖靈聊天機器人免費版每天可調(diào)用5000 次,如果覺得次數(shù)太少可以多新建幾個輪流使用
聊天機器人的配置及訓(xùn)練方式就到這里了,接下來介紹個更實用的功能,如何讓微信公號變成圖床。
如何讓微信公號化身圖片上傳助手在使用 markdown 格式來寫文章的過程中,發(fā)現(xiàn)圖片地址是一個比較麻煩的事情,每次貼圖獲取圖片URL都是一個比較麻煩的過程。
以我使用的七牛為例,獲取圖片地址的步驟如下:
登錄七牛網(wǎng)站,打開存儲空間>內(nèi)容管理
上傳文件
返回內(nèi)容管理找到剛才上傳的文件,獲取外鏈
按照這個步驟上傳一張圖片至少耗時半分鐘。
那能不能簡化這個步驟呢?
答案是可以!
微信公號是可以發(fā)送圖片消息的,我的做法是
將圖片發(fā)送到公號
服務(wù)器獲取觸發(fā)圖片消息的處理邏輯> 將圖片使用七牛提供的第三方資源抓取API另存到,七牛存儲空間
將設(shè)定好的圖片地址返回給微信,發(fā)送到公號消息對話中
示例如下圖所示:
實現(xiàn)步驟注冊個七牛賬號
新建存儲空間
在個人中心秘鑰管理獲取 AccessKey 和 SecreKey
pip install qiniu
代碼實現(xiàn)如下:
# media.py # 圖片抓取邏輯處理 from qiniu import Auth, BucketManager from momo.settings import Config def qiniu_auth(): access_key = str(Config.QINIU_ACCESS_TOKEN) secret_key = str(Config.QINIU_SECRET_TOKEN) auth = Auth(access_key, secret_key) return auth def media_fetch(media_url, media_id): """抓取url的資源存儲在庫""" auth = qiniu_auth() bucket = BucketManager(auth) bucket_name = Config.QINIU_BUCKET # 存儲空間名稱 ret, info = bucket.fetch(media_url, bucket_name, media_id) # 參數(shù)依次是第三方圖片地址,空間名稱,目標文件名 if info.status_code == 200: return True, media_id # 如果上傳成功,返回文件名 return False, None
抓取第三方圖片文檔地址為:第三方資源抓取 https://developer.qiniu.com/kodo/api/1263/fetch。
微信圖片消息處理邏輯代碼:
class WXResponse(_WXResponse): def _image_msg_handler(self): media_id = self.data["MediaId"] picurl = None if not picurl: picurl = self.data["PicUrl"] # 從消息中獲取圖片地址 is_succeed, media_key = media_fetch(picurl, media_id) # 使用圖片抓取接口將圖片存儲到七牛并獲取圖片文件名 if is_succeed: qiniu_url = "{host}/{key}".format(host=Config.QINIU_HOST, key=media_key) # 拼接圖片地址 else: qiniu_url = "圖片上傳失敗,請重新上傳" self.reply_params["content"] = qiniu_url # 返回圖片地址 self.reply = TextReply(**self.reply_params).render()
代碼已開源道github,詳細代碼邏輯參考 gusibi/momo: https://github.com/gusibi/momo/tree/chatterbot
歡迎試用體驗:
請不要上傳高清圖片,微信會壓縮損壞圖片質(zhì)量
也不要上傳太個人的圖片,畢竟內(nèi)容我能看到
總結(jié)這一篇主要提供了兩個訓(xùn)練 chatterbot 的思路,以及使用公號作為圖片上傳客戶端提高上傳圖片的效率的解決方法。
接下來公號還是繼續(xù)開發(fā),準備給公號加一個記賬功能,促使自己養(yǎng)成記賬的習慣。
下一篇的公號DIY 將介紹 記賬的功能設(shè)計以及實現(xiàn)思路。
最后,感謝女朋友支持。
歡迎關(guān)注(April_Louisa) | 請我喝芬達 |
---|---|
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/38702.html
摘要:然后又介紹了基于的公號賬本應(yīng)用的數(shù)據(jù)庫設(shè)計。歡迎關(guān)注公號四月試用。 前兩篇 微信公號DIY 系列: 微信公號DIY:一小時搭建微信聊天機器人 微信公號DIY:訓(xùn)練聊天機器人&公號變身圖片上傳工具 介紹了如何使用搭建&訓(xùn)練聊天機器人以及讓公號支持圖片上傳到七牛,把公號變成一個七牛圖片上傳客戶端。這一篇將繼續(xù)開發(fā)公號,讓公號變成一個更加實用的工具賬本(理財從記賬開始)。 代碼: 項目代...
摘要:然后又介紹了基于的公號賬本應(yīng)用的數(shù)據(jù)庫設(shè)計。歡迎關(guān)注公號四月試用。 前兩篇 微信公號DIY 系列: 微信公號DIY:一小時搭建微信聊天機器人 微信公號DIY:訓(xùn)練聊天機器人&公號變身圖片上傳工具 介紹了如何使用搭建&訓(xùn)練聊天機器人以及讓公號支持圖片上傳到七牛,把公號變成一個七牛圖片上傳客戶端。這一篇將繼續(xù)開發(fā)公號,讓公號變成一個更加實用的工具賬本(理財從記賬開始)。 代碼: 項目代...
摘要:最近借用了女朋友的公號,感覺如果只是用來發(fā)文章,太浪費微信給提供的這些功能了。想了想,先從最簡單的開始,做一個聊天機器人吧。是一款接口的,基于一系列規(guī)則和機器學習算法完成的聊天機器人。 最近借用了女朋友的公號,感覺如果只是用來發(fā)文章,太浪費微信給提供的這些功能了。想了想,先從最簡單的開始,做一個聊天機器人吧。 使用Python實現(xiàn)聊天機器人的方案有多種:AIML、chatterBot以...
閱讀 996·2023-04-25 14:45
閱讀 2773·2021-09-30 09:59
閱讀 3114·2021-09-22 15:48
閱讀 2425·2019-08-30 15:55
閱讀 3467·2019-08-30 15:44
閱讀 535·2019-08-29 14:07
閱讀 3412·2019-08-26 13:45
閱讀 536·2019-08-26 11:31