Как стать автором
Обновить

Комментарии 17

Косинусное сходство хорошо тем, что векторизацию можно делать очень по-разному: от tf-idf до нейронных сетей, что позволяет донастроить механизм поиска под задачу.

Спасибо за интерес к посту!

Какое шикарное сравнение!

Спасибо!

Интересная работа, очень познавательно. Мы на алгоритмах решали задачи про расстояние Левенштейна, но что его можно использовать для нечеткого поиска, как-то пропустил.
Как я понял, сравнения приведены для случая поиска 1 запроса в одном документе. Если конечная цель - сервис для пользователя, то возможно придется делать индексацию документов и многократно искать уже по индексу. Чисто теоретически при создании индекса может "выиграть" другой алгоритм.

Добрый день!

Спасибо за замечание, полезное, учту в последующей работе.

Понравилась статья. Было бы интересно ещё метод триграмм увидеть в сравнении с методами из статьи.

Спасибо!

Обязательно протестирую предложенный метод.

  • Косинусы всё же не на отдельных буквах считают обычно. Хотя бы на буквосочетаниях из 2-3 букв - уже гораздо лучше разделение должно быть между похожими и не похожими. А ещё лучше - когда его на эмбеддингах используют типа Word2Vec. Чем длиннее текст, тем статистика распределения отдельных букв будет ближе к стандартному распределению частоты букв в языке, то есть тем более похожими будут тексты друг на друга. Что и наблюдается тут.

  • А ещё бывает полезно питоновский кэш использовать, только нужно сообразить на какую функцию его повесить, ещё эту функцию бывает дополнительно нужно выделить из кода. Иной раз для текстовых задачек грамотное кэширование раз в 10 работу кода ускоряет, когда вызовы каких-то функций часто повторяются с одинаковыми аргументами.

  • С точки зрения читаемости кода названия типа lev_check "не говорящие" - ну, мы что-то проверяем этой функцией, а что именно то? Лучше использовать названия типа get_levenshtein_score - тут из названия сразу понятно, что именно функция делает.

Добрый день!

1. Согласен с тем, что возможно следовало использовать буквосочетания. Наверное если подходить к вопросу таким образом, то определение порогового значения (есть искомая строка в тексте или нет) для косинусного сходства было бы проще.
2. Про кэш не подумал, спасибо за замечание. Вопрос стоит только в том, стоит ли игра свеч (использования кэша и эмбеддингов и пр., чтобы дойти до уровня работы rapidfuzz).
3. Тут каюсь, выбрал не самые говорящие имена.


Спасибо за ваш интерес к статье!

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

Добрый день!

Смогу ответить на ваш комментарий позднее.

Добрый день!

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

cosine_similarity

Раз. Авторы гоняют косинусово расстояние на буквах, что немного бессмысленно, а не хотя бы на н-граммах или предобученных векторах.

Два. Также вроде как авторы топят за скорость, но метод `pairwise_cosine`, лежащий рядом в упор не видят, и вызывают косинусное расстояние во вложенных циклах.

Не говорю уже про более продвинутые способы рассчета близости векторов для миллионов или миллиардов запросов.

Отсюда вывод - зачем вообще эта статья?

Добрый день!

Вернусь к вам с ответом позже.

Добрый день!

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

Спасибо за обратную связь!

А что за более продвинутые способы расчета близости векторов существуют?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории