隱含狄利克雷分佈元件

本文描述如何在 Azure Machine Learning 設計工具中使用「隱含狄利克雷分佈」元件,將其餘未分類的文字分組至類別。

隱含狄利克雷分佈 (LDA) 通常用於自然語言處理,可尋找類似的文字。 另一種常見說法為「主題模型化」。

此元件會取得文字的資料行,並產生下列輸出:

  • 來源文字,以及每個類別的分數

  • 特徵矩陣,包含每個類別已擷取的字詞和係數

  • 轉換,您可以將其儲存並重新套用至做為輸入使用的新文字

此元件使用 Scikit-learn 程式庫。 如需 Scikit-learn 的詳細資訊,請參閱 GitHub 存放庫,其中包含教學課程和演算法說明。

深入了解隱含狄利克雷分佈

LDA 通常不是用於分類的方法, 但是此方法會使用生成方法,因此您不需要提供已知的類別標籤再推斷模式。 相反地,此演算法會產生用來識別主題群組的機率模型。 您可以使用此機率模型分類現有的定型案例,或是您提供給模型做為輸入的新案例。

您可能會偏好使用生成式模型,因為如此可避免對文字和分類之間的關聯性做出強烈假設。 這種模型只會使用字詞的分佈,以數學方式建立主題模型。

這項理論的討論可參閱此研究論文 (可下載為 PDF):Latent Dirichlet Allocation: Blei, Ng, and Jordan

此元件中的實作會根據 LDA 的 Scikit-learn 程式庫

如需詳細資訊,請參閱技術說明一節。

如何設定隱含狄利克雷分佈

此元件需要包含文字資料行的資料集,原始或預先處理過的都可以。

  1. 隱含狄利克雷分佈元件新增至您的管線。

    在 [文字分析]下的資產清單中,將隱含狄利克雷分佈元件拖放到畫布上。

  2. 提供包含一或多個文字資料行的資料集,作為元件的輸入。

  3. 針對目標資料行,選擇包含待分析文字的一個或多個資料行。

    您可以選擇多個資料行,但必須都是字串資料類型。

    因為 LDA 會根據文字建立大型的特徵矩陣,因此通常是分析單一文字資料行。

  4. 針對模型的主題數目,請輸入介於 1 到 1000 之間的整數,指出您想要從輸入文字衍生的類別或主題數目。

    預設會建立 5 個主題。

  5. 針對 N 元語法,請指定雜湊處理期間可產生的 N 元語法長度上限。

    預設值為 2,表示會產生雙字母組和單字母組。

  6. 選取 [正規化] 選項將輸出值轉換為機率。

    輸出和特徵資料集的值在轉換後不會以整數表示,而是轉換如下:

    • 資料集的值會以機率表示:P(topic|document)

    • 特徵主題矩陣中的值會以機率表示:P(word|topic)

    注意

    在 Azure Machine Learning 設計工具中,Scikit-learn 程式庫自 0.19 版起不再支援非正規化的 doc_topic_distr 輸出。 在此元件中,[正規化] 參數只能套用至特徵主題矩陣輸出。 轉換的資料集輸出一律會正規化。

  7. 選取選項 [顯示所有選項],如果您想設定下列進階參數,請設置為 TRUE

    這些參數專門用於 LDA 的 Scikit-learn 實作。 在 Scikit-learn 中有一些不錯的 LDA 教學課程,以及官方的 Scikit-learn 文件

    • Rho 參數。 為主題分佈的稀疏性提供事前機率。 此參數會對應至 sklearn 的 topic_word_prior 參數。 如果您預期字組的分佈是平面的,請使用值 1,這表示所有字組都假設為機率相等。 如果您認為大部分的字組分佈稀疏,可以將其設定為較低的值。

    • Alpha 參數。 針對每個文件主題權重的稀疏性指定事前機率。 此參數會對應至 sklearn 的 doc_topic_prior 參數。

    • 估計的文件數目。 輸入數字,代表待處理文件 (資料列) 數目的最佳預估。 此參數可讓元件配置大小充足的雜湊表。 這對應至 Scikit-learn 中的 total_samples 參數。

    • 批次的大小。 輸入數字,表示傳送至 LDA 模型的每個文字批次中要包含多少資料列。 此參數對應至 Scikit-learn 中的 batch_size 參數。

    • 學習更新排程中所使用的反覆運算初始值。 指定起始值,降低線上學習中早期反覆運算學習率的權重。 此參數對應至 Scikit-learn 中的 learning_offset 參數。

    • 更新期間套用至反覆運算的功率。 指出套用至反覆運算計數的功率等級,以控制線上更新期間的學習速度。 此參數對應至 Scikit-learn 中的 learning_decay 參數。

    • 資料的處理次數。 指定演算法將在資料上迴圈的最大次數。 此參數對應至 Scikit-learn 中的 max_iter 參數。

  8. 若想要在分類文字之前在初次執行中建立 N 元語法,請選取選項 [建構 N 元語法字典] 或 [在 LDA 之前建構 N 元語法字典]。

    如果您事先建立初始字典,則稍後可以在查看模型時使用字典。 能夠將結果對應至文字 (而不是數值索引),通常比較容易轉譯。 不過,儲存字典需要較長的時間,並會使用額外的儲存體。

  9. 針對N 元語法字典的大小上限,請輸入可在 N 元語法字典中建立的資料列總數。

    此選項可有效控制字典的大小。 但是,如果輸入中的 N 元語法數目超過此大小,則可能會發生衝突。

  10. 提交管線。 LDA 元件會使用貝氏機率分類理論來判斷哪些主題可能與個別字組相關。 字組並不會僅與某一主題或群組相關聯。 相反地,每個 N 元語法具有與任何探索到類別相關聯的學習可能性。

結果

元件有兩個輸出:

  • 已轉換的資料集:此輸出包含輸入文字、指定數目的已探索類別,以及每個類別的個別文字範例分數。

  • 特徵主題矩陣:最左邊的資料行包含已擷取的文字特徵。 每個類別的資料行都包含該分類中該特徵的分數。

LDA 轉換

此元件也會輸出將 LDA 套用至資料集的 LDA 轉換

您可以儲存此轉換,並重複套用至其他資料集。 如果您已經定型大型主體,並且想要重複使用係數或類別,這項技巧可能會很有用。

若要重複使用此轉換,請選取隱含狄利克雷分佈元件右側面版的註冊資料集圖示,以將元件保留在元件清單的資料集類別中。 接著可以將此元件連接至套用轉換元件,以重複使用此轉換。

精簡 LDA 模型或結果

一般來說,您無法建立能滿足所有需求的單一 LDA 模型。 即使是針對一個工作所設計的模型,也可能需要許多反覆項目來改善精確度。 建議您嘗試所有這些方法來改善您的模型:

  • 變更模型參數
  • 透過視覺效果了解結果
  • 取得主題專家的意見反應,判斷產生的主題是否有用

質化量值也有助於評估結果。 若要評估主題模型化結果,請考慮下列項目:

  • 精確度。 類似項目是否真的類似?
  • 多樣性。 當商務問題有需要時,模型是否可以區分類似項目?
  • 延展性。 模型是否適用於各式各樣的文字類別,或僅適用於較窄的目標定意域?

您通常可以使用自然語言處理來清除、摘要和簡化,或是分類文字,藉此改善以 LDA 為基礎的模型精確度。 例如,下列技術 (Azure Machine Learning 全部支援) 可以改善分類的精確度:

  • 停用字詞移除

  • 大小寫正規化

  • 詞形歸併還原或詞幹分析

  • 具名實體辨識

如需詳細資訊,請參閱前置處理文字

在設計工具中,您也可以使用 R 或 Python 程式庫進行文字處理:執行 R 指令碼執行 Python 指令碼

技術說明

本節包含實作詳細資料、提示和常見問題集的解答。

實作詳細資料

根據預設,已轉換資料集和特徵主題矩陣的輸出分佈會正規化為機率:

  • 已轉換的資料集會正規化為文件指定主題的條件機率。 在此案例中,每個資料列的加總會等於 1。

  • 特徵主題矩陣會正規化為字組指定主題的條件機率。 在此案例中,每個資料行的加總會等於 1。

提示

有時候元件可能會傳回空白主題。 最常見的原因是演算法的虛擬隨機初始化。 如果發生這種情況,您可以嘗試變更相關的參數。 例如,變更 N 元語法字典的大小上限,或變更特徵雜湊所使用的位元數。

LDA 和主題模型化

隱含狄利克雷分佈通常用於以內容為基礎的主題模型化,基本上是指從未分類文字學習類別目錄。 在以內容為基礎的主題模型化中,主題是字組的分佈。

例如,假設您已提供客戶評論的主體,其中包含許多產品。 客戶在一段時間內提交的評論文字包含許多字詞,其中有一些用於多個主題。

LDA 流程識別的「主題」可能代表個別產品的評論,或是代表一組產品評論。 對 LDA 而言,主題本身就是一組字組在一段時間的機率分佈。

字詞很少僅限於任一項產品。 這些字詞可以指涉其他產品,也可以是通用性的一般字詞 (「很棒」、「糟糕」)。 其他字詞可能是非搜尋字。 但是,LDA 方法不會嘗試擷取內容中的所有字組,或理解字組的相關性,而是關注同時出現的機率。 此方法只能分組目標定義域中使用的字組。

計算字詞索引之後,以距離為基礎的相似性量值會比較個別的文字資料列,藉此判斷兩段文字是否類似。 例如,您可能會發現產品有多個明顯相互關聯的名稱。 或者,您可能會發現強烈的負面字詞通常與特定產品相關聯。 您可以使用相似性量值來識別相關的字詞,以及建立建議。

元件參數

名稱 類型 範圍 選擇性 預設 描述
目標資料行 資料行選取 必要 StringFeature 目標資料行名稱或索引。
模型的主題數目 整數 [1;1000] 必要 5 依據 N 個主題為文件分佈建立模型。
N 字母組 整數 [1;10] 必要 2 雜湊期間產生的 N 元語法順序。
正規化 Boolean True 或 False 必要 true 將輸出正規化為機率。 已轉換的資料集將會是 P(topic|document),而特徵主題矩陣將會是 P(word|topic)。
顯示所有選項 Boolean True 或 False 必要 False 提供 Scikit-learn 線上 LDA 專用的其他參數。
Rho 參數 Float [0.00001;1.0] 在勾選 [顯示所有選項] 核取方塊時套用 0.01 主題字組的事先分佈。
Alpha 參數 Float [0.00001;1.0] 在勾選 [顯示所有選項] 核取方塊時套用 0.01 文件主題的事前分佈。
估計的文件數目 整數 [1;int.MaxValue] 在勾選 [顯示所有選項] 核取方塊時套用 1000 估計的文件數目。 對應至 total_samples 參數。
批次的大小 整數 [1;1024] 在勾選 [顯示所有選項] 核取方塊時套用 32 批次的大小。
學習率更新排程中所使用的反覆運算初始值 整數 [0;int.MaxValue] 在勾選 [顯示所有選項] 核取方塊時套用 0 起始值,可降低線上學習中早期反覆運算學習率的權重。 對應至 learning_offset 參數。
更新期間套用至反覆運算的功率 Float [0.0;1.0] 在勾選 [顯示所有選項] 核取方塊時套用 0.5 套用至反覆運算計數的功率,用以控制學習速度。 對應至 learning_decay 參數。
反覆定型的次數 整數 [1;1024] 在勾選 [顯示所有選項] 核取方塊時套用 25 定型反覆運算的次數。
建立 N 元語法字典 Boolean True 或 False 在「未勾選」[顯示所有選項] 時套用 True 在計算 LDA 之前,先建立 N 元語法的字典。 適用於模型檢查和轉譯。
N 元語法字典的大小上限 整數 [1;int.MaxValue] 當選項 [建構 N 元語法字典] 為 True 時套用 20000 N 元語法字典的大小上限。 如果輸入中的 N 元語法數目超過此大小,則可能會發生衝突。
特徵雜湊所使用的位元數。 整數 [1;31] 在「未勾選」[顯示所有選項] 核取方塊,且 [建立 N 元語法字典] 為 False 時套用 12 特徵雜湊所使用的位元數。
在 LDA 之前建立 N 元語法字典 Boolean True 或 False 在勾選 [顯示所有選項] 核取方塊時套用 True 在 LDA 之前,先建立 N 元語法的字典。 適用於模型檢查和轉譯。
字典中的 N 元語法數目上限 整數 [1;int.MaxValue] 在勾選 [顯示所有選項] 核取方塊,且 [建立 N 元語法字典] 為 True 時套用 20000 字典的大小上限。 如果輸入中的 N 元語法數目超過此大小,則可能會發生衝突。
雜湊位元數 整數 [1;31] 在勾選 [顯示所有選項] 核取方塊,且 [建立 N 元語法字典] 為 False 時套用 12 特徵雜湊處理時所使用的位元數。

後續步驟

請參閱 Azure Machine Learning 可用的元件集

如需元件特定的錯誤清單,請參閱設計工具的例外狀況和錯誤碼