Кластеризация огромного количества URL - PullRequest
3 голосов
/ 30 января 2012

Я должен найти похожие URL, такие как

http://teethwhitening360.com/teeth-whitening-treatments/18/'
«http://teethwhitening360.com/laser-teeth-whitening/22/'
«http://teethwhitening360.com/teeth-whitening-products/21/' 'http://unwanted -hair-removal.blogspot.com / 2008/03 / прорывы-в-нежелательные волосы-Remo
'http://unwanted -hair-removal.blogspot.com / 2008/03 / нежелательная-удаления волос-products.html
'http://unwanted -hair-removal.blogspot.com / 2008/03 / unwanted-hair-removal-by-shaving.ht '

и соберите их в группы или группы. Мои проблемы:

  • Количество URL большое (1 580 000)
  • Я не знаю, какая кластеризация или метод нахождения сходства лучше

Буду признателен за любые предложения по этому вопросу.

Ответы [ 3 ]

5 голосов
/ 31 января 2012

Tokenizing и stemming - очевидные вещи, которые нужно сделать. Затем вы можете легко превратить эти векторы в разреженные векторные данные TF-IDF. Сканирование реальных веб-страниц для получения дополнительных токенов - это, вероятно, слишком много работы?

После этого вы сможете использовать любой гибкий алгоритм кластеризации для набора данных. Под «гибким» я имею в виду, что вы должны иметь возможность использовать, например, косинусное расстояние, а не евклидово расстояние (которое плохо работает с разреженными векторами). Например, k-means в GNU R поддерживает только евклидово расстояние и плотные векторы, к сожалению. В идеале выбирайте фреймворк, который будет очень гибким, но при этом хорошо оптимизируется. Если вы хотите попробовать k-средних, так как это простой (и, следовательно, быстрый) и хорошо зарекомендовавший себя алгоритм, я верю, что есть вариант, называемый "выпуклым k-средним", который может быть применим для косинусного расстояния и разреженных векторов tf-idf. .

Классическая «иерархическая кластеризация» (не считая устаревшей и не очень хорошо работающей) обычно является проблемой из-за сложности O(n^3) большинства алгоритмов и реализаций. В некоторых специализированных случаях известен алгоритм O(n^2) (SLINK, CLINK), но часто наборы инструментов предлагают только простую реализацию кубического времени (включая GNU R, Matlab, sciPy, из того, что я только что погуглил). Кроме того, они часто имеют ограниченный выбор доступных функций расстояния, возможно, не включая косинус.

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

5 голосов
/ 30 января 2012

Здесь есть несколько проблем.Сначала вы, вероятно, захотите помыть URL со словарем, например, чтобы преобразовать

http://teethwhitening360.com/teeth-whitening-treatments/18/

в

teeth whitening 360 com teeth whitening treatments 18

, затемвы можете захотеть как-то обрезать слова, например, используя стеммер Портера:

teeth whiten 360 com teeth whiten treatment 18

Затем вы можете использовать простую модель векторного пространства для сопоставления URL-адресов в n-мерном пространстве,тогда просто запусти кластеризацию на них?Это базовый подход, но он должен работать.

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

0 голосов
/ 29 июля 2014

Эти две исследовательские работы, опубликованные Google и Yahoo соответственно, подробно описывают алгоритмы кластеризации похожих URL-адресов:

...