1. 引言

Siri,Cortana,Google Now,小冰,度祕,隨著技術的進步和自然人機交互需求的擴大,個人智能助理漸漸成了各大巨頭爭奪的下一個入口。這些智能助理儘管能力有大有小,但有一個共同特點——用戶能通過「自然語言」與其交互,這比起傳統的用關鍵詞進行搜索的方式,顯然是一個不小的進步。比如,當你說「訂一張明天北京去杭州的機票,國航頭等艙」時,一般的搜索引擎會給出如下的網頁列表:

而我們的個人智能助理能直接給出你期望的答案:

要想從「訂一張明天北京去杭州的機票,國航頭等艙」得到這種直接答案,首要的一步就是要對自然語言進行理解。

自然語言理解(Natural Language Understanding,NLU)以語言學為基礎,融合邏輯學、心理學和計算機科學等學科,試圖解決以下問題:語言究竟是怎樣組織起來傳輸信息的?人又是怎樣從一連串的語言符號中獲取信息的?換種表達就是,通過語法、語義、語用的分析,獲取自然語言的語義表示。

2.自然語言語義表示

自然語言理解的結果,就是要獲得一個語義表示(semantic representation):

語義表示主要有三種方式:

  • 分佈語義,Distributional semantics
  • 框架語義,Frame semantics
  • 模型論語義,Model-theoretic semantics

2.1 分佈語義表示(Distributional semantics)

說distributional semantics大家比較陌生,但如果說word2vec估計大家都很熟悉,word2vec的vector就是一種distributional semantics。distributional semantics就是把語義表示成一個向量,它的理論基礎來自於Harris的分佈假設:語義相似的詞出現在相似的語境中(Semantically similar words occur in similar contexts)。具體的計算方法有多種,比如LSA(Latent Semantic Analysis)、LDA(Latent Dirichlet Allocation)及各種神經網路模型(如LSTM)等。

這種方法的優點在於,它完全是數據驅動的方法,並且能夠很好的表示語義,但一個很大的缺點在於,它的表示結果是一個整體,沒有進一步的子結構。

2.2 框架語義表示(Frame semantics)

顧名思義,這種方法把語義用一個frame表示出來,比如我們一開始舉得例子:「訂一張明天北京去杭州的機票,國航頭等艙」,表示如下:

在計算方法上,典型的比如語義角色標註(Semantic Role Labeling),具體可以分為兩個步驟:frame identification和argument identification,frame identification用於確定frame的類型,argument identification用於計算各個屬性的具體值。

這種方法和distributional semantics相比,能夠表達豐富的結構。

2.3 模型論語義表示(Model-theoretic semantics)

模型輪語義表示的典型框架是把自然語言映射成邏輯表達式(logic form)。比如對於下圖中的「中國面積最大的省份是哪個?」,將其表示成邏輯表達式就是圖中紅色字體部分,進一步那這個邏輯表達式去知識庫中查詢,就得到了答案。在計算方法上,典型的就是構建一個semantic parser。

模型論語義表示是對世界知識的完整表示,比前兩種方法表達的語義更加完整,但是缺點是semantic parser的構建比較困難,這大大限制了該方法的應用。

2.4 我們目前採用的語義表示

我們目前採用的是frame semantics表示的一種變形:採用領域(domain)、意圖(intent)和屬性槽(slots)來表示語義結果。其中,

  • 領域是指同一類型的數據或者資源,以及圍繞這些數據或資源提供的服務,比如「餐廳」,「酒店」,「飛機票」、「火車票」、「電話黃頁」等;

  • 意圖是指對於領域數據的操作,一般以動賓短語來命名,比如飛機票領域中,有「購票」、「退票」等意圖;
  • 屬性槽用來存放領域的屬性,比如飛機票領域有「時間」「出發地」「目的地」等;

對於飛機票領域,我們的語義表示結構如下圖所示:

進一步,我們對於世界的語義描述(又稱為domain ontology)如下:

3. 自然語言理解技術難點

在確定了自然語言理解的語義表示方法後,我們把技術方案抽象為如下兩步:

這和前文提到的語義角色標註把過程分為frame identification和argument identification類似,領域分類和意圖分類對應frame identification,屬性抽取對應argument identification。無論對於分類還是對於抽取來說,都需要有外部知識的支持。在實現的過程中,我們面臨著如下的困難:

(1)如何構建知識庫

「總參」除了表示總參謀部外,還是南京一家很火的火鍋店;「中華冷麵」除了是一種麵條,還是一首歌名;「王菲的紅豆」是指王菲唱的紅豆這首歌,但如果說「韓紅的紅豆」就不對了,因為韓紅沒有唱過紅豆這首歌。要想把這些知識都理解對,就需要一個龐大的知識庫,這個知識庫中的實體詞數以千萬計,怎麼挖掘,怎麼清洗噪音,都是很大的挑戰。

(2)如何理解用戶語句的意圖

「東三環堵嗎」這句話意圖是查詢路況,「下水道堵嗎」就不是查路況了;「今天的天氣」是想問天氣狀況,「今天的天氣不錯」則無此意;「附近哪兒可以喝咖啡」是想找咖啡館,但「牛皮癬能喝咖啡嗎」就是一個知識問答了。類似上述的例子舉不勝舉,更別說語言理解還受時間、位置、設備、語境等等問題的影響。

(3)如何構建可擴展的演算法框架

現實世界包含眾多的領域,而我們不可能一次性的把所有領域都定義清楚並且實現之,那我們就需要一個可擴展的演算法框架,每當修改或者新增某個領域的時候,不會對其他領域造成幹擾。

(4)如何構建數據驅動的計算流程

大數據時代,如果一個演算法或者流程不是數據驅動的,不是隨著數據的增加而自動提升效果,那這個演算法框架就沒有持續的生命力。

(5)如何融入上下文知識

在對話場景中,每句話都有對話上下文,同樣的句子在不同的上下文中理解結果是不一樣的,比如如下的例子,同樣的一句話「今天天氣好嗎」在左側圖中屬於天氣領域,而在右側圖中則屬於音樂領域。

4. 自然語言理解技術沉澱

技術難點的解決過程就是一個技術沉澱的過程。通過在自然語言理解方向上持續研究和開發,我們積累了如下的技術沉澱:

4.1 千萬級的高質量知識庫

知識庫的核心節點是各種詞,而這些詞條散佈在互聯網上的各個地方。通過自己抓取和第三方合作的方式,我們拿到了大量的「毛數據」,這些數據中含有大量的噪音。為了過濾清洗這些數據,我們構建了一套集成了多種過濾方法的過濾流程來對這些數據進行處理。截止目前,我們積累了數千萬的高質量的各種類型的詞條。

4.2 支持常見的數十個領域的理解

通過自然語言處理、機器學習、深度神經網路等演算法和大數據的使用,目前我們理解的領域有60個左右,其中重要的一些領域如下:

4.3 一套可擴展的演算法框架

領域的優化和擴展是常態,如果某個領域的優化或者新增,會對其他已有的領域的效果造成影響,那這將是一種災難。我們建立了如下圖所示的領域獨立的、可擴展的演算法框架,各個領域在知識庫、數據、模型、演算法等方面,都是各自獨立的。

4.4 數據驅動的閉環流程

我們構建瞭如下的閉環數據流程,使得數據能夠閉環流動,隨著用戶的使用,我們不斷收集日誌對系統進行更新,從而不斷維持和提升系統的效果。

4.5 基於上下文的自然語言理解

為了理解對話,我們進一步設計了基於上下文的自然語言理解框架,和無上下文相比,它主要的變化在於增加了一個domain selection模塊,該模塊在基於上下文的知識下,判斷當前話語(utterance)是否需要繼承上文知識。

5. 結束語

自然語言理解是個人智能助理的基礎模塊和核心模塊,我們目前的自然語言理解服務同時實現了無上下文的理解和有上下文的理解,無上下文的理解主要應用在搜素場景,如YunOS上的One Search搜索,有上下文的理解主要應用於對話場景,如YunOS上的個人智能助理+、阿里小蜜等。後續我們一方面在技術上會進一步做深,另一方面會服務更多的業務,歡迎各位有興趣的同學一起交流探討。

推薦閱讀:

相關文章