Przewodnik po umieszczaniu tekstu na urządzeniach z iOS

Zadanie umieszczania tekstu pozwala utworzyć liczbową reprezentację danych tekstowych w celu uchwycenia ich semantycznego znaczenia. Z tych instrukcji dowiesz się, jak korzystać z wtyczki do wklejania tekstu w aplikacjach na iOS.

Aby zobaczyć, jak to zadanie działa w praktyce, obejrzyj to demo. Więcej informacji o możliwościach, modelach i opcjach konfiguracji tego zadania znajdziesz w sekcji Omówienie.

Przykładowy kod

Przykładowy kod funkcji Text Embedder udostępnia podstawową implementację aplikacji na iOS, która integruje to zadanie. W tym przykładzie oceniamy podobieństwo semantyczne dwóch fragmentów tekstu i wymagamy fizycznego urządzenia z iOS lub symulatora iOS.

Możesz użyć tej aplikacji jako punktu wyjścia do stworzenia własnej aplikacji na iOS lub wykorzystać ją podczas modyfikowania istniejącej aplikacji. Przykładowy kod Text Embedder znajdziesz na GitHub.

Pobieranie kodu

Z tych instrukcji 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, aby używać rzadkiego sprawdzania, dzięki czemu będziesz mieć tylko pliki przykładowej aplikacji Text Embedder:

    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_embedder/ios/
    

Po utworzeniu lokalnej wersji przykładowego kodu możesz zainstalować bibliotekę zadań MediaPipe, otworzyć projekt za pomocą Xcode i uruchomić aplikację. Instrukcje znajdziesz w Przewodniku konfiguracji dla systemu iOS.

Kluczowe komponenty

Te pliki zawierają kluczowy kod aplikacji przykładowej Text Embedder:

Konfiguracja

W tej sekcji opisaliśmy kluczowe kroki konfigurowania środowiska programistycznego i projektów kodu, aby można było używać narzędzia do wklejania tekstu. Ogólne informacje o konfigurowaniu środowiska programistycznego do korzystania z zadań MediaPipe, w tym wymagania dotyczące wersji platformy, znajdziesz w przewodniku konfiguracji dla iOS.

Zależności

Text Embedder używa biblioteki MediaPipeTasksText, którą należy zainstalować za pomocą CocoaPods. Biblioteka jest zgodna z aplikacją w języku Swift i Objective-C i nie wymaga dodatkowej konfiguracji językowej.

Instrukcje instalacji CocoaPods na macOS znajdziesz w przewodniku instalacji CocoaPods. Instrukcje tworzenia Podfile z podstawowymi komponentami potrzebnymi do działania aplikacji znajdziesz w artykule Korzystanie z CocoaPods.

Dodaj podelement MediaPipeTasksText do elementu Podfile za pomocą tego kodu:

target 'MyTextEmbedderApp' do
  use_frameworks!
  pod 'MediaPipeTasksText'
end

Jeśli Twoja aplikacja zawiera cele testu jednostkowego, zapoznaj się z przewodnikiem konfiguracji dla iOS, w którym znajdziesz dodatkowe informacje o konfigurowaniu Podfile.

Model

Zadanie MediaPipe Text Embedder wymaga wytrenowanego modelu, który jest zgodny z tym zadaniem. Więcej informacji o dostępnych wytrenowanych modelach usługi Text Embedder znajdziesz w sekcji Modele w omówieniu zadania.

Wybierz i pobierz model, a następnie dodaj go do katalogu projektu za pomocą Xcode. Instrukcje dodawania plików do projektu Xcode znajdziesz w artykule Zarządzanie plikami i folderami w projekcie Xcode.

Użyj właściwości BaseOptions.modelAssetPath, aby określić ścieżkę do modelu w pakiecie aplikacji. Przykład kodu znajdziesz w następnej sekcji.

Tworzenie zadania

Zadaniem osadzania tekstu możesz utworzyć, wywołując jedną z jego funkcji inicjującej. Inicjator TextEmbedder(options:) akceptuje wartości opcji konfiguracji.

Jeśli nie potrzebujesz modułu Text Embedder zainicjowanego za pomocą opcji niestandardowej konfiguracji, możesz użyć funkcji inicjalizującej TextEmbedder(modelPath:), aby utworzyć moduł Text Embedder z opcjami domyślnymi. Więcej informacji o opcjach konfiguracji znajdziesz w artykule Omówienie konfiguracji.

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

Swift

import MediaPipeTasksText

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "tflite")

let options = TextEmbedderOptions()
options.baseOptions.modelAssetPath = modelPath
options.quantize = true

let textEmbedder = try TextEmbedder(options: options)

Objective-C

@import MediaPipeTasksText;

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPTextEmbedderOptions *options = [[MPPTextEmbedderOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.quantize = YES;

MPPTextEmbedder *textEmbedder =
      [[MPPTextEmbedder alloc] initWithOptions:options error:nil];

Opcje konfiguracji

To zadanie zawiera te opcje konfiguracji aplikacji na iOS:

Nazwa opcji Opis Zakres wartości Wartość domyślna
l2_normalize Określa, czy zwrócony wektor cech ma być znormalizowany za pomocą normy L2. Używaj tej opcji tylko wtedy, gdy model nie zawiera już natywnej operacji TFLite L2_NORMALIZATION. W większości przypadków tak jest już w ogóle, więc normalizacja L2 jest osiągana przez wnioskowanie TFLite bez potrzeby stosowania tej opcji. Boolean False
quantize Określa, czy zwrócony embedding powinien zostać skwantowany do bajtów za pomocą kwantyzacji skalarnej. Zakłada się, że wektory mają długość jednostkową, dlatego wartość dowolnego wymiaru musi mieścić się w zakresie [-1,0, 1,0]. Jeśli nie, użyj opcji l2_normalize. Boolean False

Uruchamianie zadania

Aby osadzić tekst wejściowe i uzyskać jego wektory dystrybucyjne, można użyć metody embed(text:) z atrybutem TextEmbedder.

Swift

let result = try textEmbedder.embed(text: text)

Objective-C

MPPTextEmbedderResult *result = [textEmbedder embedText:text
                                                  error:nil];

Uwaga: zadanie blokuje bieżący wątek, dopóki nie zakończy działania wnioskowania na tekście. Aby uniknąć blokowania bieżącego wątku, przeprowadź przetwarzanie w wątku tła za pomocą frameworków iOS Dispatch lub NSOperation. Jeśli aplikacja została utworzona w Swift, możesz też użyć makro Swifta dotyczącym współbieżności do wykonywania wątków w tle.

W przykładowym kodzie metoda embed(text:) jest wywoływana w pliku TextEmbedderService.swift.

Obsługa i wyświetlanie wyników

Po przeprowadzeniu wnioskowania zadanie Text Embedder zwraca obiekt TextEmbedderResult, który zawiera listę zanurzeń (zmiennych typu float lub skalarnych) dla tekstu wejściowego.

Poniżej znajdziesz przykładowe dane wyjściowe tego zadania:

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

Możesz porównać podobieństwo semantyczne 2 embeddingów, korzystając z metody TextEmbedder.cosineSimilarity.

Swift

let similarity = try TextEmbedder.cosineSimilarity(
  embedding1: result.embeddingResult.embeddings[0],
  embedding2: otherResult.embeddingResult.embeddings[0])
    

Objective-C

NSNumber *similarity = [MPPTextEmbedder
      cosineSimilarityBetweenEmbedding1:result.embeddingResult.embeddings[0]
                          andEmbedding2:otherResult.embeddingResult.embeddings[0]
                                  error:nil];
    

W przykładowym kodzie metoda TextEmbedder.cosineSimilarity jest wywoływana w pliku TextEmbedderService.swift.