Вопрос или проблема
У меня есть задача предоставить возможности семантического поиска. Например, если у меня есть набор данных резюме и если я ищу “машинное обучение”, то он должен вернуть мне все резюме, которые имеют навыки, связанные с наукой о данных, несмотря на отсутствие ключевого слова “машинное обучение”. Как же мы можем искать данные по их значению и связанным ключевым словам, интересно? Я проверил многие алгоритмы, такие как LSA, LDA, LSI, но не смог найти ресурс, который бы предоставлял реализацию вышеупомянутого.
Существует множество возможных вариантов.
Один из вариантов — создать словарь связанных терминов. Затем искать документы, которые содержат эти связанные термины.
Это можно сделать с помощью встроенных структур данных, таких как dict
в Python, и инструментов сопоставления шаблонов, таких как регулярные выражения (regex).
Я вижу два способа сделать это:
- Подход на основе правил:
Вы можете создать список ключевых слов, например:
keywords = ['machine-learning', 'machine learning', 'AI', ...]
А затем вы можете осуществлять поиск по документам, которые у вас есть.
- Подход на основе 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).
Подход на основе правил
Первый метод семантического поиска — это создание словаря синонимов и связанных терминов. Данный подход прост в реализации и может служить хорошей отправной точкой.
-
Создание словаря синонимов:
Вы можете создать список ключевых слов, связанных с вашей тематикой. Например:keywords = ['machine-learning', 'machine learning', 'data science', 'AI', 'deep learning']
-
Поиск в резюме:
Используйте регулярные выражения или встроенные структуры данных для фильтрации резюме по терминам из вашего словаря.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. Эта модель позволяет учитывать контекст слов и их взаимосвязи, что делает поиск более релевантным.
-
Импорт необходимых библиотек:
Убедитесь, что у вас установлены библиотекиtransformers
иtorch
. Если нет, установите их с помощью pip:pip install transformers torch
-
Загрузка модели BERT:
Вам необходимо загрузить токенизатор и модель 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)
-
Вывод результатов:
Теперь вы можете вывести наиболее подходящие резюме по результатам семантического поиска.for resume, sim in top_resumes[:10]: # Выводит топ-10 резюме print(f"Similarity: {sim}, Resume: {resume}")
Заключение
Оба предложенных подхода — как основанный на правилах, так и модель BERT — способны улучшить возможности семантического поиска в вашем проекте. Правила на основе словаря будут работать эффективно для менее сложных задач, в то время как модели глубокого обучения, такие как BERT, обеспечат более тонкое и точное понимание отношений и контекста между словами. Выбор подхода зависит от требований вашего проекта и сложности данных, с которыми вы работаете.