Как работает кластеризация (особенно кластеризация строк)? - PullRequest
28 голосов
/ 19 ноября 2011

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

У меня есть таблица с более чем 100 000 разных слов.

Я хочу идентифицировать одно и то же слово с некоторыми отличиями (например: house, house!!, hooouse, HoUse, @house, "house", etc...).

Что необходимо для определения сходства и группировки каждого слова в кластере? Какой алгоритм больше для этого рекомендуется?

Ответы [ 3 ]

44 голосов
/ 20 ноября 2011

Чтобы понять, что такое кластеризация, представьте географическую карту.Вы можете увидеть много различных объектов (таких как дома).Некоторые из них находятся близко друг к другу, а другие далеко.Исходя из этого, вы можете разбить все объекты на группы (например, города).Алгоритмы кластеризации делают именно это - они позволяют вам разбивать данные на группы без предварительного указания границ групп.

Все алгоритмы кластеризации основаны на расстоянии (или вероятности) между 2 объектами.На географической карте это нормальное расстояние между двумя домами, в многомерном пространстве это может быть евклидово расстояние (фактически, расстояние между двумя домами на карте также является евклидовым расстоянием).Для сравнения строк вы должны использовать что-то другое.Вот два хороших варианта: Хэмминга и Расстояние Левенштейна .В вашем конкретном случае расстояние Левенштейна , если это более предпочтительно (расстояние Хэмминга работает только для струн одинакового размера).

Теперь вы можете использовать один из существующих алгоритмов кластеризации.Их много, но не все могут соответствовать вашим потребностям.Например, чистое k-means, уже упомянутое здесь, вряд ли поможет вам, так как для его поиска требуется начальное количество групп, а для большого словаря строк это может быть 100, 200, 500, 10000 - вы просто не знаете число,Поэтому другие алгоритмы могут быть более подходящими.

Одним из них является алгоритм максимизации ожидания алгоритм.Его преимущество в том, что он может автоматически находить количество кластеров.Однако на практике часто он дает менее точные результаты, чем другие алгоритмы, поэтому обычно используют k-средних поверх EM , то есть сначала находят число кластеров и их центров с EM, а затем используютk-означает, чтобы скорректировать результат.

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

4 голосов
/ 30 ноября 2015

Существует пакет с именем stringdist , который позволяет сравнивать строки, используя несколько различных методов . Копирование с этой страницы:

  • Расстояние Хемминга: количество позиций с одинаковым символом в обеих строках. Определяется только для строк одинаковой длины.
  • Расстояние Левенштейна: минимальное количество вставок, удалений и замен, необходимых для преобразования строки a в строку b.
  • (Full) Расстояние Дамерау-Левенштейна: аналогично расстоянию Левенштейна, но допускается перемещение смежных символов.
  • Оптимальное выравнивание строк / ограниченное расстояние Дамерау-Левенштейна: Как (полное) расстояние Дамерау-Левенштейна, но каждая подстрока может быть отредактирована только один раз.
  • Длина самой длинной общей подстроки: минимальное количество символов, которое необходимо удалить в обеих строках, пока результирующие подстроки не будут идентичны.
  • q-граммное расстояние: сумма абсолютных разностей между N-граммными векторами обеих строк.
  • Косинусное расстояние: 1 минус косинусное сходство обоих N-граммовых векторов.
  • Расстояние по Джакарте: 1 уменьшает отношение общих N-грамм и всех наблюдаемых N-грамм.
  • Расстояние Джаро: расстояние Джаро является формулой из 4 значений и фактически является частным случаем расстояния Джаро-Винклера с p = 0.
  • Расстояние Джаро-Винклера: это расстояние представляет собой формулу из 5 параметров, определяемых двумя сравниваемыми строками (A, B, m, t, l) и p, выбранными из [0, 0,25].

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

0 голосов
/ 19 ноября 2011

Вы можете использовать такой алгоритм, как расстояние Левенштейна для расчета расстояния и k-means для кластеризации.

расстояние Левенштейна представляет собой строкуМетрика для измерения количества различий между двумя последовательностями

Проведите некоторое тестирование и найдите порог сходства для слова, который определит ваши группы.

...