Przewodnik po umieszczaniu tekstu na urządzeniach z iOS

Zadanie Wstawianie tekstu umożliwia tworzenie reprezentacji liczbowej danych tekstowych w celu uchwycenia ich znaczenia semantycznego. Z tych instrukcji dowiesz się, jak korzystać z funkcji dodawania 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 modułu Text Embedder zawiera podstawową implementację aplikacji na iOS, która integruje to zadanie. Przykład sprawdza podobieństwo semantyczne między 2 fragmentami tekstu i wymaga użycia 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 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 blok MediaPipeTasksText w Podfile za pomocą tego kodu:

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

Jeśli Twoja aplikacja zawiera cele testów jednostkowych, dodatkowe informacje o konfigurowaniu Podfile znajdziesz w przewodniku konfiguracji na iOS.

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, by 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. Inicjalizator TextEmbedder(options:) może przyjmować 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

W tym zadaniu dostępne są 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 umieścić tekst wejściowy i uzyskać jego wektory dystrybucyjne, możesz użyć metody embed(text:) z biblioteki 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 wnioskowania na tekst. Aby uniknąć blokowania bieżącego wątku, przeprowadź przetwarzanie w wątku tła za pomocą frameworków iOS Dispatch lub NSOperation. Jeśli Twoja aplikacja została utworzona za pomocą języka Swift, możesz też używać Swift Concurrency 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ł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ć 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.