Кластеризація довгого списку рядків (слів) у групи подібності


31

У мене є така проблема: у мене дуже довгий перелік слів, можливо, імен, прізвищ тощо. Мені потрібно згрупувати цей список слів, щоб подібні слова, наприклад слова з аналогічною відстані редагування (Левенштейн), з’явились у той же кластер. Наприклад, "алгоритм" і "алогритм" повинні мати високі шанси відобразитися в одному кластері.

Я добре знаю класичні методи без кластерного кластеризації, такі як кластеризація k-засобів, кластеризація ЕМ в літературі про розпізнавання образів. Проблема тут полягає в тому, що ці методи працюють на точках, які знаходяться у векторному просторі. У мене тут є слова струн. Здається, на питання про те, як представити рядки в числовому векторному просторі та обчислити "засоби" струнних кластерів, недостатньо відповіли, згідно з моїми дослідженнями до цього часу. Наївним підходом до нападу на цю проблему було б поєднання кластеризації k-Means з відстані Левенштейна, але все ще залишається питання "Як зобразити", означає "струни?". Існує вага, який називається вагою TF-IDF, але здається, що він здебільшого пов'язаний з областю кластеризації "текстового документа", а не згрупуванням окремих слів. http://pike.psu.edu/cleandb06/papers/CameraReady_120.pdf

Мій пошук у цій галузі триває досі, але я хотів отримати ідеї і звідси. Що б ви порадили в цьому випадку, хтось знає якісь методи для подібного роду проблем?


1
Я дізнався про існування варіанту k-засобів, названого як "K-медоїди". en.wikipedia.org/wiki/K-medoids Це не працює з L2 евклідової відстані і не потребує розрахунку засобів. Він використовує точку даних, найближчу до інших в кластері, як "медоїд".
Ufuk Can Bicici

1
It seems that there are some special string clustering algorithms. Якщо ви походите з конкретного поля для видобутку тексту, а не статистики / аналізу даних, це твердження є гарантованим. Однак, якщо ви дізнаєтесь гілку кластеризації, то ви виявите, що не існує "спеціальних" алгоритмів для рядкових даних. "Особливим" є те, як ви попередньо обробляєте такі дані, перш ніж вводити їх в аналіз кластера.
ttnphns


Зверніть увагу на різницю між розповсюдженням афінності та кластеризацією K-Means та як це вплине на час обчислення. quora.com/…
Габріель Алон

Відповіді:


37

Рекомендація відмітки @ mican щодо поширення спорідненості .

З статті: Л Фрей, Брендан Дж. Та Дельберт Дуек. "Кластеризація шляхом передачі повідомлень між точками даних." наука 315.5814 (2007): 972-976. .

Його супер простий у використанні через багато пакетів. Він працює над усім, що ви можете визначити подібність попарно. Що ви можете отримати, помноживши відстань Левенштейна на -1.

Я зібрав короткий приклад, використовуючи перший пункт вашого запитання як вхідний. У Python 3:

import numpy as np
import sklearn.cluster
import distance

words = "YOUR WORDS HERE".split(" ") #Replace this line
words = np.asarray(words) #So that indexing with a list will work
lev_similarity = -1*np.array([[distance.levenshtein(w1,w2) for w1 in words] for w2 in words])

affprop = sklearn.cluster.AffinityPropagation(affinity="precomputed", damping=0.5)
affprop.fit(lev_similarity)
for cluster_id in np.unique(affprop.labels_):
    exemplar = words[affprop.cluster_centers_indices_[cluster_id]]
    cluster = np.unique(words[np.nonzero(affprop.labels_==cluster_id)])
    cluster_str = ", ".join(cluster)
    print(" - *%s:* %s" % (exemplar, cluster_str))

Вихід був (зразки курсивом ліворуч від кластеру, для якого вони є прикладом):

  • мати: шанси, редагувати, руку, мати, високий
  • наступний: наступний
  • проблема: проблема
  • I: я, a, at і т. Д., У списку, з
  • можливо: можливо
  • кластер: кластер
  • слово: бо, і, надовго, треба, треба, дуже, слово, слова
  • подібний: подібний
  • Левенштейн: Левенштейн
  • відстань: відстань
  • the: що, то, це, до, з
  • те саме: приклад, список, імена, такі ж, такі, прізвища
  • алгоритм: алгоритм, алогритм
  • поява: з'являтися, з'являється

Запустивши його у списку 50 випадкових імен :

  • Діана: Діана , Діана, Діонн, Джеральд, Ірина, Лісетт, Мінна, Нікі, Рікі
  • Яні: Клер, Яні, Джейсон, Jc, Кімі, Ланг, Маркус, Максима, Ранді, Рауль
  • Verline: Destiny, Kellye, Marylin, Mercedes, Sterling, Verline
  • Гленн: Еленор, Гленн, Гвенда
  • Армандіна: Армандіна, Августина
  • Шіела: Ахмед, Естелла, Мілісса, Шиела, Треза, Вінелл
  • Лорен: Осінь, Хайді, Лорен, Лорен
  • Альберто: Альберта, Альберто, Роберт
  • Лоре: Еммі, Дорін, Евра, Йозеф, Лоре, Лорі, Портер

На мене це виглядає досить чудово (це було весело).


чи можливо мати той самий алгоритм, використовуючи лише sklearn? або використовувати scipy.spatial.distance із забиванням? яка перевага використовувати левенштейн? Я думаю, мені доведеться спробувати скористатися цим запитанням: stackoverflow.com/questions/4588541/…
pierre

1
@pierre Levenshtein - це те, що я б назвав "дистанцією перевірки орфографії", це хороший проксі для шансу на помилку правопису людини. Дамерау Левенштейн може бути ще кращим. Я не знаю, що відстань Хеммінга визначена для рядків неоднакової довжини. Це дозволяє лише заміни, а не вставки. визначити, як найбільш обґрунтовано прокладати / обрізати струну, майже так само важко, як обчислити відстань Левенштейна. Чи варто відкладати / обрізати старт? Кінець? Хтось із середини?
Ліндон Уайт

Якщо ви дійсно хотіли уникнути залежності від відстаней. ви можете використовувати реалізацію кодексу Россетти
Ліндон Уайт

читаючи en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance, я можу побачити, як транспозиція може змінити значення спеціально для typo, і python має абсолютно новий пакет для цього. Я бачу, як я можу використовувати це проти списку слів і отримати "найближче", але це може бути не найважливішим. Я маю отримати свій список і перевірити тф-idf. Класно дякую
П'єр

1
@dduhaime майже напевно. Взагалі розповсюдження афінності працює для несиметричних параметрів, але оскільки це симетрично йти вперед. Я впевнений, що щось у SciPy має тип трикутної матриці, який є качками як повна матриця. Я надто довго перебуваю на землі Джулія-Ланг і не можу згадати, як це робиться в пітоні. (У Джулії ви користуєтесь Symmetric)
Ліндон Уайт

5

Використовуйте алгоритми кластеризації графів, наприклад, кластеризація Лувен, Кластер кластеризованого пошуку з обмеженим сусідством (RNSC), Кластеризація розповсюдження афінності (APC) або алгоритм Марковського кластера (MCL).


Що з методом K-медоїдів я знайшов? Мені потрібно реалізувати це рішення якомога швидше, тому мені це здалося хорошим рішенням. Мені відомо про існування цих методів, заснованих на графіках, але я боюся, що не можу дозволити собі час, необхідний для їх розуміння та впровадження.
Ufuk Can Bicici

Для всіх них програмне забезпечення доступне з досить необмежуючими ліцензійними угодами, такими як GNU GPL. Я не є великим прихильником алгоритму типу k-mediods здебільшого через параметр k, але це, природно, залежить від вас. Якщо вам потрібна внутрішня реалізація, я думаю, що APC та MCL, мабуть, найпростіші для реалізації. Якщо ви це робили, спершу спробуйте їх.
мікан

2

Ви можете спробувати векторну космічну модель з n-грамами слів у вигляді записів векторного простору. Я думаю, що вам доведеться використовувати міру, подібну до косинусної подібності, в цьому випадку замість відстані редагування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.