Chatbot (20%)
Chatbot Type
樣板式模型 (Rule-based model)
檢索式模型 (Retrieval-based model)
生成式模型 (Generative model)
樣板式模型 (Rule-based model)
if "天氣" in user.query:
chatbot.say("今天天氣真好")
檢索式模型 (Retrieval-based model)
維護問題與答案的配對:
Questions=q1,q2,……,qnQuestions=q1,q2,……,qn
Answers=a1,a2,……,an
「相似度」計算
用「TF * IDF」來計算詞的權重
將一個句子分成了很多個「詞」qi
,每個詞都會一個「IDF」分數,「f(qi,D)」指的是在 D
這篇文檔中,qi
這個詞一共出現了幾次,撇開停用詞不談,顯然一個詞在文章裡出現次數越多,他就顯得越重要。
到目前為止都是 TFIDF 的概念,BM25 引入了 b 與 k1 這兩個基於經驗調整的參數,兩者中 b 又會顯得重要些,從分母的地方能看出來,b 越大,文章長度就會顯得越重要,那為什麼要將文章長度列入考慮呢?我們可以這麼想,一個文章越長,它包含 qi
的機率就會越高,這樣對短文本就不太公平了,或許前者是一段冗長又包山包海的廢文,後者則是一針見血的精闢見解,所以 BM25 引入 b ,就是為了要懲罰這種情形。
REF: https://read01.com/zh-hk/kG8RON.html#.WtP7fohuaUk

REF: https://github.com/isnowfy/snownlp
from snownlp import SnowNLP
s = SnowNLP([[u'这篇', u'文章'],
[u'那篇', u'论文'],
[u'这个']])
s.sim([u'文章'])# [0.3756070762985226, 0, 0]
編輯距離
什麼是編輯距離,我們能想成句子 A 要變成句子 B 要「最少」改幾個字,好比說:
我要成為海賊王
我要成為火影
改一個字
---
我要成為海賊王
我要成為海火影
改兩個字
---
我要成為海賊王
我要成為海賊影
改三個字
---
我要成為海賊王
我要成為海賊王
那這兩個句子的編輯距離就是 3 ,我們會發現編輯距離越短,某種程度上「句型」會越相似(雖然主題就不一定了),也會發現這其實是個動態規劃問題,正因如此,我們就直接從應用層出發吧(?)
fuzzywuzzy,這是在 python 上基於萊文斯坦距離的實作,使用上非常直觀:
from fuzzywuzzy import fuzz
score = fuzz.ratio("this is a test", "this is a test!")
# score = 97
話又說回來了,剛剛不是說到這相似評估好像沒辦法涉及語意,沒錯,最基本的編輯距離是沒辦法,但如果把距離的定義從「字變成別的字」換成「詞變成別的詞的相似度差異」就又是另一回事了。
把檢索的目標從一個一個q_k
,換成某種對話的主題
,我們就能把文本分類的技巧套用到檢索式模型上。以經典的新聞分類來看:
訓練集(文本、標籤):
("小熊續留賽揚強投? 明年1月與艾瑞塔談延長合約","體育")
("韓推古裝劇花郎小鮮肉演員吸睛","娛樂")
......
當用戶說「今天洋基隊的比分是多少」,我們的聊天機器人就知道用戶是在講體育賽事,用技術的語言來說,用戶的「意圖」是問體育賽事,這個句子還有「洋基隊」、「今天」、「比分」這三個特徵,所以我們能這麼做:
query = "今天洋基隊的比分是多少"
class = classifier.classify(query)
handler = get_task_handler(class)
features = handler.extract_features(query)
response = handler.get_response(features)
chatbot.say(response)
明白了運作流程後,顯然能看出技術成分有兩處:「分類」與「特徵抽取」
語意圖
「這附近有什麼好吃的」為例 :
定義規則

(意圖是)飲食 -> (是想吃)食物 -> (想吃)飯 -> (因為附近跟地點有關,所以想找) 餐廳
歸納主題
User:這附近哪裏能買到泡沫紅茶?
Domains:{附近|近距離}、{哪裡|疑問}、{買到|購買}、{泡沫紅茶|飲料}
定義規則
{
"domain": "代表這個規則的抽象概念",
"response": [
"機器人給予的回覆"
],
"concepts": [
"要被比對向量的關鍵詞集"
],
"children": ["該規則的子規則們"]
}
生成式模型
Sequence to Sequence with Attention model
自 google 的論文發表後,用 Sequence to Sequence
來實現聊天機器人就成為一股熱潮,Github 上有不少像 DeepQA 看起來高完成度的應用。Sequence to Sequence
的基本概念是串接兩個 RNN/LSTM,一個當作編碼器,把句子轉換成隱含表示式,另一個當作解碼器,將記憶與目前的輸入做某種處理後再輸出,不過這只是最直觀的方式,其實解碼器還有很多種作法,如果想了解細節與效能上的差異,我推薦這篇文章。

Example
自製林鄭語言ai生成器
Seq2Seq Chatbot
REF
AI Scholar: Chatbots that improve after deployment
https://towardsdatascience.com/ai-scholar-chatbots-that-improve-after-deployment-deaef4f91379
Last updated