農林漁牧網

您現在的位置是:首頁 > 林業

Rasa 詳解自定義 NLU 元件

2022-08-20由 Kevin陶民澤 發表于 林業

pkl可以實現什麼

Rasa 詳解自定義 NLU 元件

我們認為,定製 ML 模型對於構建成功的 AI 助手至關重要。開源的 Rasa 為你構建用於意圖分類和實體提取的良好 NLU 模型提供了堅實的基礎,但是如果你想透過自定義元件(比如:情感分析器、拼寫檢查器、字元分詞器、位元組匹配編碼器等)來增強現有 Rasa NLU 模型,我們在 Rasa NLU 模組化方面投入了大量工作,以便可以做到這一點。本文教程中,你將學習如何在 Rasa 中自定義 NLU 元件,你可以建立一個自定義元件來執行當前 Rasa NLU 元件中沒有提供的功能,以便你的 AI 助手達到一個全新的水平。

本文的目錄結構:

Rasa NLU pipeline 介紹

自定義元件介紹

將自定義的情感分析元件新增到 Rasa NLU 中

總結

1。 Rasa NLU pipeline 介紹

處理 pipeline 是 Rasa NLU 模型的主要構建模組,它定義了傳入的使用者訊息必須經過哪些處理階段,直到模型輸出為止。這些階段可以是:分詞階段、特徵提取階段、意圖分類階段、實體提取階段、模式匹配階段等等。預設情況下,Rasa NLU 附帶了一堆預構建的元件供你使用,下面是以 Rasa NLU pipeline 的配置示例:

Rasa 詳解自定義 NLU 元件

一旦 pipeline 被定義後,每個元件都將被另一個元件呼叫,併產生輸出,該輸出可以直接新增到 Rasa NLU 模型輸出中,也可用作其他元件的輸入。如何在配置檔案中定義元件,十分重要,例如:在 pipeline 中定義了三個元件 [‘Component1’, ‘Component2’, ‘Component3’],則將首先呼叫 Component1 的方法,下圖顯示了元件的生命週期:

Rasa 詳解自定義 NLU 元件

元件經歷了三個主要階段:

建立:在訓練之前初始化元件

訓練:該元件使用上下文和可能的先前元件的輸出進行自我訓練

持久化:將經過訓練過的元件儲存到磁碟上以備將來使用

在初始化第一個元件之前,會建立一個上下文,該上下文用於元件之間傳遞資訊。例如:一個元件可以計算訓練資料的特徵向量,將其儲存在該上下文中,另一個元件可以從該上下文中檢索這些特徵向量並進行意圖分類。當建立、訓練、持久化了所有元件後,將建立一個描述整個 NLU 模型的模型元資料。

2。 自定義元件介紹

使用預構建的 Rasa NLU 元件,你可以很方便的自定義模型。但是,在某些情況下,你可能需要新增一個在 Rasa NLU 元件中未本地實現的元件。例如:新增一個情感分析器,用於根據使用者的心情做出不同的響應,或者你想新增一個拼寫檢查器來更正使用者訊息中的拼寫錯誤,然後對其進行意圖分類和實體提取,接著用於 API 呼叫或者資料庫中查詢記錄。在 NLU pipeline 中新增自定義元件,需要實現自定義元件類,該類需實現必須的方法,並在 Rasa NLU pipeline 配置檔案中引用。通常,透過以下兩種情況來自定義元件:

預訓練模型中的元件(例如:在不同的資料集上進行訓練並打包為 python 庫、。pkl 檔案等)

在你的 Rasa NLU 訓練資料集上進行訓練,並對訓練示例進行更改或新增更多的訓練示例來最佳化的元件

下面將介紹如何在實踐中實現這兩種情況。

3。 將自定義的情感分析元件新增到 Rasa NLU 中

我們將以情感分析器新增到 Rasa NLU pipeline 中為例,首先,你將學習如何設計它,以便在新增更多訓練示例時提高元件的效能。由於情感分析是有監督的分類問題,因此,對於這個特定的示例,你將不得不為 NLU 訓練示例分配更多情感值標籤(正、負、中性),新增這些新標籤的方法之一是將它們儲存在一個單獨檔案中。比如:你的 Rasa NLU 訓練資料看起來如下所示:

Rasa 詳解自定義 NLU 元件

相應的標籤如下所示:

Rasa 詳解自定義 NLU 元件

3。1 構建一個自定義情感分析元件類

自定義元件類將定義如何訓練元件,將什麼內容作為輸入以及將產生什麼內容。要自定義元件,先建立一個新檔案(例如:sentiment。py),然後從設定自定義元件類名以及定義該元件的主要內容描述開始:

name:元件名

provides:元件產生的輸出內容

requires:此元件需要哪些訊息屬性

defaults:元件的預設配置引數

language_list:元件相容的語言列表

在下面的示例中,自定義元件類名為 SentimentAnalyzer,元件名為 sentiment。為了使對話管理模型能夠訪問此元件的詳細內容,並根據使用者的心情使用它來驅動對話,情感分析結果將另存為實體。因此,情感分析元件包括了提供 entities。由於情感模型將分詞作為輸入,因此可以從其他負責分詞的 pipeline 元件中獲取詳細內容。這就是為什麼下面的元件配置中需要分詞的原因,最後,由於此示例僅適用於英語的情感分析模型,因此,在 language_list 中包含 en。定義好之後,接著實現該類的主要方法:

__init__:初始化元件

train:該方法負責訓練

process:該方法用於解析傳入的使用者訊息

persist:該方法用於將訓練過的元件儲存到磁碟上以備將來使用

下面的程式碼顯示了該特定示例的實現方法,我們將逐步進行介紹:

__init__:初始化自定義元件類,設定自定義元件的主要內容描述。

train():前面的元件產生分詞作為輸入,訓練資料,由載入情緒標籤和格式化資料,形成一個情感分類。

process():該函式用於將新使用者訊息的分詞和情感分析模型預測作為實體訊息類。

persist():該函式以 。pkl檔案儲存訓練後的情感分析模型作為以後使用

load():該函式定義了持久化的情感分析模型如何被載入。

Rasa 詳解自定義 NLU 元件

Rasa 詳解自定義 NLU 元件

Rasa 詳解自定義 NLU 元件

Rasa 詳解自定義 NLU 元件

就是這樣!你剛剛實現了一個自定義元件,該元件可以解析傳入的使用者訊息,並將情感作為一個叫做sentiment的實體返回。要使用此元件,請確保在 Rasa NLU pipeline 配置中引用它。你可以像引用 Python 模組-module_name。class_name一樣引用自定義元件。由於此自定義元件需要tokens,因此應將其新增到產生tokens的元件之後。下面是示例流水線化的配置,情感分析元件的方法將在SpacyTokenizer之後呼叫元件,負責句法分析成tokens:

Rasa 詳解自定義 NLU 元件

使用自定義的情感分析元件訓練 Rasa NLU 模型之後,你可以測試其效能!

注意:為了確保 Rasa 能夠使用你的元件,請確保將專案目錄新增到

PYTHONPATH

中,因此,你可以使用以下命令:

export PYTHONPATH=/path_to_your_project_dir/:$PYTHONPATH

下面是一個帶有自定義情感分析元件的 Rasa NLU 模型輸出的示例,當一個禮貌的使用者向助手打招呼時:

Rasa 詳解自定義 NLU 元件

3。2 使用預訓練的情感分析模型

上面的自定義元件示例是一個比較簡單的情感分析模型,當你新增更多的 NLU 訓練資料時,模型效能會有所改善。如果你更願意使用與訓練模型,那麼實現方式與自定義元件類的實現非常相似,除了以下一些細節:

你不必實現train()和persist()方法,因為你的元件已經訓練和持久化過了。

你可以在process()方法中更改哪些詳細內容傳送給你的模型,比如:你的預訓練情感分析模型將未經處理的文字訊息作為輸入而不是tokens。

為了演示這種情況,讓我們使用 NLTK 自然語言工具包提供的預訓練模型:SentimentIntensityAnalyzer,然後修改之前自定義元件的程式碼。

Rasa 詳解自定義 NLU 元件

Rasa 詳解自定義 NLU 元件

在這種情況下,train()和persist()方法都是pass,因為預訓練模型已經訓練和持久化過了。此外,由於模型將未處理的文字作為輸入,因此在process()方法中,將檢索實際訊息並將其傳遞給模型,該模型負責所有處理工作並進行預測。

4。 總結

本教程中,學習瞭如何建立自定義元件並將其新增到 Rasa NLU pipeline 中,你可以新增任意自定義元件,但重要的是要了解它們如何與其他處理元件配合使用,以及它們應該產生什麼輸出,將某些內容傳遞給 pipeline 中的其他元件或者向模型的輸出新增某些內容。

作者:Kevin Tao

知乎號:Kevin陶民澤

備註:轉載請註明出處。

如發現錯誤,歡迎留言指正。