Android 文字嵌入指南

MediaPipe 文字嵌入工具工作可讓您建立文字資料的數值表示法,以擷取其語意含義。以下操作說明將說明如何搭配 Android 應用程式使用文字嵌入工具。

如要進一步瞭解這項工作的功能、模型和設定選項,請參閱總覽

程式碼範例

MediaPipe Tasks 範例程式碼是 Android 文字嵌入程式應用程式的簡易實作方式。這個範例會評估兩段文字之間的語意相似度,且需要實體 Android 裝置或 Android 模擬器。

您可以將該應用程式做為開發 Android 應用程式的起點,或在修改現有應用程式時參照該應用程式。文字嵌入程式範例程式碼由 GitHub 代管。

下載程式碼

以下操作說明說明如何使用 git 指令列工具建立範例程式碼的本機副本。

如要下載範例程式碼,請按照下列步驟操作:

  1. 使用下列指令複製 Git 存放區:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. 您可以選擇將 Git 執行個體設為使用稀疏檢查,因此只有 Text Embedder 範例應用程式的檔案:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_embedder/android
    

建立範例程式碼的本機版本後,您可以將專案匯入 Android Studio 並執行應用程式。如需操作說明,請參閱 Android 設定指南

重要元件

下列檔案包含此文字嵌入程式範例應用程式的重要程式碼:

設定

本節說明設定開發環境的重要步驟,以及專門用於使用文字嵌入工具的程式碼專案。如需瞭解如何使用 MediaPipe 工作設定開發環境的一般資訊,包括平台版本需求,請參閱 Android 設定指南

依附元件

文字嵌入程式使用 com.google.mediapipe:tasks-text 程式庫。將此依附元件新增至 Android 應用程式開發專案的 build.gradle 檔案。您可以使用下列程式碼匯入必要的依附元件:

dependencies {
    implementation 'com.google.mediapipe:tasks-text:latest.release'
}

型號

MediaPipe 文字嵌入程式工作需要與這項工作相容的已訓練模型。如要進一步瞭解文字嵌入工具的可用已訓練模型,請參閱工作總覽「模型」一節

選取並下載模型,然後將其儲存在專案目錄中:

<dev-project-root>/src/main/assets

ModelAssetPath 參數中指定模型的路徑。在這個範例程式碼中,模型會在 TextEmbedderHelper.kt 檔案的 setupTextEmbedder() 函式中定義:

使用 BaseOptions.Builder.setModelAssetPath() 函式指定模型使用的路徑。在下一節的程式碼範例中稱為此方法。

建立工作

您可以使用其中一個 createFrom...() 函式建立工作。createFromOptions() 函式可接受設定選項,設定嵌入工具選項。您也可以使用 createFromFile() 工廠函式將工作初始化。createFromFile() 函式會接受已訓練模型檔案的相對或絕對路徑。如要進一步瞭解設定選項,請參閱「設定選項」一文。

下列程式碼示範如何建構及設定這項工作。

val baseOptions = baseOptionsBuilder.build()
val optionsBuilder =
    TextEmbedderOptions.builder().setBaseOptions(baseOptions)
val options = optionsBuilder.build()
textEmbedder = TextEmbedder.createFromOptions(context, options)

範例程式碼實作會設定 TextEmbedderHelper.kt 檔案的 setupTextEmbedder() 函式中的文字嵌入器選項。

設定選項

這項工作的 Android 應用程式設定選項如下:

選項名稱 說明 值範圍 預設值
l2_normalize 是否使用 L2 正規化傳回的特徵向量。只有在模型不含原生 L2_NORMALIZATION TFLite Op 的情況下,才能使用這個選項。在大多數情況下,已經是此情況,L2 正規化是透過 TFLite 推論達成,不需要使用這個選項。 Boolean False
quantize 是否應透過純量量化,將傳回的嵌入量化為位元組。以隱含方式假設嵌入為單位標準,因此任何維度保證在 [-1.0, 1.0] 中都有一個值。如果並非如此,請使用 l2_正規化選項。 Boolean False

準備資料

文字嵌入程式適用於文字 (String) 資料。這項工作會處理資料輸入預先處理作業,包括代碼化和張量預先處理。所有預先處理作業都會在 embed() 函式中處理。不需要事先對輸入文字進行額外的預先處理。

val inputText = "The input text to be embedded."

執行工作

文字嵌入程式使用 embed 函式觸發推論。如果是嵌入文字,這代表傳回輸入文字的嵌入向量。

下列程式碼示範如何使用工作模型執行處理作業。

textEmbedder?.let {
    val firstEmbed =
        it.embed(firstText).embeddingResult().embeddings().first()
    val secondEmbed =
        it.embed(secondText).embeddingResult().embeddings().first()
    ...
}

在範例程式碼中,系統會在 TextEmbedderHelper.kt 檔案中呼叫 embed 函式。

處理並顯示結果

執行推論時,文字嵌入工具工作會傳回 TextEmbedderResult 物件,其中包含輸入文字的嵌入清單 (浮點或純量化)。

以下為這項工作的輸出資料範例:

TextEmbedderResult:
  Embedding #0 (sole embedding head):
    float_embedding: {0.2345f, 0.1234f, ..., 0.6789f}
    head_index: 0

您可以使用 TextEmbedder.cosineSimilarity 函式比較兩個嵌入的語意相似度。請看以下程式碼示例。

val similarity = TextEmbedder.cosineSimilarity(firstEmbed, secondEmbed)

在範例程式碼中,系統會在 TextEmbedderHelper.kt 檔案中呼叫 TextEmbedder.cosineSimilarity() 函式。