Поезд doc2vec для сходства названий компаний
Я пытаюсь дедуплицировать огромный список компаний (более 40 млн.), Используя сходство названий. У меня 500K пар названий компаний, помеченных одинаково / не одинаково (например, IBM =International Business Machines). Модель, построенная с помощью логистической регрессии по разнице векторов пар имен, имеет большой f-показатель (0,98), но вывод (поиск наиболее похожих имен) слишком медленный (почти 2 секунды на имя).
Можно ли обучить модель doc2vec с использованием пар сходства имен (положительных и отрицательных), в результате чего у сходных имен будут похожие векторы, чтобы я мог использовать быстрые алгоритмы векторного сходства, такие как Annoy?
1 ответ
Поиск топ-N ближайших соседей в многомерных пространствах затруднен. Чтобы получить совершенно точную топ-N, обычно требуется исчерпывающий поиск, что, вероятно, и является причиной вашей неутешительной работы.
Когда может быть применено некоторое индексирование, как с библиотекой ANNOY, требуется дополнительное время индексации и хранение индекса, а точность жертвуется, потому что некоторые из истинных соседей top-N могут быть пропущены.
Вы не упомянули, как создаются ваши существующие векторы. Вам не нужно применять новый метод создания вектора (например, doc2vec) для использования индексации; Вы можете применять библиотеки индексации к существующим векторам.
Если ваши существующие векторы редки (как, например, если они представляют собой представления типа "большой мешок символов-н-граммов", со многими измерениями, но чаще всего с 0.0), вы можете заглянуть в библиотеку Facebook PySparNN.
Если они плотные, в дополнение к раздражающей, которую вы упомянули, Facebook FAISS можно рассмотреть.
Кроме того, даже исчерпывающий поиск соседей очень распараллелен: разбить данные на M сегментов в M различных системах, и найти top-N в каждой из них часто близко к 1/Nth времени одной и той же операции на полной индекс, затем объединение M топ-N списков относительно быстро. Так что, если вы находите самое похожее, это ваше ключевое узкое место, и вам нужно самое похожее на топ-N, скажем, в 100 мс, бросьте 20 машин на 20 осколков проблемы.
(Точно так же результаты N лучших результатов для всех могут стоить пакетного расчета. Если вы используете облачные ресурсы, арендуйте 500 машин для выполнения 40 миллионов операций за 2 секунды, и вы сделаете это менее чем за два дня.)