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」來計算詞的權重

OKapi BM25

將一個句子分成了很多個「詞」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生成器

Readme
Source Code

Seq2Seq Chatbot

REF

AI Scholar: Chatbots that improve after deployment

https://towardsdatascience.com/ai-scholar-chatbots-that-improve-after-deployment-deaef4f91379

Last updated