Допустим, у вас есть две любимые книги. Вы замучили Goodreads, Amazon и бог знает что ещё, где можно подбирать похожие произведения, и прочли всё, что так или иначе сравнимо с теми вашими двумя любимыми.
Но вам, возможно, никогда не приходило в голову попробовать найти книги, похожие одновременно на ваши две любимые. Потому что трудно представить, как это вообще возможно. Искать книги, в названиях или описаниях которых есть и те и другие термины? Получится бессмыслица.
Но можно использовать другой подход. И прийти к невообразимому результату. Всё что нужно - искать не книги с похожими названиями, а книги, похожие по смыслу. Причём одновременно похожие по смыслу на те две, что нас интересуют изначально в первую очередь.
Задача, действительно, кажется невыполнимой. Но современные методики и алгоритмы машинного обучения уже давно имеют в своём арсенале инструментарий, способный решить задачу выше.
Как это устроено?
Есть уже натренированные нейронные сети, умеющие размещать в многомерном пространстве слова, концепции, предложения и даже небольшие тексты. Эти модели называются “трансформеры”. Они натренированы на огромном количестве текстовых данных и умеют прекрасно конвертировать тексты в наборы цифр (векторы) и размещать эти векторы в многомерном пространстве. Каждое из измерений этого пространства представляет собой некую ось некого смысла. И таких осей в этом пространстве очень много.
Так вот, если взять десятки или сотни тысяч описаний к книгам и конвертировать эти книги в векторы с помощью трансформеров, то получим многомерное евклидово пространства книг, где каждая книга находится от всех других книг на таком расстоянии, насколько она похожа или не похожа на них, соответственно. Другими словами, книги о политике будут рядом друг с другом и они будут достаточно далеко от книг для детей. Книги для 3-летних детей будут ближе друг к другу, чем книги для всех детей. И так далее.
Имея описание любой из книг, мы конвертируем его в вектор и “просим у пространства” выдать нам самые близкие к этому вектору другие векторы. Так мы получаем наиболее похожие книги относительно той, что нас интересует.
А теперь вернёмся к нашей первоначальной задаче. Как найти книги, одновременно похожие на две книги одновременно? Очень просто: берём линейную алгебру и считаем средний вектор между двумя имеющимися векторами. Размещаем полученный средний вектор в нашем пространстве книг и просим предоставить нам самые близкие к нему векторы-книги. И знаете что? Это работает безупречно!
В качестве эксперимента я взял 80000 лучших книг и построил из них многомерное пространство всех их описаний. Затем я взял случайную книгу об Аврааме Линкольне и случайную книгу для маленьких детей о животных. Конвертировал их описания в векторы и посчитал между ними средний вектор. Разместил средний вектор в пространстве из 80000 книг и запросил все самые ближние к нему точки. В результате получил набор книг, одновременно похожие на две интересующие: о Линкольне и на ту вторую для детей. Вот как выглядит результат:
Время сделать этот функционал доступным публично 😉
Comments