如何搭建一個智慧客服(三):NLP裡實體資訊的抓取與應用

qing_yun發表於2023-04-14

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

你或許思考過,AI是怎麼聽懂人說話的呢?當我在商場,跟商場的機器人說我要去三樓,它是怎樣聽懂我的意思的呢?當我說去NARS,它怎麼知道NARS是什麼,是在哪裡?那麼就要說叨說叨實體(entity)了。

首先,實體資訊是什麼意思呢?它表示關鍵性的資訊,通常可以分為兩種,一是與業務基本無關的,可以算作通識的資訊,比如手機號,郵箱,日期,時間;二是與業務相關的,根據實際場景定製的。

怎麼理解呢?舉個例子,第一個場景,當你需要預訂一張機票,假設你會這樣說:

幫我訂張明天的機票,從北京去上海,下午起飛的那種,我電話13344445555,行程單發我郵箱yuanquaner@pmcaff.com
好的,已為您找到如下符合條件的航班……

在這個場景中,‘明天’和‘下午’就是時間資訊,‘北京’和‘上海’是地點資訊,‘13344445555’是手機號。因為這些資訊可以說是通識,不隨業務而改變,所以一般會內建到演算法中去,識別並做對應的轉換。在上面的場景中,AI端會先識別出日期和時間,然後把‘明天’轉換為‘2020年3月27日’,‘下午’轉換為‘14:00-18:00’,再與其他資訊合併,由資料端向航空公司發起請求,再告訴你返回的結果,即符合條件的航班列表。

這個識別環節聽起來是簡單的,因為人類在語言學習的過程中已經能夠條件反射出什麼是日期,什麼是手機號,什麼是地點。但是對AI而言,起初這些東西都是一樣的字而已,需要大量的演算法來區分與提取到這些資訊。這裡的識別率與演算法設計時對語言理解的豐富度息息相關。比如說,一開始是對‘明天’‘昨天’做了識別,而忽略了‘前一天’‘後一天’的表達;或者一開始做了‘2020年2月2日’,而忽略了‘2020年二月二日’的表達,就會直接拉低識別率,具體的表現就是……智障率升高。

轉換這一步中,有個很有意思的點。人們用自然語言表達日期時間等資訊時,其實是不完全符合標準邏輯的。比如說,當你在晚上00:10分跟智慧助手說,“訂個明天的鬧鐘”,這裡的“明天”大機率已經是算“今天”了。當你在2020年1月裡,跟智慧助手說,“查查12月的賬單”,你其實是在講2019年的12月。這些語言表達習慣都應該考慮進去,才能讓智慧助手“感覺像個人”。Siri在這裡做的很好,訂鬧鐘的場景,它會再確認一句“請問你是說訂今天早上8點的鬧鐘嗎?”

收回來說第二個場景,結合業務出現的實體。繼續舉栗子,當你要買一杯奶茶,你透過智慧助理完成這個操作,那麼對話應該是這樣的:

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

這裡面,‘一點點’是奶茶品牌,‘四季奶青’是奶茶商品名,‘大杯’是份量,‘全糖’是糖度……由於它們是完全依託於業務的表達,離開這個場景則這些詞不再有意義。比如你在跟別人聊天氣的時候突然說一句“一點點哦”,對方是聽不懂的。它不像“北京”這種詞,北京永遠是北京。所以這種資訊就是我說的,要根據實際場景定製的。也就是說,我需要告訴AI,什麼是奶茶品牌,什麼是奶茶商品名,什麼是份量……

怎麼告訴它呢?一般有三種途徑:字串匹配,正規表示式,標註。

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

"奶茶品牌" = [ '一點點', '喜茶', '樂樂茶', '奈雪的茶' ]"
份量" = [ '大杯', '中杯', '小杯' ]
"商品名" = [ '四季奶青', '紅茶瑪奇朵', '芝士芭蕾' ]

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

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

"車牌號" = [京滬魯浙……津豫贛]{1}[A-Z]{1}[0-9]{5} 
#意思是從省份縮寫中的一個字+一個大寫字母+5個阿拉伯數字

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

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

標註,即對錶達某一個意思的語句進行標註,從而讓機器學習到某一個意思,適用於不固定也不規律的表達。以筆者工作裡的一個場景來說,有車貸或房貸的使用者,經常會來諮詢,自己還完了多少錢,自己還剩多少錢要還。那麼我稍微整理了一些出現過的表達方式,如下:

我還了多少錢了?
我已經付掉多少貸款了?
我還完了多少貸款?
有多少貸款是還上了的?
我已經還了多少款?
我的貸款還清了多少了呢
我還有多少錢要還啊?
還剩多少貸款要付?
還有多少貸款得付?
我還要付多少錢呀

很明顯地,這些表達即不會用固定的名詞,也沒有可以寫成正規表示式的清晰規律。但是可以用語義上清楚地看出來使用者在問什麼,所以,這裡採用標註的形式,把意思標出來。我們定義還完了多少錢的概念為="已還",還剩多少錢要還的概念為="剩餘",括號起來的為標註的位置:

我[還了多少錢]了?——"實體"="已還"
我已經[付掉多少貸款]了?——"實體"="已還"
我[還完了多少]貸款?——"實體"="已還"
有[多少貸款是還上了]的?——"實體"="已還"
我已經[還了多少款]?——"實體"="已還"
我的貸款[還清了多少]了呢——"實體"="已還"
我[還有多少錢要還]啊?——"實體"="剩餘"
還[剩多少貸款要付]?——"實體"="剩餘"
還[有多少貸款得付]?——"實體"="剩餘"
我[還要付多少]錢呀——"實體"="剩餘"

在完成了大量以上型別的標註後,當使用者再問到相同的問題,AI大機率上就能識別到對應的實體資訊,那麼就可以繼續“像個人一樣”地進行對話了。

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

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

感謝閱讀。

作者介紹:@一個圓圈兒,SaaS公司產品經理;擅長AI、搜尋、資料分析、商業化;智慧客服系列文章作者;“資料人創作者聯盟”成員。

來自 “ 一個資料人的自留地 ”, 原文作者:@一個圓圈兒;原文連結:https://mp.weixin.qq.com/s/vX7NRc-GoDMXE9zTrTq6Uw,如有侵權,請聯絡管理員刪除。

相關文章