共用方式為


教學課程:從儲存在 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]

[取得資料] 按鈕

[開啟] 對話方塊隨即出現。 瀏覽到您的 [下載] 資料夾,或是您下載 CSV 檔案的資料夾。 選取檔案名稱,然後選取 [開啟] 按鈕。 [CSV 匯入] 對話方塊隨即出現。

[CSV 匯入] 對話方塊

[CSV 匯入] 對話方塊可讓您確認 Power BI Desktop 是否已正確地偵測到字元集、分隔符號、標題資料列和資料行類型。 此資訊都正確無誤,所以選取 [載入]

若要查看載入的資料,請按一下 Power BI 工作區左側邊緣的 [資料檢視] 按鈕。 隨即會開啟包含資料的資料表,就和在 Microsoft Excel 中一樣。

所匯入資料的初始檢視

準備資料

您可能需要先將 Power BI Desktop 中的資料進行轉換,才能讓資料準備好供關鍵片語擷取進行處理。

範例資料包含 subject 資料行和 comment 資料行。 有了 Power BI Desktop 中的「合併資料行」功能,您就可以從這兩個資料行中的資料擷取關鍵片語,而不是只從 comment 資料行。

在 Power BI Desktop 中,選取 [常用] 功能區。 在 [外部資料] 群組中,選取 [編輯查詢]

[常用] 功能區中的 [外部資料] 群組

在視窗左側的 [查詢] 清單中選取 FabrikamComments (如果尚未選取)。

現在,選取資料表中的 subjectcomment 資料行。 您可能需要水平捲動才能看到這些資料行。 請先按一下 subject 資料行標題,然後按住 Control 鍵並按一下 comment 資料行標題。

選取要合併的欄位

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

使用 [合併資料行] 對話方塊來合併欄位

在 [合併資料行] 對話方塊中,選擇 Tab 作為分隔符號,然後選取 [確定]

您也可以考慮使用「移除空白」篩選條件來篩掉空白訊息,或是使用「清理轉換」移除不可列印的字元。 如果資料包含像是檔案範例中 spamscore 資料行的資料行,您可以使用「數字篩選條件」來略過「垃圾」評論。

了解 API

關鍵片語擷取可針對每個 HTTP 要求處理最多達一千個文字文件。 Power BI 偏好一次處理一個記錄,所以在此教學課程中,您對 API 的呼叫每次只會包含單一文件。 關鍵片語 API 要求所處理的每個文件都必須具有下列欄位。

欄位 描述
id 這個文件在要求中的唯一識別碼。 回應中也會包含此欄位。 如此一來,如果您處理多份文件,就可以輕鬆地將擷取到的關鍵片語關聯至其來源文件。 在此教學課程中,因為您針對每個要求只會處理一個文件,您可以針對每個要求將 id 的值以硬式編碼設為相同的值。
text 要處理的文字。 此欄位的值來自您在前一節中建立的 Merged 資料行,其中包含了結合的主旨行與評論文字。 關鍵片語 API 要求這項資料的長度不得超過約 5,120 個字元。
language 撰寫文件所使用之自然語言的代碼。 範例資料中的所有訊息都是英文,因此您可以針對此欄位以硬式編碼方式編寫 en 值。

建立自訂函式

現在,您已經準備好建立自訂函式,以整合 Power BI 與關鍵片語擷取。 函式會收到要處理為參數的文字。 它會將資料轉換為所需的 JSON 格式 (以及反向轉換),並對關鍵片語 API 提出 HTTP 要求。 接著,函式會剖析來自 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 查詢。 選取 [新增資料行] 功能區。 在 [一般] 群組中,選取 [叫用自訂函數]

[叫用自訂函數] 按鈕

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

對話方塊中會出現新的欄位 text (optional)。 此欄位是我們要使用哪一個資料行,針對關鍵片語 API 的 text 參數提供值。 (請記住,您已經以硬式編碼方式編寫 languageid 參數的值)。從下拉式功能表選取Merged (我們稍早透過合併主旨與訊息欄位所建立的資料行)。

叫用自訂函式

最後,選取 [確定]

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

驗證和隱私權

關閉 [叫用自訂函數] 對話方塊之後,可能會出現橫幅要求您指定如何連線至關鍵片語 API。

認證橫幅

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

注意

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

將驗證設定為匿名

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

接下來,可能會出現橫幅要求您提供關於資料來源隱私權的資訊。

隱私權橫幅

選取 [繼續],然後針對對話方塊中的每個資料來源選擇 Public。 然後選取儲存

設定資料來源隱私權

建立文字雲

處理好出現的各個橫幅後,請選取 [首頁] 功能區中的 [關閉並套用] 以關閉查詢編輯器。

Power BI Desktop 需要一點時間來提出必要的 HTTP 要求。 在資料表的每個資料列中,新的 keyphrases 資料行會包含關鍵片語 API 在文字中所偵測到的關鍵片語。

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

注意

為何要使用所擷取的關鍵片語來產生文字雲,而不是使用每個評論的完整文字? 關鍵片語可為我們提供客戶評論中的「重要」文字,而不只是「最常見的」文字。 此外,在產生的文字雲中,文字大小也不會因為相對少數的評論中頻繁使用某個文字而受到影響。

如果您尚未安裝文字雲自訂視覺效果,請加以安裝。 在工作區右邊的 [視覺效果] 窗格中,按一下三個點 (...),然後選擇 [從市場匯入]。 如果清單中未顯示視覺效果工具的單字,您可以搜尋「雲端」並按一下 [文字雲視覺效果] 旁的 [新增] 按鈕。 Power BI 會安裝文字雲視覺效果,並讓您知道它已成功安裝。

新增自訂視覺效果

首先,按一下 [視覺效果] 面板中的 [文字雲] 圖示。

視覺效果面板中的文字雲圖示

新的報告隨即出現在工作區中。 將 keyphrases 欄位從 [欄位] 面板拖曳至 [視覺效果] 面板的 [類別] 欄位。 文字雲會出現在報告中。

現在,切換到 [視覺效果] 面板的 [格式] 頁面。 在 [停止文字] 類別中,開啟 [預設停止文字] 以從雲端排除常見的簡短文字,例如 "of"。 不過,因為我們要將關鍵片語視覺化,所以可能不會包含停止文字。

啟用預設停用字詞

在這個面板中往下一點,關閉 [旋轉文字] 和 [標題]

啟動焦點模式

選取報告中的 [焦點模式] 工具,以更加了解我們的文字雲。 此工具會展開文字雲以填滿整個工作區,如下所示。

文字雲

使用其他功能

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 

最後,以下是已提出的關鍵片語函式變化,其會以清單物件的形式傳回片語,而不是以逗號分隔片語單一字串的形式傳回。

注意

傳回單一字串簡化了我們的文字雲範例。 另一方面,清單則是更有彈性的格式,可處理 Power BI 中所傳回的片語。 您可以使用查詢編輯器 [轉換] 功能區中的 [結構化資料行] 群組,以處理 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。