Тематический текст и сходство пользователей

Я пытаюсь вычислить сходство между пользователями и текстовыми документами, используя их тематические представления. т.е. каждый документ и пользователь представлены вектором тем (например, нейронауки, технологии и т. д.) и тем, насколько эта тема актуальна для пользователя/документа.

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

Я пытался использовать корреляцию Пирсона, но в конечном итоге она занимает слишком много памяти и времени, когда достигает ~ 40 тыс. статей, а длина векторов составляет около 10 тыс.

Я использую numpy.

Можете ли вы представить себе лучший способ сделать это? или это неизбежно (на одной машине)?

Спасибо


person user1491915    schedule 03.10.2012    source источник


Ответы (3)


Я бы рекомендовал для этого просто использовать gensim вместо создания собственного.

person Robert Kern    schedule 03.10.2012
comment
Просто чтобы понять: что gensim сделал бы для меня, так это уменьшение размерности (с использованием lsi или lda), верно? Для поиска сходства по-прежнему будет использоваться что-то вроде корреляции Пирсона, верно? - person user1491915; 04.10.2012

Не совсем понимаю, почему вы в конечном итоге занимаете слишком много памяти только для вычисления корреляции для O(n^2) пары элементов. Чтобы рассчитать корреляцию Пирсона, как указано в статье в Википедии, введите здесь описание изображения

То есть, чтобы получить corr(X,Y), вам нужно только два вектора одновременно. Если вы обрабатываете свои данные по одной паре за раз, память вообще не должна быть проблемой.

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

Что касается времени вычисления, я полностью понимаю, потому что вам нужно сравнить это для O(n^2) пары элементов.


Известно, что Gensim может работать со скромными требованиями к памяти (‹ 1 Гб) на одном ЦП / настольном компьютере в разумные сроки. Проверьте это об эксперименте, который они провели с набором данных объемом 8,2 ГБ с использованием MacBook Pro, Intel Core. i7 2,3 ГГц, 16 ГБ оперативной памяти DDR3. Я думаю, что это больший набор данных, чем у вас есть.


Если у вас есть еще больший набор данных, вы можете попробовать распределенную версию gensim или даже отобразить/уменьшить.

Другой подход — попробовать хэширование с учетом местоположения.

person greeness    schedule 26.10.2012

Мои трюки заключаются в использовании поисковой системы, такой как ElasticSearch, и она работает очень хорошо, и таким образом мы унифицировали API всех наших рекомендуемых систем. Подробности перечислены ниже:

  • Обучение тематической модели по вашему корпусу, каждая тема представляет собой массив слов, и каждое слово с вероятностью, и мы берем первые 6 наиболее вероятных слов как представление темы.
  • Для каждого документа в вашем корпусе мы можем вывести для него распределение тем, распределение представляет собой массив вероятностей для каждой темы.
  • Для каждого документа мы генерируем поддельный документ с распределением тем и представлением тем, например, размер поддельного документа составляет около 1024 слов.
  • Для каждого документа мы генерируем запрос с распределением тем и представлением тем, например размер запроса составляет около 128 слов.

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

  • Получите запрос для вашего документа, а затем выполните поиск по запросу в ваших поддельных документах.

Мы нашли этот способ очень удобным.

person Mountain    schedule 25.02.2013
comment
А как же рекомендации? Как вы представляете своих пользователей? - person user1491915; 25.02.2013
comment
Я думаю, что вы можете представить пользователя как страницы, которые он посетил, и одно посещение будет считаться одним разом. Это должно быть осуществимо. - person Mountain; 25.02.2013
comment
О вашей проблеме с памятью: длина векторов составляет около 10 000, что означает, что у вас есть ~ 10 000 тем, я думаю, это слишком много. В наших случаях у нас было 20 тысяч документов и всего 512 тем, и мы нашли результат приемлемым. - person Mountain; 25.02.2013
comment
проверьте мой новый проект github.com/guokr/simbase, это поможет вам вычислить сходство наборов векторов. - person Mountain; 12.06.2014