弱弱開發女子 / 機器學習虛心學系列

用 Jupyter Notebook 示範 — 打造最簡單的聊天機器人

使用 Scikit-learn 的單純貝氏分類器快速建置聊天機器人

Yijhen L.
Yijhen L.
Nov 6, 2019 · 6 min read
Image for post
Image for post
Photo by Alex Knight on Unsplash

聊天機器人ChatBot)是經由對話或文字進行交談的電腦程式,能夠模擬人類對話,達到閒聊、零售行銷、客服等目的。有些聊天機器人還能夠連結外部資料庫,提供使用者新聞、天氣、股價等資訊。目前聊天機器人已經廣泛使用在即時通訊軟體,這些即時通訊平台如 Facebook 或 Line 亦提供易於整合的 webhook,使第三方開發商能直接打造 Facebook 或 Line 機器人,輕鬆應用在自家的服務。許多餐飲業、旅遊業、航空業,你想的到的服務業都已推出自家的聊天機器人,以便與終端消費者進行交流。


本篇將用 Jupyter Notebook 示範,使用 Scikit-learn單純貝氏分類器 (Naive Bayes classifier) 打造一個最簡單的聊天機器人,核心的實作代碼50行都不到,理解也只需要數分鐘而已。

概念

市場上提供聊天機器人的服務略有三種運作方式:

  1. 背後的聊天機器人其實是人類,一種線上客服的概念
  2. 基於規則的模型 (Rule-based model)
  3. 基於檢索的模型 (Retrieval-based model)

其實還有一種時常在學術研究界討論的生成模型 (Generative model),不過生成模型技術門檻高,且需要大量的訓練資料,生成出來的語句或答覆可能語法錯誤,讓人無法理解。而像一般服務業在客服應對處理幾乎有一套常見問題集 (FAQs),其實只要能把握會被問到怎樣的問題,以及搭配好相對應的回答,通過上述三種運作方式,都可以達到聊天機器人的效果。

本篇文章介紹的是基於檢索的模型 (Retrieval-based model),也是市面上普遍被採用的做法。我們可以先假想一些可能被問到的問題,或使用者可能會跟你說什麼話,接著設定聊天機器人要應對的句子或答案。

這次我們拿餐飲業的聊天機器人做例子。客人面向餐廳客服,可能想問:

  • 幾點開始營業?
  • 餐廳位在哪裡?

每位客人問的問題當然不會都長得像上面兩句那樣,多得是其他種說法,但由人類來看就知道意思都是一樣的。

  • 幾點開始營業?/ 餐廳幾點開?/ 餐廳的營業時間是幾點? /⋯⋯
  • 餐廳位在哪裡?/ 餐廳在哪?/ 餐廳地點是什麼?/ 餐廳位置?/⋯⋯

這個部分叫做準備訓練資料。事前蒐集所有問題的句子,並給上標籤。標記標籤 (label) 也可以說是給定一個類別 (class) 或意圖 (intent)。

事前蒐集所有問題的句子,並給上標籤。標記標籤 (label) 也可以說是給定一個類別 (class) 或意圖 (intent)。
事前蒐集所有問題的句子,並給上標籤。標記標籤 (label) 也可以說是給定一個類別 (class) 或意圖 (intent)。
蒐集訓練資料 Image by Yijhen L.

訓練資料備妥後,接著去計數每個詞彙出現的次數。這樣子去數句子裡出現的詞彙跟次數,通稱詞袋模型 (Bag-of-words model),利用詞彙所出現的頻率表示句子或文件本身的特徵,進而判斷該句子或文件屬於哪一個類別。

訓練資料備妥後,接著去計數每個詞彙出現的次數。這樣子去數句子裡出現的詞彙跟次數,通稱詞袋模型 (Bag-of-words model),利用詞彙所出現的頻率表示句子或文件本身的特徵,進而判斷該句子或文件屬於哪一個類別。
訓練資料備妥後,接著去計數每個詞彙出現的次數。這樣子去數句子裡出現的詞彙跟次數,通稱詞袋模型 (Bag-of-words model),利用詞彙所出現的頻率表示句子或文件本身的特徵,進而判斷該句子或文件屬於哪一個類別。
詞袋模型 (Bag-of-words model) Image by Yijhen L.

然後現在問一個問題,打個比方,假設使用者問了:「你知道餐廳地點在哪裡嗎?」。我們去計數這個問題出現的詞彙跟頻率得到下面這個向量:

{ “餐廳”:1

“地點”:1

“哪裡”:1}

將這個向量與方才從訓練資料得到的向量集(或稱 dictionary/hash/vector) 做交叉比對,根據相似度最高的配對決定這個問題應該被歸屬到哪一個標籤/類別/意圖。比對過程就是些數學公式進行相似度計算,認真的朋友可以在文章底下附上的參考連結深入了解B-)

將這個向量與方才從訓練資料得到的向量集(或稱 dictionary/hash/vector) 做交叉比對,根據相似度最高的配對決定這個問題應該被歸屬到哪一個標籤/類別/意圖。
將這個向量與方才從訓練資料得到的向量集(或稱 dictionary/hash/vector) 做交叉比對,根據相似度最高的配對決定這個問題應該被歸屬到哪一個標籤/類別/意圖。
相似度計算 Image by Yijhen L.

最後我們得知這個問題被分類到譬如「label_餐廳地點」這個類別,接著在聊天機器人的應答介面裡回覆使用者對應的答案即可。

問題被分類到譬如「label_餐廳地點」這個類別,接著在聊天機器人的應答介面裡回覆使用者對應的答案即可。
問題被分類到譬如「label_餐廳地點」這個類別,接著在聊天機器人的應答介面裡回覆使用者對應的答案即可。
問題所屬的標籤/類別,回覆對應的答案 Image by Yijhen L.

代碼

Training Phrases for Chatbot
Imports for Chatbot
Training for Chatbot

Scikit-learn 的樸素貝葉斯

Scikit-learn 支援四種樸素貝葉斯/單純貝式分類器 (Naive Bayes classifier) 的算法,分別為 BernoulliNBGaussianNBMultinomialNBComplementNB

這四種分類器適用的分類場景各不相同。一般而言,若樣本特徵是連續值,使用 GaussianNB 較佳。若樣本特徵是離散的(例如文本分類的字數統計),使用 MultinomialNB 較為合適。BernoulliNB 和 MultinomialNB 同樣適用於離散資料,但 MultinomialNB 適用在文本的字數出現次數,而 BernoulliNB 是為二進制/布林資料類型的數據所設計的。ComplementNB 是從 MultinomialNB 發展出來適用在資料特別稀疏的情境上。

Prediction for Chatbot
>> predictionsarray(['where_is_the_restaurant'], dtype='<U23')
Precision and Recall

參考連結

Image for post
Image for post
https://www.buymeacoffee.com/cC8qlLt

Notes about data science/engineering, machine learning, and…

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store