Время прочтения: 3 мин.

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

Задача поиска информации в различных документах может быть нетривиальной, если требуемая информация содержится в тексте не в том же виде, в каком мы пытаемся её искать. Для решения такой проблемы требуется более мощные средства поиска, которые позволяют находить не только полное соответствие, но и схожую по содержанию информацию. В решении данного вопроса мы можем использовать различные ML библиотеки, в данной статье будет рассматриваться библиотека SentenceTransformers.

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

Для демонстрации использования библиотеки возьмём материал статей с сайта NewTechAudit, и попробуем найти статью, сопоставляя аннотацию статьи с текстом содержимого статей. Случайным образом было выбрано 38 статей с аннотациями, после чего взята одна из аннотаций, для которой мы и будем пытаться определить текст статьи.

Для начала требуется инициализировать библиотеку и загрузить модель:

from sentence_transformers import SentenceTransformer, util
import numpy as np
#%%
model = SentenceTransformer('distiluse-base-multilingual-cased')

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

Для поиска мы будем сравнивать искомый текст с предложениями в тексте статьи, для каждой из статей, и фиксировать для какого текста мы получили наиболее высокое значение

С помощью модели выполняется формирование векторов:

article_encoded = model.encode(art_res[article_id], convert_to_tensor = True)
sentences_encoded = model.encode(sentences, convert_to_tensor = True)

Сравнение между ними мы выполняем, используя косинусный коэффициет (cosine similarity):

scores = util.pytorch_cos_sim(article_encoded, sentences_encoded)

Таким образом, итоговый текст выполняющий сравнение текстов выглядит следующим образом:

max_match = 0
article_id = 10
id_found = 0
article_encoded = model.encode(art_res[article_id], convert_to_tensor = True)
counter = 0
for i in link_text:
    sentences = i.split('.')
    sentences_encoded = model.encode(sentences, convert_to_tensor = True)
    scores = util.pytorch_cos_sim(article_encoded, sentences_encoded)
    cur_max = scores[0][np.argpartition(-scores[0], range(1))[0]]
    if max_match < cur_max:
        max_match = cur_max
        id_found = counter
    counter +=1

Для нашего случая время поиска одной аннотации в теле 38 статей занимает примерно 300 секунд, и статья была найдена успешно:

Рис.1 Пример аннотации и найденной по ней статьи.

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