教學課程:從儲存在Power BI中的文字擷取關鍵片語

Microsoft Power BI Desktop 是免費的應用程式,可讓您連線、轉換及可視化您的數據。 關鍵片語擷取是 Azure AI 語言的其中一項功能,可提供自然語言處理。 假設原始非結構化文字,它可以擷取最重要的片語、分析情感,以及識別品牌等已知實體。 這些工具可協助您快速瞭解客戶所談論的內容,以及他們對此有何感受。

在本教學課程中,您將了解如何:

  • 使用 Power BI Desktop 匯入和轉換數據
  • 在 Power BI Desktop 中建立自定義函式
  • 整合 Power BI Desktop 與 Azure AI 語言的關鍵片語擷取功能
  • 使用關鍵片語擷取從客戶意見反應取得最重要的片語
  • 從客戶意見反應建立單字雲端

必要條件

載入客戶數據

若要開始使用,請開啟Power BI Desktop並載入您作為必要條件一部分下載的逗號分隔值 (CSV) 檔案。 此檔案代表虛構小公司支持論壇中的一天假設活動。

注意

Power BI 可以使用各種 Web 來源的數據,例如 SQL 資料庫。 如需詳細資訊, 請參閱 Power Query 檔

在主要 Power BI Desktop 視窗中,選取 [首頁 ] 功能區。 在功能區的 [外部數據] 群組中,開啟 [取得數據] 下拉功能表,然後選取 [文字/CSV]。

The Get Data button

[開啟] 對話框隨即出現。 流覽至 [下載] 資料夾,或流覽至您下載 CSV 檔案的資料夾。 選取檔名,然後選取 [ 開啟 ] 按鈕。 [CSV 匯入] 對話框隨即出現。

The CSV Import dialog

[CSV 匯入] 對話框可讓您確認 Power BI Desktop 已正確偵測到字元集、分隔符、標頭數據列和數據行類型。 此資訊全部正確,因此請選取 [ 載入]。

若要查看載入的數據,請按兩下 Power BI 工作區左邊緣的 [資料檢視 ] 按鈕。 數據表隨即開啟,其中包含數據,例如在 Microsoft Excel 中。

The initial view of the imported data

準備資料

您可能需要先在Power BI Desktop 中轉換數據,然後才準備好由關鍵片語擷取處理。

範例數據報含數據 subject 行和數據 comment 行。 在 Power BI Desktop 中使用合併數據行函式,您可以從這兩個數據行中的數據擷取關鍵片語,而不只是數據 comment 行。

在 Power BI Desktop 中,選取 [ 首頁] 功能區。 在 [ 外部數據 ] 群組中,選取 [ 編輯查詢]。

The External Data group in Home ribbon

如果尚未選擇,請在FabrikamComments視窗左側的 [查詢] 清單中選擇 。

現在,請同時選取 subject 數據表中的 和 comment 數據行。 您可能需要水平捲動才能看到這些數據行。 先按下數據 subject 行標頭,然後按住Control鍵,然後按下數據 comment 行標頭。

Selecting fields to be merged

選取 [ 轉換 ] 功能區。 在功能區的 [ 文字數據行] 群組中,選取 [ 合併數據行]。 [合併資料行] 對話框隨即出現。

Merging fields using the Merge Columns dialog

在 [合併數據行] 對話框中,選擇 Tab 作為分隔符,然後選取 [ 確定]。

您也可以考慮使用 [移除空白] 篩選來篩選空白訊息,或使用 [清除] 轉換移除無法列印的字元。 如果您的數據報含數據行,例如 spamscore 範例檔案中的數據行,您可以使用數位篩選來略過「垃圾郵件」批注。

瞭解 API

關鍵片語擷取 每個 HTTP 要求最多可以處理一千份文字檔。 Power BI 偏好一次處理一筆記錄,因此在本教學課程中,您對 API 的呼叫只會包含一份檔。 關鍵片語 API 需要下列欄位來處理每個檔案。

欄位 描述
id 要求內此檔的唯一標識碼。 回應也包含此欄位。 如此一來,如果您處理多個檔,您可以輕鬆地將擷取的關鍵片語與其來自的文件產生關聯。 在本教學課程中,因為每個要求只處理一份檔,因此您可以針對每個要求硬式編碼 的值 id
text 要處理的文字。 此欄位的值來自Merged您在上一節建立的數據行,其中包含合併的主旨行和批註文字。 關鍵片語 API 要求此資料不超過 5,120 個字元。
language 檔撰寫之自然語言的程序代碼。 範例數據中的所有訊息都是英文,因此您可以硬式編碼此欄位的值 en

建立自定義函式

現在您已準備好建立自定義函式,以整合 Power BI 和關鍵片語擷取。 函式會接收要當做參數處理的文字。 它會將數據轉換成所需的 JSON 格式,並將 HTTP 要求傳送至關鍵片語 API。 然後函式會剖析 API 的回應,並傳回字串,其中包含所擷取關鍵片語的逗號分隔清單。

注意

Power BI Desktop 自定義函式是以 Power Query M 公式語言撰寫,或簡稱為 “M”。 M 是以 F# 為基礎的功能性程式設計語言。 不過,您不需要是程式設計人員才能完成本教學課程;下列包含必要的程序代碼。

在 Power BI Desktop 中,確定您仍在 查詢編輯器 視窗中。 如果您不是,請選取 [首頁] 功能區,然後在 [外部數據] 群組中,選取 [編輯查詢]。

現在,在 [首頁] 功能區中的 [新增查詢] 群組中,開啟 [新增來源] 下拉功能表,然後選取 [空白查詢]。

一開始名為 Query1的新查詢會出現在 [查詢] 清單中。 按兩下此專案,並將它命名為 KeyPhrases

現在,在 [首頁] 功能區中的 [查詢] 群組中,選取 [進階編輯器] 以開啟 [進階編輯器] 視窗。 刪除已經在該視窗中的程式代碼,並貼上下列程序代碼。

注意

將下列範例端點取代為 <your-custom-subdomain>語言資源所產生的端點。 您可以登入 Azure 入口網站、流覽至您的資源,然後選取 [金鑰和端點] 來尋找此端點

// Returns key phrases from the text in a comma-separated list
(text) => let
    apikey      = "YOUR_API_KEY_HERE",
    endpoint    = "https://<your-custom-subdomain>.cognitiveservices.azure.com/text/analytics" & "/v3.0/keyPhrases",
    jsontext    = Text.FromBinary(Json.FromValue(Text.Start(Text.Trim(text), 5000))),
    jsonbody    = "{ documents: [ { language: ""en"", id: ""0"", text: " & jsontext & " } ] }",
    bytesbody   = Text.ToBinary(jsonbody),
    headers     = [#"Ocp-Apim-Subscription-Key" = apikey],
    bytesresp   = Web.Contents(endpoint, [Headers=headers, Content=bytesbody]),
    jsonresp    = Json.Document(bytesresp),
    keyphrases  = Text.Lower(Text.Combine(jsonresp[documents]{0}[keyPhrases], ", "))
in  keyphrases

以您的語言資源金鑰取代 YOUR_API_KEY_HERE 。 您也可以登入 Azure 入口網站、流覽至您的語言資源,然後選取 [金鑰和端點] 頁面,來尋找此密鑰。 請務必在索引鍵前後保留引號。 然後,選取完成

使用自訂函式

現在您可以使用自定義函式,從每個客戶批注中擷取關鍵片語,並將其儲存在資料表的新數據行中。

在 Power BI Desktop 的 [查詢編輯器] 視窗中,切換回FabrikamComments查詢。 選取 [ 新增數據行] 功能區。 在 [一般] 群組中,選取 [叫用自定義函式]。

Invoke Custom Function button

[叫用自定義函數] 對話框隨即出現。 在 [ 新增資料行名稱] 中,輸入 keyphrases。 在 [ 函式查詢] 中,選取您建立的自訂函式 , KeyPhrases

新的欄位會出現在對話框中, 文字 (選擇性) 。 此欄位會詢問我們要使用哪一個數據行來提供關鍵片語 API 參數的值 text 。 (請記住,您已經硬式編碼 和 id 參數的值language。從下拉功能表中選取 Merged [您先前建立的數據行],以合併主旨和訊息欄位。

Invoking a custom function

最後,選取 [ 確定]。

如果一切就緒,Power BI 會針對數據表中的每個數據列呼叫您的自定義函式一次。 它會將查詢傳送至關鍵片語 API,並將新的資料行新增至資料表以儲存結果。 但在此之前,您可能需要指定驗證和隱私權設定。

驗證和隱私權

關閉 [叫用自定義函式] 對話框之後,可能會出現橫幅,要求您指定如何連線到關鍵片語 API。

credentials banner

選取 [編輯認證],確定Anonymous已在對話框中選取,然後選取 [連線]。

注意

Anonymous因為關鍵片語擷取會使用存取密鑰來驗證要求,因此 Power BI 不需要提供 HTTP 要求本身的認證。

setting authentication to anonymous

如果您在選擇匿名存取之後看到 [編輯認證] 橫幅,您可能忘記將語言資源密鑰貼到自訂函式中的KeyPhrases程式碼中。

接下來,可能會顯示橫幅,要求您提供數據源隱私權的相關信息。

privacy banner

選取 [ 繼續 ],然後選擇 Public 對話框中每個數據源。 然後選取儲存

setting data source privacy

建立雲端一詞

處理出現的任何橫幅之後,請選取 [首頁] 功能區中的 [關閉和套用],以關閉 查詢編輯器。

Power BI Desktop 需要一些時間才能提出必要的 HTTP 要求。 針對數據表中的每個數據列,新 keyphrases 數據行會包含關鍵片語 API 在文字中偵測到的主要片語。

現在您將使用此資料行來產生文字雲端。 若要開始使用,請按兩下 工作區左側主要Power BI Desktop 視窗中的 [報表 ] 按鈕。

注意

為何使用擷取的關鍵片語來產生文字雲端,而不是每個批注的全文? 關鍵片語提供我們 客戶批注中的重要 字組,而不只是 最常見的 單字。 此外,結果雲端中的單字重設大小不會因在相對較少批注中頻繁使用單字而扭曲。

如果您尚未安裝 Word Cloud 自定義視覺效果,請加以安裝。 在工作區右側的 [視覺效果] 面板中,按兩下三個點(...),然後選擇 [ 從市場匯入]。 如果 「cloud」 一詞不在清單中顯示的視覺效果工具中,您可以搜尋 「cloud」,然後按兩下 Word Cloud 視覺效果旁的 [新增 ] 按鈕。 Power BI 會安裝 Word Cloud 視覺效果,並讓您知道已成功安裝。

adding a custom visual

首先,按兩下 [視覺效果] 面板中的 [Word Cloud] 圖示。

Word Cloud icon in visualizations panel

新的報表會出現在工作區中。 將欄位從 [ keyphrases 欄位] 面板拖曳至 [視覺效果] 面板中的 [類別] 字段。 雲端一詞會出現在報表內。

現在切換至 [視覺效果] 面板的 [格式] 頁面。 在 [停止字詞] 類別中,開啟 [預設停止字詞 ] 以消除雲端中的簡短常見字詞,例如 “of”。 不過,因為我們正在可視化關鍵詞組,所以它們可能不會包含停用字詞。

activating default stop words

在此面板中再向下一點,關閉 [旋轉文字] 和 [標題]。

activate focus mode

選取報表中的焦點模式工具,以深入瞭解我們的文字雲端。 此工具會展開雲端一詞以填滿整個工作區,如下所示。

A Word Cloud

使用其他功能

Azure AI 語言也提供情感分析和語言偵測。 如果您的客戶意見反應並非全部都是英文,則語言偵測特別有用。

這兩個其他 API 都類似於關鍵片語 API。 這表示您可以使用與本教學課程中建立的自定義函式幾乎完全相同的自定義函式,將它們與 Power BI Desktop 整合。 只要建立空白查詢,並將下列適當的程式代碼貼到 進階編輯器,就像您稍早所做的一樣。 (別忘了您的訪問金鑰!然後,如同先前一樣,使用函式將新的數據行新增至數據表。

下方的情感分析函式會傳回一個標籤,指出文字中表示情感的正面程度。

// Returns the sentiment label of the text, for example, positive, negative or mixed.
(text) => let
    apikey = "YOUR_API_KEY_HERE",
    endpoint = "<your-custom-subdomain>.cognitiveservices.azure.com" & "/text/analytics/v3.1/sentiment",
    jsontext = Text.FromBinary(Json.FromValue(Text.Start(Text.Trim(text), 5000))),
    jsonbody = "{ documents: [ { language: ""en"", id: ""0"", text: " & jsontext & " } ] }",
    bytesbody = Text.ToBinary(jsonbody),
    headers = [#"Ocp-Apim-Subscription-Key" = apikey],
    bytesresp = Web.Contents(endpoint, [Headers=headers, Content=bytesbody]),
    jsonresp = Json.Document(bytesresp),
    sentiment   = jsonresp[documents]{0}[sentiment] 
    in sentiment

以下是語言偵測函式的兩個版本。 第一個會傳回 ISO 語言代碼(例如 en ,英文),而第二個則會傳回「易記」名稱(例如, English)。 您可能會注意到,只有本文的最後一行在兩個版本之間有所不同。

// Returns the two-letter language code (for example, 'en' for English) of the text
(text) => let
    apikey      = "YOUR_API_KEY_HERE",
    endpoint    = "https://<your-custom-subdomain>.cognitiveservices.azure.com" & "/text/analytics/v3.1/languages",
    jsontext    = Text.FromBinary(Json.FromValue(Text.Start(Text.Trim(text), 5000))),
    jsonbody    = "{ documents: [ { id: ""0"", text: " & jsontext & " } ] }",
    bytesbody   = Text.ToBinary(jsonbody),
    headers     = [#"Ocp-Apim-Subscription-Key" = apikey],
    bytesresp   = Web.Contents(endpoint, [Headers=headers, Content=bytesbody]),
    jsonresp    = Json.Document(bytesresp),
    language    = jsonresp [documents]{0}[detectedLanguage] [name] in language 
// Returns the name (for example, 'English') of the language in which the text is written
(text) => let
    apikey      = "YOUR_API_KEY_HERE",
    endpoint    = "https://<your-custom-subdomain>.cognitiveservices.azure.com" & "/text/analytics/v3.1/languages",
    jsontext    = Text.FromBinary(Json.FromValue(Text.Start(Text.Trim(text), 5000))),
    jsonbody    = "{ documents: [ { id: ""0"", text: " & jsontext & " } ] }",
    bytesbody   = Text.ToBinary(jsonbody),
    headers     = [#"Ocp-Apim-Subscription-Key" = apikey],
    bytesresp   = Web.Contents(endpoint, [Headers=headers, Content=bytesbody]),
    jsonresp    = Json.Document(bytesresp),
    language    =jsonresp [documents]{0}[detectedLanguage] [name] in language 

最後,以下是已呈現關鍵片語函式的變體,該函式會傳回片語做為清單物件,而不是以逗號分隔片語的單一字串。

注意

傳回單一字串已簡化我們的單字雲端範例。 另一方面,清單是使用PowerBI中傳回片語的更有彈性的格式。 您可以使用 查詢編輯器 轉換功能區中的 [結構化數據行] 群組,操作 Power BI Desktop 中的清單物件。

// Returns key phrases from the text as a list object
(text) => let
    apikey      = "YOUR_API_KEY_HERE",
    endpoint    = "https://<your-custom-subdomain>.cognitiveservices.azure.com" & "/text/analytics/v3.1/keyPhrases",
    jsontext    = Text.FromBinary(Json.FromValue(Text.Start(Text.Trim(text), 5000))),
    jsonbody    = "{ documents: [ { language: ""en"", id: ""0"", text: " & jsontext & " } ] }",
    bytesbody   = Text.ToBinary(jsonbody),
    headers     = [#"Ocp-Apim-Subscription-Key" = apikey],
    bytesresp   = Web.Contents(endpoint, [Headers=headers, Content=bytesbody]),
    jsonresp    = Json.Document(bytesresp),
    keyphrases  = jsonresp[documents]{0}[keyPhrases]
in  keyphrases

下一步

深入瞭解 Azure AI 語言、Power Query M 公式語言或 Power BI。