Как реализовать семантический поиск в R или Python

Вопрос или проблема

У меня есть задача предоставить возможности семантического поиска. Например, если у меня есть набор данных резюме и если я ищу “машинное обучение”, то он должен вернуть мне все резюме, которые имеют навыки, связанные с наукой о данных, несмотря на отсутствие ключевого слова “машинное обучение”. Как же мы можем искать данные по их значению и связанным ключевым словам, интересно? Я проверил многие алгоритмы, такие как LSA, LDA, LSI, но не смог найти ресурс, который бы предоставлял реализацию вышеупомянутого.

Существует множество возможных вариантов.

Один из вариантов — создать словарь связанных терминов. Затем искать документы, которые содержат эти связанные термины.

Это можно сделать с помощью встроенных структур данных, таких как dict в Python, и инструментов сопоставления шаблонов, таких как регулярные выражения (regex).

Я вижу два способа сделать это:

  1. Подход на основе правил:

Вы можете создать список ключевых слов, например:

keywords = ['machine-learning', 'machine learning', 'AI', ...]

А затем вы можете осуществлять поиск по документам, которые у вас есть.

  1. Подход на основе BERT:

Вот базовый код, который вы можете использовать:

from transformers import AutoTokenizer, AutoModel
import torch

tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
model = AutoModel.from_pretrained('bert-base-uncased')
def encode(text):
    inputs = tokenizer.encode_plus(text, return_tensors="pt", max_length=512, truncation=True)
    outputs = model(**inputs)
    return outputs.last_hidden_state[:, 0, :].detach().numpy()

resumes = [...]  # список резюме
resume_vectors = [encode(resume) for resume in resumes]
query_vector = encode("machine learning")
from sklearn.metrics.pairwise import cosine_similarity

similarities = [cosine_similarity(query_vector, resume_vector) for resume_vector in resume_vectors]
top_resumes = sorted(zip(resumes, similarities), key=lambda x: x[1], reverse=True)

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

Ответ или решение

Реализация семантического поиска на R или Python

Семантический поиск представляет собой метод, который позволяет находить документы на основе их содержания и значений, а не просто по совпадению ключевых слов. Это особенно полезно, например, при поиске резюме, где важно учитывать смежные навыки и темы, а не только конкретные слова запроса. В данной статье мы рассмотрим два основных подхода к реализации семантического поиска: основанный на правилах и на моделях типа BERT (Bidirectional Encoder Representations from Transformers).

Подход на основе правил

Первый метод семантического поиска — это создание словаря синонимов и связанных терминов. Данный подход прост в реализации и может служить хорошей отправной точкой.

  1. Создание словаря синонимов:
    Вы можете создать список ключевых слов, связанных с вашей тематикой. Например:

    keywords = ['machine-learning', 'machine learning', 'data science', 'AI', 'deep learning']
  2. Поиск в резюме:
    Используйте регулярные выражения или встроенные структуры данных для фильтрации резюме по терминам из вашего словаря.

    import re
    
    resumes = [...]  # Здесь будет ваш список резюме
    
    def search_resumes(query, resumes, keywords):
       matches = []
       for resume in resumes:
           if any(re.search(r'\b' + kw + r'\b', resume, re.IGNORECASE) for kw in keywords):
               matches.append(resume)
       return matches
    
    found_resumes = search_resumes("machine learning", resumes, keywords)

Подход на основе BERT

Более современный и мощный метод реализации семантического поиска — использование предобученных языковых моделей, таких как BERT. Эта модель позволяет учитывать контекст слов и их взаимосвязи, что делает поиск более релевантным.

  1. Импорт необходимых библиотек:
    Убедитесь, что у вас установлены библиотеки transformers и torch. Если нет, установите их с помощью pip:

    pip install transformers torch
  2. Загрузка модели BERT:
    Вам необходимо загрузить токенизатор и модель BERT.

    from transformers import AutoTokenizer, AutoModel
    import torch
    
    tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
    model = AutoModel.from_pretrained('bert-base-uncased')
  3. Функция кодирования:
    Создайте функцию, которая преобразует текст в векторное представление.

    def encode(text):
       inputs = tokenizer.encode_plus(text, return_tensors="pt", max_length=512, truncation=True)
       outputs = model(**inputs)
       return outputs.last_hidden_state[:, 0, :].detach().numpy()
  4. Кодирование резюме и запроса:
    Преобразуйте ваши резюме и запрос в векторы.

    resumes = [...]  # Список резюме
    resume_vectors = [encode(resume) for resume in resumes]
    query_vector = encode("machine learning")
  5. Вычисление косинусного сходства:
    Используйте косинусное сходство для определения близости между запросом и резюме.

    from sklearn.metrics.pairwise import cosine_similarity
    
    similarities = [cosine_similarity(query_vector, resume_vector) for resume_vector in resume_vectors]
    top_resumes = sorted(zip(resumes, similarities), key=lambda x: x[1], reverse=True)
  6. Вывод результатов:
    Теперь вы можете вывести наиболее подходящие резюме по результатам семантического поиска.

    for resume, sim in top_resumes[:10]:  # Выводит топ-10 резюме
       print(f"Similarity: {sim}, Resume: {resume}")

Заключение

Оба предложенных подхода — как основанный на правилах, так и модель BERT — способны улучшить возможности семантического поиска в вашем проекте. Правила на основе словаря будут работать эффективно для менее сложных задач, в то время как модели глубокого обучения, такие как BERT, обеспечат более тонкое и точное понимание отношений и контекста между словами. Выбор подхода зависит от требований вашего проекта и сложности данных, с которыми вы работаете.

Оцените материал
Добавить комментарий

Капча загружается...