日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

arduinowifi.send怎么获取响应_ChatterBot代码解读-获取对话

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中的轉義字符變成對應的原字符,比如“&lt;b&gt;” 變成“<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代码解读-获取对话的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。