如何搭建一個智能客服(三):NLP 里實體信息的抓取與應用

前面兩篇說了用戶意圖拆分與識別,和基於此設計的多輪對話流程。這一篇接下去講自然語言處理(NLP)中實體信息的抓取和在產品中的應用,也是如何搭建一個智能客服系列的第三篇。

你或許思考過,AI是怎麼聽懂人說話的呢?——當我在商場,跟商場的機器人說我要去三樓,它是怎樣聽懂我的意思的呢?當我說去NARS,它怎麼知道NARS是什麼,是在哪裡?

想知道以上問題的答案,那麼就要說叨說叨實體(entity)了。

首先,實體信息是什麼意思呢?

它表示關鍵性的信息,通常可以分為兩種,一是與業務基本無關的,可以算作通識的信息,比如手機號、郵箱、日期、時間;二是與業務相關的,根據實際場景定製的。

怎麼理解呢?接下來我將舉例說明。

01 與業務基本無關的

舉個栗子,第一個場景,當你需要預訂一張機票,假設你會這樣說:

幫我訂張明天的機票,從北京去上海,下午起飛的那種,我電話13344445555,行程單發我郵箱yuanquaner@woshipm.com

好的,已為您找到如下符合條件的航班……

在這個場景中,『明天』和『下午』就是時間信息,『北京』和『上海』是地點信息,『13344445555』是手機號。因為這些信息可以說是通識,不隨業務而改變,所以一般會內置到演算法中去,識別並做對應的轉換。

在上面的場景中,AI端會先識別出日期和時間,然後把『明天』轉換為『2020年3月27日』,『下午』轉換為『14:00-18:00』,再與其他信息合併,由數據端向航空公司發起請求,再告訴你返回的結果,即符合條件的航班列表。

這個識別環節聽起來是簡單的,因為人類在語言學習的過程中已經能夠條件反射出什麼是日期、什麼是手機號、什麼是地點。

但是對AI而言,起初這些東西都是一樣的字而已,需要大量的演算法來區分與提取到這些信息。這裡的識別率與演算法設計時對語言理解的豐富度息息相關。

比如說,一開始是對『明天』『昨天』做了識別,而忽略了『前一天』『后一天』的表達;或者一開始做了『2020年2月2日』,而忽略了『2020年二月二日』的表達,就會直接拉低識別率,具體的表現就是……智障率升高。

轉換這一步中,有個很有意思的點:

人們用自然語言表達日期時間等信息時,其實是不完全符合標準邏輯的。

比如說,當你在晚上00:10分跟智能助手說,「訂個明天的鬧鐘」,這裡的「明天」大概率已經是算「今天」了。

當你在2020年1月里,跟智能助手說,「查查12月的賬單」,你其實是在講2019年的12月。這些語言表達習慣都應該考慮進去,才能讓智能助手「感覺像個人」。

Siri在這裡做的很好,訂鬧鐘的場景,它會再確認一句「請問你是說訂今天早上8點的鬧鐘嗎?」

02 與業務相關的

收回來說第二個場景,結合業務出現的實體。

繼續舉栗子,當你要買一杯奶茶,你通過智能助理完成這個操作,那麼對話應該是這樣的:

我要一杯奶茶,一點點的,大杯四季奶青,全糖,加一份紅豆,不加冰。

好的,已下單。

這裡面,『一點點』是奶茶品牌,『四季奶青』是奶茶商品名,『大杯』是份量,『全糖』是糖度……

由於它們是完全依託於業務的表達,離開這個場景則這些詞不再有意義。

比如你在跟別人聊天氣的時候突然說一句「一點點哦」,對方是聽不懂的。它不像「北京」這種詞,北京永遠是北京。

所以這種信息就是我說的,要根據實際場景定製的,也就是說,我需要告訴AI,什麼是奶茶品牌、什麼是奶茶商品名、什麼是份量……

怎麼告訴它呢?

一般有三種途徑:字元串匹配,正則表達式,標註。

1. 字元串匹配

字元串匹配,即定義一個實體信息的合集,適用於固定出現的欄位。說起來比較晦澀,我用偽代碼(因為不會寫真代碼)形式寫一下就清楚了。在買奶茶的場景中,對奶茶品牌和商品名等實體信息的定義可以這樣寫:

“奶茶品牌” = [ ‘一點點’, ‘喜茶’, ‘樂樂茶’, ‘奈雪的茶’ ]

“份量” = [ ‘大杯’, ‘中杯’, ‘小杯’ ]

“商品名” = [ ‘四季奶青’, ‘紅茶瑪奇朵’, ‘芝士芭蕾’ ]

這樣,當用戶說到了其中一個項,AI就可以知道對方在講什麼了。

2. 正則表達式

正則表達式,即定義一個實體信息出現的規則,適用於有規律出現的信息。以車牌號為例,常見的形式為省份縮寫(一個漢字)+一位字母+五位數字,依然用偽代碼的形式表達,如下:

“車牌號” = [京滬魯浙……津豫贛]{1}[A-Z]{1}[0-9]{5}

#意思是從省份縮寫中的一個字+一個大寫字母+5個阿拉伯數字

同理地,我們可以用這種方式定義其他有規律的辭彙,像設備批號,身份證號,手機號,訂單號,諸如此類。

講到這裡,你可能想說,這兩種辦法一點都不AI嘛。那麼……朋友你說的沒錯我也這麼認為!不過途徑只是途徑,AI也不是目的,而是為了實現最終與人對話的效果。所以來看很AI的第三種吧。

3. 標註

標註,即對表達某一個意思的語句進行標註,從而讓機器學習到某一個意思,適用於不固定也不規律的表達。

以筆者工作里的一個場景來說,有車貸或房貸的用戶,經常會來諮詢,自己還完了多少錢,自己還剩多少錢要還。那麼我稍微整理了一些出現過的表達方式,如下:

我還了多少錢了?

我已經付掉多少貸款了?

我還完了多少貸款?

有多少貸款是還上了的?

我已經還了多少款?

我的貸款還清了多少了呢

我還有多少錢要還啊?

還剩多少貸款要付?

還有多少貸款得付?

我還要付多少錢呀

很明顯地,這些表達即不會用固定的名詞,也沒有可以寫成正則表達式的清晰規律。但是可以用語義上清楚地看出來用戶在問什麼,所以這裡採用標註的形式把意思標出來。

我們定義還完了多少錢的概念為=”已還”,還剩多少錢要還的概念為=”剩餘”,括弧起來的為標註的位置:

我[還了多少錢]了?——「實體」=「已還」

已經[付掉多少貸款]了?——「實體」=「已還」

我[還完了多少]貸款?——「實體」=「已還」

有[多少貸款是還上了]的?——「實體」=「已還」

我已經[還了多少款]?——「實體」=「已還」

我的貸款[還清了多少]了呢——「實體」=「已還」

我[還有多少錢要還]啊?——「實體」=「剩餘」

還[剩多少貸款要付]?——「實體」=「剩餘」

還[有多少貸款得付]?——「實體」=「剩餘」

我[還要付多少]錢呀——「實體」=「剩餘」

在完成了大量以上類型的標註后,當用戶再問到相同的問題,AI大概率上就能識別到對應的實體信息,那麼就可以繼續「像個人一樣」地進行對話了。

在實際的落地場景中,提取的途徑並不是唯一的,也不一定是固定的。具體採用哪種方式來實現需求,是基於PM對技術方法的了解和對業務背景的熟悉而做判斷。究其根本,一切都還是為了用戶需求而服務。

好了今天的內容就到這裡~下一篇主題是怎樣讓AI更像人——偽裝的智能感。感謝觀看!