Przewodnik umieszczania tekstu w Androidzie

Zadanie MediaPipe Text Embedder pozwala utworzyć liczbową reprezentację danych tekstowych w celu zebrania ich semantycznego znaczenia. W tych instrukcjach pokazujemy, jak korzystać z kreatora tekstu w aplikacjach na Androida.

Więcej informacji o możliwościach, modelach i opcjach konfiguracji tego zadania znajdziesz w sekcji Omówienie.

Przykładowy kod

Przykładowy kod MediaPipe Tasks to prosta implementacja aplikacji do umieszczania tekstu na Androidzie. W tym przykładzie oceniono podobieństwa semantyczne między 2 fragmentami tekstu i wymagamy fizycznego urządzenia z Androidem lub emulatora Androida.

Możesz użyć aplikacji jako punktu wyjścia dla własnej aplikacji na Androida lub skorzystać z niej podczas modyfikowania istniejącej aplikacji. Przykładowy kod do umieszczania tekstu jest hostowany na GitHub.

Pobieranie kodu

Z instrukcji poniżej dowiesz się, jak utworzyć lokalną kopię przykładowego kodu za pomocą narzędzia wiersza poleceń git.

Aby pobrać przykładowy kod:

  1. Sklonuj repozytorium git za pomocą tego polecenia:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Opcjonalnie skonfiguruj instancję git tak, aby używała rozproszonego procesu płatności, aby mieć tylko pliki dla przykładowej aplikacji do umieszczania tekstu:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_embedder/android
    

Po utworzeniu lokalnej wersji przykładowego kodu możesz zaimportować projekt do Android Studio i uruchomić aplikację. Instrukcje znajdziesz w przewodniku konfiguracji na Androida.

Kluczowe elementy

Te pliki zawierają kluczowy kod tej przykładowej aplikacji do umieszczania tekstu:

  • TextEmbedderHelper.kt: inicjuje narzędzie do umieszczania tekstu oraz obsługuje wybór modelu i przedstawicieli.
  • MainActivity.kt: implementacja aplikacji i tworzenie komponentów interfejsu użytkownika.

Konfiguracja

W tej sekcji znajdziesz opis kluczowych kroków, które należy wykonać, aby skonfigurować środowisko programistyczne i projekty kodu związane z umieszczaniem tekstu. Ogólne informacje o konfigurowaniu środowiska programistycznego na potrzeby zadań MediaPipe, w tym o wymaganiach dotyczących wersji platformy, znajdziesz w przewodniku konfiguracji na Androida.

Zależności

Umieszczony tekst korzysta z bibliotek com.google.mediapipe:tasks-text. Dodaj tę zależność do pliku build.gradle swojego projektu na Androida. Możesz zaimportować wymagane zależności za pomocą tego kodu:

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

Model

Zadanie MediaPipe Text Embedder wymaga wytrenowanego modelu zgodnego z tym zadaniem. Więcej informacji o dostępnych wytrenowanych modelach do umieszczania tekstu znajdziesz w sekcji poświęconej modelom – omówieniem zadań.

Wybierz i pobierz model, a następnie zapisz go w katalogu projektu:

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

Podaj ścieżkę modelu w parametrze ModelAssetPath. W przykładowym kodzie model jest zdefiniowany w funkcji setupTextEmbedder() w pliku TextEmbedderHelper.kt:

Użyj funkcji BaseOptions.Builder.setModelAssetPath(), aby określić ścieżkę używaną przez model. Tę metodę omówimy w przykładowym kodzie w następnej sekcji.

Tworzenie zadania

Aby utworzyć zadanie, możesz użyć jednej z funkcji createFrom...(). Funkcja createFromOptions() akceptuje opcje konfiguracji umożliwiające ustawienie opcji umieszczania. Możesz też zainicjować zadanie za pomocą funkcji fabrycznej createFromFile(). Funkcja createFromFile() akceptuje ścieżkę względną lub bezwzględną do wytrenowanego pliku modelu. Więcej informacji o opcjach konfiguracji znajdziesz w artykule Opcje konfiguracji.

Poniższy kod pokazuje, jak skompilować i skonfigurować to zadanie.

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

Przykładowy kod implementuje opcje umieszczania tekstu w funkcji setupTextEmbedder() w pliku TextEmbedderHelper.kt.

Opcje konfiguracji

To zadanie ma te opcje konfiguracji aplikacji na Androida:

Nazwa opcji Opis Zakres wartości Wartość domyślna
l2_normalize Określa, czy znormalizować zwrócony wektor cech z normą L2. Użyj tej opcji tylko wtedy, gdy model nie zawiera jeszcze natywnej operacji L2_NORMALIZATION TFLite. W większości przypadków tak się dzieje i w ten sposób można uzyskać normalizację L2 za pomocą wnioskowania TFLite bez potrzeby użycia tej opcji. Boolean False
quantize Określa, czy zwrócone umieszczenie ma zostać poddane kwantyzacji do liczby bajtów za pomocą kwantyzacji skalarnej. Osadzone elementy są domyślnie uznawane za normę jednostki, dlatego każdy wymiar na pewno ma wartość [-1,0, 1,0]. Jeśli tak nie jest, użyj opcji l2_normalize. Boolean False

Przygotuj dane

Umieszczony tekst obsługuje dane tekstowe (String). To zadanie obsługuje wstępne przetwarzanie danych wejściowych, w tym tokenizację i wstępne przetwarzanie tensorów. Przetwarzanie wstępne jest realizowane w ramach funkcji embed(). Nie ma potrzeby wcześniejszego wstępnego przetwarzania tekstu wejściowego.

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

Uruchamianie zadania

Umieszczony tekst używa funkcji embed do aktywowania wnioskowania. W przypadku umieszczania tekstu oznacza to zwrócenie wektorów reprezentacji dla tekstu wejściowego.

Poniższy kod pokazuje, jak wykonywać przetwarzanie za pomocą modelu zadań.

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

W przykładowym kodzie funkcja embed jest wywoływana w pliku TextEmbedderHelper.kt.

Obsługa i wyświetlanie wyników

Po uruchomieniu wnioskowania zadanie umieszczania tekstu zwraca obiekt TextEmbedderResult zawierający listę reprezentacji właściwościowych (zmiennoprzecinkowych lub kwantyzowanych skalarnie) dla tekstu wejściowego.

Poniżej znajdziesz przykład danych wyjściowych z tego zadania:

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

Możesz porównać semantyczne podobieństwo 2 wektorów dystrybucyjnych za pomocą funkcji TextEmbedder.cosineSimilarity. Przykład znajdziesz poniżej.

val similarity = TextEmbedder.cosineSimilarity(firstEmbed, secondEmbed)

W przykładowym kodzie funkcja TextEmbedder.cosineSimilarity() jest wywoływana w pliku TextEmbedderHelper.kt.