Добро пожаловать в мир нечеткого семантического поиска! Это мощный метод поиска, который сочетает в себе нечеткое сопоставление и семантический поиск для получения точных и релевантных результатов поиска. Он широко используется в различных областях, таких как электронная коммерция, здравоохранение и финансы, и это лишь некоторые из них.

Нечеткий семантический поиск может сопоставлять слова или фразы, даже если они пишутся по-разному, и понимает значение слов и контекст, в котором они используются. Сочетание этих двух методов позволяет получить более точные и релевантные результаты поиска.

В этом блоге мы увидим, как реализовать это с нуля. перед этим мы увидим некоторые преимущества нечеткого семантического поиска.

Нечеткий семантический поиск имеет много преимуществ. Он обеспечивает более точные результаты поиска по сравнению с традиционными методами поиска. Это улучшает взаимодействие с пользователем, предоставляя более релевантные результаты поиска, которые могут помочь пользователям быстрее и легче находить то, что они ищут. Это также помогает организациям сэкономить время и деньги за счет сокращения количества нерелевантных результатов поиска, что может повысить эффективность процесса поиска.

Для реализации нечеткого семантического поиска мы можем использовать Faiss, библиотеку с открытым исходным кодом для эффективного поиска сходства и кластеризации плотных векторов. Faiss предоставляет широкий спектр алгоритмов поиска сходства, включая LSH, PCA и IVF. Он широко используется в различных областях, включая компьютерное зрение, обработку естественного языка и рекомендательные системы.

Реализация нечеткого семантического поиска с использованием Faiss включает несколько этапов.

  1. Предварительная обработка данных. Первым шагом в реализации нечеткого семантического поиска является предварительная обработка данных. Это включает в себя очистку данных, удаление стоп-слов и преобразование текста в векторное представление.
def preprocess_text(text):
    stop_words = set(stopwords.words('english'))
    tokens = word_tokenize(text)
    tokens = [token.lower() for token in tokens if token.isalpha() and token.lower() not in stop_words]
    return ' '.join(tokens)

Это можно сделать с помощью различных методов, включая TF-IDF, word2Vec и Doc2Vec, в данном случае я использую кодировщик Universal Sentence.

embed = hub.load('https://tfhub.dev/google/universal-sentence-encoder-large/5')

dataset = pd.DataFrame({'text': ['The quick brown fox jumps over the lazy fox',
                                 'A quick brown dog jumps over the lazy fox',
                                 'The quick brown fox jumps over the lazy cat',
                                 'The quick brown cat jumps over the lazy dog',
                                 'A quick brown fox jumps over the lazy dog']})

def encode_text(text):
    embedding = embed([text]).numpy()
    return embedding

def get_embedding():
    embeddings = []
    for text in dataset['text']:
        preprocessed_text = preprocess_text(text)
        embedding = encode_text(preprocessed_text)
        embeddings.append(embedding)
    embeddings = np.concatenate(embeddings, axis=0)
    return embeddings

2. Построение и индексация.Следующий шаг — создание индекса с помощью Faiss. Это включает в себя создание объекта индекса и добавление векторных представлений данных в индекс. Это можно сделать с помощью различных методов индексации, включая LSH, PCA и IVF.

vectors = get_embedding()

index = faiss.IndexFlatIP(vectors.shape[-1])

def build_index(self):
    embeddings = np.array(vectors)
    index.add(embeddings)

3. Семантический поиск. Следующим шагом является выполнение семантического поиска по поисковому запросу. Это предполагает использование векторного представления поискового запроса для поиска похожих векторов в индексе. Это можно сделать с помощью различных мер подобия, включая косинусное сходство и евклидово расстояние.

4. Нечеткое сопоставление: последний шаг — выполнение семантического поиска по поисковому запросу. Это можно сделать с помощью различных методов, включая расстояние Яро-Винкера, расстояние Левенштейна и сходство N-грамм.

def search(query, k=5, threshold=0):
    preprocessed_query = preprocess_text(query)
    embedding = encode_text(preprocessed_query)
    #Semantic Search
    distances, indices = index.search(embedding.reshape(1, -1), k)
    results = []
    for distance, index in zip(distances[0], indices[0]):
        text = dataset.iloc[index]['text']
        #Fuzzy matching
        score = fuzz.token_sort_ratio(preprocessed_query, self.preprocess_text(text))
        if score >= threshold:
            results.append({'text': text, 'score': score, 'distance': distance})
    #Sorting based on semantic distance and fuzzy matching ratio
    results = sorted(results, key=lambda x: (x['distance'], x['score']), reverse=True)[:k]
    return results
query = 'fax'
results = fuzzy_semantic_search.search(query)
>>result
[
  {'text': 'The quick brown fox jumps over the lazy cat', 'score': 12, 'distance': 0.087689355}
  {'text': 'The quick brown fox jumps over the lazy fox', 'score': 12, 'distance': 0.082839005}
  {'text': 'A quick brown fox jumps over the lazy dog', 'score': 12, 'distance': 0.053157043}
  {'text': 'A quick brown dog jumps over the lazy fox', 'score': 12, 'distance': 0.051227365}
  {'text': 'The quick brown cat jumps over the lazy dog', 'score': 6, 'distance': 0.037477486}
]

В заключение:
Нечеткий семантический поиск — это мощный метод поиска, который может обеспечить более точные и релевантные результаты поиска. Внедряя его с помощью Faiss, организации могут повысить точность результатов поиска, улучшить взаимодействие с пользователем и повысить эффективность. Итак, давайте нечетко сопоставим и семантически поищем наш путь к успеху!

полный блокнот проекта ссылка

Следуйте за мной на Medium и LinkedIn, чтобы узнать больше о науке о данных и статьях, связанных с глубоким обучением.