arduinowifi.send怎么获取响应_ChatterBot代码解读-获取对话
這個過程比較復制,安裝處理的流程,依次進行代碼解讀。
在定義一個ChatBot后,可以進行對話的訓練,這個過程參考:
水中的魚:ChatterBot代碼解讀-訓練數據?zhuanlan.zhihu.com然后就是用如下的代碼,獲取對話的響應:
response = chatbot.get_response('How are you doing today?')。
一. 構造Statement類的對象.
get_response函數中,從75-100行,主要是構造Statement類的對象。類的定義在chatterbot/conversation.py文件中。
第75行的代碼有點繞,這里詳細講解下。
self.storage是ChatBot類初始化時指定的存儲適配器,這里以SQLStorageAdapter為例。SQLStorageAdapter類的定義在chatterbot/storage/sql_storage.py文件中。
self.storage.get_object('statement')應該是調用SQLStorageAdapter類的get_object函數。但是sql_storage.py文件中并找不到get_object函數的定義。
怎么辦呢?
熟悉類的繼承特性的話,可能會想到是否在父類中定義的呢?這里介紹pycharm的一個技巧,選中SQLStorageAdapter,然后按ctrl+H,可以看到類的繼承關系。這樣避免需要逐層尋找。
在chatterbot/storage/storage_adapter.py中,get_object的代碼:
返回的是一個函數,函數的名字是get_%s_object拼裝的,值為“get_statement_object”。
在看get_statement_object函數,返回值為一個Statement對象。
這里有讀者可能會提問:干嘛不直接import Statement,而采用這種復雜的動態獲取的方式呢?
恭喜你,提了一個不錯的問題,善于提問,成長的快。
采用動態獲取的方式,本意是對于不同的存儲適配器,定義不同的Statement類。但是本框架其實并沒有實現不同的Statement類。只是這里動態獲取的機制值得我們學習。當我們需要的時候,可以應用這種機制。
二. 對輸入進行預處理
elf.preprocessors包含了預處理的適配器列表。系統已經預置的適配器有:
clean_whitespace 去掉語句中連續的空白字符
unescape_html 將 html中的轉義字符變成對應的原字符,比如“<b>” 變成“<b>”.
convert_to_ascii 將unicode轉成對應的ASCII碼。
但是對于這個具體的ChatBot,使用那些預處理,要看初始化配置。
這里也可以看到要增加自定義的預處理適配器,只需要定義適配器函數,入參為Statement對象,出參也是Statement對象。
三.生成響應
具體是調用self.generate_response。
入參:input_statement是Statement對象,additional_response_selection_parameters是字典。
出參:Statement類的對象
具體過程如下:
對于每個邏輯適配器,依次調用適配器的process函數,獲得對應的輸出語句和置信度。將所有的輸出Statement對象保存到results列表中,result保存置信度最大的輸出Statement對象。
這里以BestMatch適配器來看process的處理過程。
四. BestMatch.process處理過程
BestMatch類的構造中中,excluded_words參數的作用,可以讓返回的語句包含這些詞,比如臟話。
process中第三個參數self.search_algorithm,系統定義了兩張搜索算法,默認采用IndexedTextSearch。
這里搜索過程描述參考第五步。假定已經完成查詢數據庫的搜索過程,并將結果保存在search_results中。接著的邏輯:
在search_results列表中查找置信度大于maximum_similarity_threshold(0.95),如果找到,就直接返回。
在search_results列表去掉之前已經使用過的答復(避免重復答復),然后id大小排序,找到最近的10條記錄。之前已經使用過的答復保存到Statement.conversation中,由于這里是單輪對話,系統并沒有記錄之前的對話的conversation,而是實現成通過參數傳入,也就是說這個機制其實沒有作用。
用additional_response_selection_parameters對search_results列表進行過濾操作。
對search_results列表中選擇一條記錄,選擇的策略有:get_most_frequent_response,get_first_response,get_random_response。默認采用get_first_response的方式。
如果search_results列表為空,就輸出默認的響應,對應的置信度為0.
五. 搜索算法的搜索過程
IndexedTextSearch.search,尋找和輸入語句最接近的語句列表,并按照置信度做升序排列。輸入語句作為pair對的上句,搜索的范圍也是數據庫中pair對中的上句。
搜索的過程是調用存儲適配器的filter函數,參數search_parameters是一個字典。這里就看SQLStorageAdapter.filter,搜索的過程其實就是查詢sql的語句。這用到了傳說中的ORM技術:Object-Relational Mapping,把關系數據庫的表結構映射到對象上。但是由誰來做這個轉換呢?所以ORM框架應運而生。在Python中,最有名的ORM框架是SQLAlchemy。
重要的部分是:
這里采用self.compare_statements計算置信度(也就是相似度)。入參是要對比的兩個statement對象。
相似度的算法,系統實現了:LevenshteinDistance,SpacySimilarity,JaccardSimilarity,默認值是LevenshteinDistance。
六.其他邏輯適配器
比如Time Logic Adapter ,Mathematical Evaluation Adapter?,其實現過程比較簡單。這里不詳述。
其實這里有個疑問:怎么根據業務需要,在這個框架中定制自己的處理邏輯適配器。比如根據用戶的輸入來執行一些命令,或調用其他在線聊天機器人的接口(比如turingapi)。
相信大家已經有自己的思路了。
總結
以上是生活随笔為你收集整理的arduinowifi.send怎么获取响应_ChatterBot代码解读-获取对话的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 50万大额存单利率是多少?2019年大额
- 下一篇: 手机来电秀怎么开启_360手机卫士怎么设