久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

構(gòu)建自己的智能聊天機(jī)器人

 加富婆 2016-08-16

The answer to life, universe and everything is 42 --deepThought

今年的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ò)的

ChatterBot

ChatterBot是一個(gè)基于機(jī)器學(xué)習(xí)的聊天機(jī)器人引擎,構(gòu)建在python上,可以從已有的對(duì)話中學(xué)習(xí), 該項(xiàng)目的設(shè)計(jì)允許它接入任何語(yǔ)言

原理

一個(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)用戶輸入的呢,?首先從已知句子中匹配出與用戶輸入最相近的句子(如何衡量相近, 大家可以想想),之后找到最有可能的回復(fù),那么如何得出最有可能的回復(fù)呢,?由所有和機(jī)器交流過(guò)的人們,,對(duì)這個(gè)輸入問(wèn)題(匹配過(guò)的)的各個(gè)回答的頻率決定

安裝和使用

安裝

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 使用 JsonDatabaseAdapter作為storage adapter,使用 ClosestMatchAdapter 作為 logic adapter, 使用 VariableInputTypeAdapter 作為 input adapter

只讀模式

chatbot = ChatBot('wwjtest', read_only=True) //否則bot會(huì)學(xué)習(xí)每個(gè)輸入

創(chuàng)建自己的訓(xùn)練類

chatterbot/training

創(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)存在./database.db(參考jsondatabase.py),不是sqlite數(shù)據(jù)庫(kù),實(shí)際是jsondb,,對(duì)json做了封裝(參考jsondb/db.py

算法相關(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è)字符,。(引用自維基百科)

從上述描述我們可以看出,這種算法適用于任何文字,,而且我們使用process.extract時(shí),使用中文不會(huì)影響相似度度量的準(zhǔn)確性,。當(dāng)然我們也可以看出這種算法的缺陷,它無(wú)法理解語(yǔ)義的相似性,,甚至連同義詞都完全無(wú)法處理,。這是一個(gè)十分明顯的短板,有必要重新實(shí)現(xiàn)一套度量文本相似的logic adapter

from fuzzywuzzy import fuzzfuzz.ratio(u'你好', u'你好!') #80 fuzz.ratio(u'你好', u'你好') #100

其他算法

time_adapter.py中用到樸素貝葉斯:from textblob.classifiers import NaiveBayesClassifier,,這里也是目前唯一一處引用textblob的地方

接受的數(shù)據(jù)很簡(jiǎn)單,,形如[('what time is it', 1), xxx, xxx,...]

nltk的使用

目前主要用了nltk的word_tokenizewordnetstopwords

todo

  • 使這個(gè)項(xiàng)目能更適合訓(xùn)練中文語(yǔ)料庫(kù)
  • 用其他的文本相似算法寫一個(gè)logic adapter
  • 加入中文的停用詞等(取代nltk的停用詞)
  • 使用snownlp和jieba替代既有依賴(nltk和textblob)
  • fork這個(gè)項(xiàng)目,,采用它的架構(gòu),,重寫一個(gè)更適合中文的

聊天語(yǔ)料庫(kù)

聊天語(yǔ)料涉及隱私,網(wǎng)上幾乎沒(méi)有公開(kāi)的中文語(yǔ)料,,我們開(kāi)腦洞:

  • siri對(duì)小冰(用wechat api是對(duì)話可編程)
  • 柏拉圖《對(duì)話錄》
  • 論語(yǔ)

ChatterBot本身支持python2/python3,,如果要使用中文,目前只支持python2

Python2中文問(wèn)題出在:

statement_list = self.context.storage.get_response_statements()

得到的statement_list是編碼錯(cuò)誤的句子列表(編解碼問(wèn)題)

解決思路可以參考我的這篇博客:編碼相關(guān)的筆記

結(jié)語(yǔ)

當(dāng)前這個(gè)項(xiàng)目給出了一個(gè)漂亮的bot骨架,,插件式的設(shè)計(jì),,十分利于插入強(qiáng)大的功能,,這也是這個(gè)項(xiàng)目中我最喜歡的地方,就chat bot功能而言,,功能比較簡(jiǎn)單,、清晰

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多