Wyszukiwanie tekstu umożliwia wyszukiwanie w korpusie tekstu podobnego semantycznie. Działa on w ten sposób, że osadza zapytanie w wektorze o wysokiej liczbie wymiarów, który reprezentuje znaczenie semantyczne zapytania. Następnie przeprowadza wyszukiwanie podobieństw w predefiniowanym indeksie niestandardowym za pomocą ScaNN (Scalable Nearest Neighbors).
W przeciwieństwie do klasyfikacji tekstu (np. klasyfikator języka naturalnego Bert) zwiększenie liczby rozpoznawanych elementów nie wymaga ponownego trenowania całego modelu. Nowe elementy można dodawać, po prostu ponownie tworząc indeks. Umożliwia to też pracę z większymi korpusami (ponad 100 tys. elementów).
Użyj interfejsu Task Library TextSearcher API, aby wdrożyć własny moduł wyszukiwania tekstu w aplikacjach mobilnych.
Kluczowe funkcje interfejsu TextSearcher API
Przyjmuje jako dane wejściowe pojedynczy ciąg znaków, wyodrębnia wektory dystrybucyjne i przeprowadza w indeksie wyszukiwanie najbliższych sąsiadów.
Przetwarzanie tekstu wejściowego, w tym tokenizacja Wordpiece lub Sentencepiece w grafie lub poza nim.
Wymagania wstępne
Zanim zaczniesz korzystać z interfejsu TextSearcher API, musisz utworzyć indeks na podstawie niestandardowego korpusu tekstu, w którym chcesz wyszukiwać informacje. Możesz to zrobić, korzystając z interfejsu Model Maker Searcher API. Wystarczy, że wykonasz czynności opisane w samouczku i dostosujesz je do swoich potrzeb.
W tym celu potrzebujesz:
- model osadzania tekstu TFLite, np. Universal Sentence Encoder. Na przykład:
- ponownie wytrenowany w tym Colab, który jest zoptymalizowany pod kątem wnioskowania na urządzeniu. Wyszukiwanie ciągu tekstowego na Pixelu 6 zajmuje tylko 6 ms.
- skwantyzowany, który jest mniejszy od powyższego, ale generowanie każdego osadzenia zajmuje 38 ms.
- korpusu tekstowego.
Po tym kroku powinieneś mieć samodzielny model wyszukiwarki TFLite (np. mobilenet_v3_searcher.tflite), który jest oryginalnym modelem osadzania tekstu z indeksem dołączonym do metadanych modelu TFLite.
Uruchamianie wnioskowania w Javie
Krok 1. Zaimportuj zależność Gradle i inne ustawienia
Skopiuj plik modelu wyszukiwarki .tflite do katalogu zasobów modułu Android, w którym będzie uruchamiany model. Określ, że plik nie powinien być skompresowany, i dodaj bibliotekę TensorFlow Lite do pliku build.gradle modułu:
android {
// Other settings
// Specify tflite index file should not be compressed for the app apk
aaptOptions {
noCompress "tflite"
}
}
dependencies {
// Other dependencies
// Import the Task Vision Library dependency
implementation 'org.tensorflow:tensorflow-lite-task-vision:0.4.4'
// Import the GPU delegate plugin Library for GPU inference
implementation 'org.tensorflow:tensorflow-lite-gpu-delegate-plugin:0.4.4'
}
Krok 2. Korzystanie z modelu
// Initialization
TextSearcherOptions options =
TextSearcherOptions.builder()
.setBaseOptions(BaseOptions.builder().useGpu().build())
.setSearcherOptions(
SearcherOptions.builder().setL2Normalize(true).build())
.build();
TextSearcher textSearcher =
textSearcher.createFromFileAndOptions(context, modelFile, options);
// Run inference
List<NearestNeighbor> results = textSearcher.search(text);
Więcej opcji konfigurowania TextSearcher znajdziesz w kodzie źródłowym i dokumentacji Javadoc.
Uruchamianie wnioskowania w C++
// Initialization
TextSearcherOptions options;
options.mutable_base_options()->mutable_model_file()->set_file_name(model_path);
options.mutable_embedding_options()->set_l2_normalize(true);
std::unique_ptr<TextSearcher> text_searcher = TextSearcher::CreateFromOptions(options).value();
// Run inference with your input, `input_text`.
const SearchResult result = text_searcher->Search(input_text).value();
Więcej opcji konfigurowania TextSearcher znajdziesz w kodzie źródłowym.
Uruchamianie wnioskowania w Pythonie
Krok 1. Zainstaluj pakiet TensorFlow Lite Support Pypi.
Pakiet TensorFlow Lite Support Pypi możesz zainstalować za pomocą tego polecenia:
pip install tflite-support
Krok 2. Korzystanie z modelu
from tflite_support.task import text
# Initialization
text_searcher = text.TextSearcher.create_from_file(model_path)
# Run inference
result = text_searcher.search(text)
Więcej opcji konfigurowania TextSearcher znajdziesz w kodzie źródłowym.
Przykładowe wyniki
Results:
Rank#0:
metadata: The sun was shining on that day.
distance: 0.04618
Rank#1:
metadata: It was a sunny day.
distance: 0.10856
Rank#2:
metadata: The weather was excellent.
distance: 0.15223
Rank#3:
metadata: The cat is chasing after the mouse.
distance: 0.34271
Rank#4:
metadata: He was very happy with his newly bought car.
distance: 0.37703
Wypróbuj proste narzędzie demonstracyjne CLI do TextSearcher z własnym modelem i danymi testowymi.