2018 年 7 月

第 33 卷,第 7 期

本文章是由機器翻譯。

認知服務 - 改善 LUIS 意圖分類

藉由Zvi Topol |2018 年 7 月

Language Understanding Intelligence Service (LUIS),也就是 Microsoft 認知服務的一部分,提供機器學習服務解決方案的自然語言理解。有許多使用案例的 LUIS,包括的聊天機器人,語音介面和認知的搜尋引擎。

簡單的說,當指定文字的使用者輸入,也就是 [utterance],LUIS 會傳回背後 utterance],也就是什麼使用者想要詢問有關偵測到的目的。它也會偵測不同實體 — 真實世界物件的參考,會出現在 [utterance]。此外,它會輸出每個意圖和實體偵測到的信心分數。這些表示最多信心偵測和 0 表示最不十分熟悉它的 1 是範圍 [0,1] 中的數字。

先前的 MSDN Magazine 文章已涵蓋 LUIS 的基本概念,在 [詳細資料。特別的是,我建議您參閱本文中,「 啟用自然語言互動使用 LUIS,「 由 Ashish Sahu (msdn.com/magazine/mt745095) 如需有關如何開始使用 LUIS 的詳細資訊。

這篇文章將著重在兩個開放原始碼工具,Scattertext 和淡黃綠色,可協助您了解的偵測和分類的意圖 LUIS。(在接下來我將使用偵測和分類交替。)

特別是,我將示範如何使用這類工具,稍微分類程序,並解釋 LUIS 有關其意圖的偵測,在某些情況下,您不確定 — 通常是最上層的意圖指定 [utterance] 偵測到具有類似的情況信心分數,例如 50-50 分割之間兩個對應方式。它會輸出錯誤的意圖,在此情況下更容易。

雖然 LUIS 目前支援一些疑難排解的功能,包括作用中的學習,以協助識別並重新定型表達方式很確定,有沒有 word 層級的視覺效果與分析工具可進一步協助解決這種不確定性。Scattertext 和淡黃綠色可幫助克服這項限制。

現在讓我們看看一個簡單的金融科技案例將做為執行的範例。想像一下您適用於銀行和您的工作是要了解使用者問題可分為兩類:

  • 關於其個人的問題例如銀行帳戶:
    「 我的存款帳戶餘額為何? 」
    「 什麼是最新的交易中檢查我的帳戶? 」
    「 我想要傳送一次我節省陳述式 」
    「 我收到我年 4 月薪資尚未? 」
    「 何時已過去的行動電話自動付款處理? 」
    為何我的存款帳戶的年度費率? 」
    「 在我的支票帳戶的餘額為何? 」
  • 問題或要求有關其他金融服務,包括房屋貨款、 自動 loans 等等,例如:
    「 我想要取得有關抵押貸款費率的協助 」
    「 誰可以 can I speak with 有關房屋貨款? 」
    「 一年節省帳戶年利率為何? 」
    「 哪些詞彙是否提供的房屋貨款? 」
    「 誰是負責房屋貨款? 」
    為何每年費率存款帳戶? 」
    「 如何是抵押貸款費率相較於其他銀行? 」

若要使用的使用者要求的自然語言理解 LUIS 是計劃。資訊的一種方法是建立兩個對應方式,並訓練 LUIS 加以偵測。

現在我們要呼叫的第一個類別的意圖 PersonalAccountsIntent 和第二個類別目錄的意圖 OtherServicesIntent。然後,您可以使用先前所列訓練 LUIS utterance 範例。它會建立第三個 「 全部擷取 」 意圖,自動呼叫都沒有一般的談話,應該非常不同於前兩個對應方式。您也可以提供其他範例,為 None 的意圖。

定型之後, 您可以將模型發行到生產環境中。您也可以查看在 LUIS UI 中,不同的用途的信心分數以及談話,如中所示**[圖 1**。

使用他們的信心分數 PersonalAccountsIntent 表達方式
[圖 1 PersonalAccountsIntent 談話,使用他們的信心分數

儀表板會提供一些基本的摘要統計資料的應用程式相關。如果您查看在儀表板**[圖 1**,您會注意到,最低的信賴分數 PersonalAccountsIntent 是 0.59,且已取得的 [utterance] 中,為何我的存款帳戶的年度費率? 」 在 [0.44 時,關閉此 [utterance] 來分類為 OtherServicesIntent 是完美的信心分數。這表示,LUIS 不是很確定如何分類此意圖。

在理想情況下,您會想意圖會分辨彼此具有較高程度的確定性 」,也就是,有極高的信心分數,一個意圖,而其他 intents 擁有極低的分數。如果您重新瀏覽這兩個 「 意圖 」 的 [utterance] 清單中,您會看到有是另一個非常類似 [utterance] 範例 ("是一年節省帳戶年利率? 」) 標示為 OtherServicesIntent 為以不同的方式。

您可以使用此深入解析,來微調您的 [utterance] 範例,以使用不同且不同的單字。

在這裡,我在提供每個項目的的七個 utterance 的範例。但如果沒有多個意圖 (在撰寫本文 LUIS 可以高達 500 個不同的意圖,將時間) 和更多的每個項目的的 utterance 範例嗎?

很明顯地,為了解決這類問題需要更多系統化的方法。接下來,我將示範如何協助 Scattertext 和淡黃綠色。

了解使用 Scattertext 意圖分類

Scattertext 是由 Jason Kessler 以 Python 撰寫的開放原始碼工具。您可以找到原始程式碼和教學課程bit.ly/2G0DLmp,和白皮書,標題為 「 Scattertext: 視覺化的瀏覽器型工具主體有何不同,「 其中說明在 [詳細資料,此工具在bit.ly/2G05ow6.

Scattertext 誕生做為工具以視覺化方式檢視差異與相似之處的文字文件,也就是主體的兩個集合之間,且具有各種功能,您可能會發現很有用;比方說,它也支援 emoji。

在本文中,我利用工具來產生的差異和相似性的兩個的意圖,PersonalAccountsIntent 和 OtherServicesIntent utterance 範例之間的視覺效果。

若要安裝 Scattertext,需要 Python 第 3 版,請遵循教學課程中的安裝指示。我也建議您安裝 Spacy,開放原始碼處理自然語言程式庫 (spacy.io) 並 Pandas (pandas.pydata.org),另一個開放原始碼程式庫,可讓您使用記憶體中表格式資料。

現在我需要送入 Scattertext utterance 範例。若要這樣做,我要建立 CSV 資料表與兩個資料行,一個用於談話,另一個則用於對應方式。[Utterance] 欄會包含 [utterance] 範例當做一個字串,以新行字元分隔。(如果您使用 Excel,您可以使用 Alt + Enter 在單一的儲存格中輸入多行。) 意圖資料行都將包含之標籤的對應方式,在此情況下,PersonalAccountsIntent 和 OtherServicesIntent。因此,此範例中的結果會是 2x2 CSV 資料表。

您現在可以執行程式碼使用 Python [圖 2。程式碼會載入 Panda 資料框架中的 CSV 資料表,並再交給它 Scattertext,指定相關類別 (意圖) 」 和 「 輸出格式的幾個參數。

[圖 2 Scattertext 視覺效果的程式碼

import scattertext as st
import space
import pandas as pd
examples_data_location = 'example.csv'
two_df = pd.read_csv(examples_data_location, encoding = 'utf8')
nlp = spacy.en.English()
corpus = st.CorpusFromPandas(two_df,
                              category_col='intent',
                              text_col='utterance',
                              nlp=nlp).build()
html = st.produce_scattertext_explorer(corpus,
  category='PersonalAccountsIntent',category_name='PersonalAccountsIntent',
  not_category_name='OtherServicesIntent', width_in_pixels=1000)
open("MSDN-Visualization.html", 'wb').write(html.encode('utf-8'))

Scattertext 會產生 HTML 網頁,其中包含顯示唯一的每個目的,以及由這兩個意圖共用前的單字的視覺效果。另外還有可讓您尋找特定的單字,[搜尋] 方塊,如果找到,視覺效果中反白顯示。太過擁擠的視覺效果,這可以是非常有用。[圖 3 Scattertext 輸出,如這個範例會顯示。

Scattertext 視覺效果
[圖 3 Scattertext 視覺效果

Scattertext 的運作方式是計算每個意圖 utterance 範例的字組頻率,然後顯示文字的方式,可讓您更輕鬆地判斷之間的對應方式差異和相似性。此時,計數只會包含一字的運算式 (unigrams)。不過,如果您有包含多個單字,例如 「 自動全額而定,「 運算式則可以指定您想要某些前置處理。例如,您可以使用代表 「 自動 pay 」 與 「 auto_pay。 」

中的視覺效果**[圖 3**顯示兩個對應方式 — OtherServicesIntent 在 X 軸和 Y 軸上的 PersonalAccountsIntent。出現在右下方更接近的單字會更容易出現在 [utterance] 範例 OtherServicesIntent,例如"房屋貨款 」 和 「 費率 」,同時保持在最上層出現之文字就是比較可能會出現在 [utterance] 範例PersonalAccountsIntent,例如"my"和"account"。 對角線上的文字很可能會出現在 [utterance] 範例中的這兩種意圖,比方說,「 省 」 或 「 什麼 」。

學習特定字詞經常出現在這兩種對應方式 [utterance] 範例可協助您微調 [utterance] 範例,以改善分類信心和精確度。

若要這樣做的方法之一是藉由新增更多不同的單字,或甚至措辭中以便呈現它們更能分別經常包含文字的每個意圖 utterance] 範例。

使用 Scattertext 的優點是能夠從工具取得值,即使是針對小型資料集,例如 [我的 「 玩具 」 範例,每個項目的的只有 7 個 utterance] 範例。很明顯地,更多 [utterance] 範例每意圖,更複雜得要尋找的差異和它們之間的相似性。Scattertext 可協助您快速的視覺化方式欣賞的差異和相似性。

另外值得注意的是,您可以使用 Scattertext 以類似的方式時您有兩個以上的對應方式,藉由比較成對的對應方式一次。

說明使用淡黃綠色的意圖分類

現在讓我們看看一個稱為淡黃綠色或本機解譯模型無從驗證的說明,可讓您說明意圖分類的開放原始碼工具。您可以找到原始程式碼和教學課程bit.ly/2I4Mp9z,及學術研究白皮書,標題為 「 為什麼我是否應信任您?:說明之預測的任何分類器 」 (bit.ly/2ocHXKv)。

淺綠色以 Python 撰寫,而且您可以在本教學課程中依照安裝指示,執行的程式碼之前**[圖 4**。

[圖 4 使用淡黃綠色分析表達方式

import requests
import json
from lime.lime_text import LimeTextExplainer
import numpy as np
def call_with_utterance_list(utterance_list) :
  scores=np.array([call_with_utterance(utterance) for utterance in
    utterance_list])
  return scores
def call_with_utterance(utterance) :
  if utterance is None :
    return np.array([0, 1])
  app_url ='your_url_here&q='
  r = requests.get(app_url+utterance)
  json_payload = json.loads(r.text)
  intents = json_payload['intents']
  personal_accounts_intent_score =
    [intent['score'] for intent in intents if intent['intent'] ==
    'PersonalAccountsIntent']
  other_services_intent_score = [intent['score'] for intent in intents if
    intent['intent'] == 'OtherServicesIntent']
  none_intent_score = [intent['score'] for intent in intents if
    intent['intent'] == 'None']
  if len(personal_accounts_intent_score) == 0 :
      return np.array([0, 1])
  normalized_score_denom = personal_accounts_intent_score[0]+
    other_services_intent_score[0]+none_intent_score[0]
  score = personal_accounts_intent_score[0]/normalized_score_denom
  complement = 1 - score
  return (np.array([score, complement]))
if __name__== "__main__":
  explainer = LimeTextExplainer(class_names=['PersonalAcctIntent', 'Others'])
  utterance_to_explain = 'What are annual rates for my savings accounts'
  exp = explainer.explain_instance(utterance_to_explain,
    call_with_utterance_list, num_samples=500)
  exp.save_to_file('lime_output.html')

淺綠色可讓您說明不同的型態,包括影像和文字分類器。我使用亮,會輸出各種不同的字組,在 [utterance] 的 word 層級深入的文字版本。雖然我使用 LUIS 做我選擇的分類,各種不同的分類器可以饋入淡黃綠色;它們基本上被視為黑箱處理。

檸檬的文字版本的運作方式大致如下:它藉由移除任何數目的單字,接著會呼叫 LUIS 其中每個隨機建立多個修改或輸入 [utterance] 的範例。此樣本數目會受到參數 num_samples 中,在**[圖 4**設為 500。範例 [utterance],修改過的談話包括變化,例如"are 年度帳戶"和"哪些年速率我節省費用 」。

淺綠色會使用傳回 luis 提供的信賴分數,以符合線性模型,然後估計在分類的信心分數的單一文字的效果。此估計可協助您識別的信心分數可能會變更,如果您要移除 [utterance] 中的字,然後執行分類器一次 (如我稍後所示)。

分類器的唯一主要需求是輸出的分類標籤的信心分數。透過不同類別的信心分數會被視為一種機率分佈,並因此應該放在 [0,1] 的範圍與為 1 的總和。LUIS 輸出信心分數,在該範圍內定義的對應方式和其他無意圖,但這些不保證的總和為 1。因此,當使用亮,我將正規化 LUIS 分數來加總設為 1。(這是在函式 call_with_utterance 中完成)。

中的程式碼**[圖 4使用淡黃綠色,以產生說明有關 [utterance] 的預測,為何我的存款帳戶的年度費率? 」 它會產生 HTML 的視覺效果,是呈現[圖 5**。

淺綠色輸出為何我的存款帳戶的年度費率? 」 [Utterance]
[圖 5 淡黃綠色輸出為何我的存款帳戶的年度費率? 」 [Utterance]

在 [ [圖 5您所見 [utterance],著重於以下 PersonalAccountsIntent 而不是兩個其他意圖、 OtherServicesIntent 和無的預測的機率。(請注意,機率非常關閉],但不完全因為正規化 LUIS 的信心分數輸出相同。) 您也可以看到最重要的字組,將意圖歸類為 PersonalAccountsIntent (這些是藍色巡覽列上的字,也會在 [utterance] 文字方塊中的藍色醒目提示)。列的加權表示對分類信心分數的影響應該字移除 [utterance]。因此,比方說,"my"是文字具有最重要的效果,在此情況下偵測 [utterance] 的意圖。如果我從 [utterance] 移除它,可能預期的信心分數,以減少從 0.26 的 0.56 0.30。這是由淺綠色所產生的估計。事實上,當移除這個字,並饋送至 LUIS,為何年度費率存款帳戶嗎? 」 [utterance],結果是 PersonalAccountsIntent 的信心分數 0.26 而且目的現在會被歸類為 OtherServicesIntent,信心關於 0.577 評分的 (請參閱**[圖 6**)。

[圖 6 結果為何我的存款帳戶的年度費率? 」 查詢

{
  "query": "what are annual rates for savings accounts",
  "topScoringIntent": {
    "intent": "OtherServicesIntent",
    "score": 0.577525139
  },
  "intents": [
    {
      "intent": "OtherServicesIntent",
      "score": 0.577525139
    },
    {
      "intent": "PersonalAccountsIntent",
      "score": 0.267547846
    },
    {
      "intent": "None",
      "score": 0.00754897855
    }
  ],
  "entities": []
}

其他重要的字組是 「 帳戶 」 和 「 省下 」,其中"my"以及提供類似的深入解析 Scattertext 所提供的項目。

兩個重要的單字顯著的負面權數是 「 年度 」 和 「 費率 」。 這表示移除 [utterance] 會增加被分類為 PersonalAccountsIntent utterance 的信心分數。Scattertext 示範了 「 費率 」 是在 [utterance] 範例 OtherServicesIntent,更常見的所以這不是大的驚喜。

不過,還有新的東西要學習從淺綠色 — 「 年 」 這個字很重要的決定 LUIS,目的在此情況下並不屬於 PersonalAccountsIntent,並將它移除預期增加的信心分數由 0.27 PersonalAccountsIntent。事實上,當我移除年度之前填入 [utterance] 時,取得更高的信心分數 PersonalAccountsIntent 意圖,也就是 0.71 (請參閱**[圖 7**)。

[圖 7 結果為何我的存款帳戶的費率? 」 查詢

{
  "query": "what are rates for my savings accounts",
  "topScoringIntent": {
    "intent": "PersonalAccountsIntent",
    "score": 0.71332705
  },
  "intents": [
    {
      "intent": "PersonalAccountsIntent",
      "score": 0.71332705
    },
    {
      "intent": "OtherServicesIntent",
      "score": 0.18973498
    },
    {
      "intent": "None",
      "score": 0.007595492
    }
  ],
  "entities": []
}

如此一來,亮綠可協助您識別磁碟機的分類信心分數的重要字詞。因此,它可以提供深入解析協助您微調您的 [utterance] 範例,以改善意圖分類精確度。

總結

我顯示時開發應用程式根據 NLU,有些談話意圖預測可能相當困難,並可協助進一步了解如何微調 [utterance] 範例,以改善分類精確度所。

了解 word 層級差異和相似性,表達方式之間的工作可能會產生在微調處理序中的具體指引。

我在提供兩個開放原始碼工具,Scattertext 及亮,會藉由識別重要的字組會影響意圖預測提供 word 層級的指引。Scattertext 以視覺化方式呈現差異和相似性的字組頻率,在 [utterance] 範例中,而淺綠色識別重要的字組會影響意圖分類信心分數。

我希望這些工具可協助您建置更好 NLU 為基礎的產品使用 LUIS。


Zvi Topol開始從事資料科學家在各種產業有關,包括行銷分析、 媒體和娛樂和工業物聯網。他已傳遞,並會導致多個機器學習服務與分析專案包含自然語言、 語音介面、 認知服務,影片分析、 推薦系統和行銷決策支援系統。他可以透過連絡zvitop@gmail.com

感謝下列 Microsoft 技術專家檢閱這篇文章:Ashish Sahu


MSDN Magazine 論壇中的這篇文章的討論