Uzun bir dizge listesinin (sözcüklerin) benzerlik gruplarında kümelenmesi


31

Elimde şu problem var: Çok uzun bir kelime listem var, muhtemelen isimler, soyadlar, vs. Bu kelime listesini kümelemeliyim, öyle ki benzer kelimeler, örneğin benzer düzenleme (Levenshtein) mesafeli kelimeler Aynı küme Örneğin, "algoritma" ve "alogrithm" aynı kümede görünmek için yüksek şansa sahip olmalıdır.

Örüntü Tanıma literatüründe K-ortalama kümeleme, EM kümeleme gibi klasik denetimsiz kümeleme yöntemlerinin farkındayım. Buradaki sorun, bu yöntemlerin bir vektör uzayda bulunan noktalar üzerinde çalışmasıdır. Elimde burda ipler var. Anlatılan çalışmalara göre, stringlerin sayısal bir vektör uzayında nasıl temsil edileceği ve string kümelerinin "araçlarının" hesaplanması sorusu yeterince cevaplanmıyor gibi görünüyor. Bu soruna saldırmak için naif bir yaklaşım, K-Means'ı Levenshtein mesafesi ile birleştirmek olacaktır, ancak soru hala "dizelerin" araçlarını "nasıl göstermeli?" Şeklindedir. TF-IDF ağırlığı olarak adlandırılan bir ağırlık var, ancak tek kelimelerin kümelenmesi için değil, çoğunlukla "metin belgesi" kümelemesi alanıyla ilgili görünüyor. http://pike.psu.edu/cleandb06/papers/CameraReady_120.pdf

Bu alandaki arayışım hala devam ediyor, ama buradan da fikir edinmek istedim. Bu durumda ne önerirsiniz, bu tür bir sorun için herhangi bir yöntemden haberdar olan var mı?


1
"K-medidler" olarak adlandırılan bir k aracı türünün varlığını öğrendim. en.wikipedia.org/wiki/K-medoids L2 Euclidian mesafesinde çalışmamaktadır ve araçların hesaplanmasına ihtiyaç duymamaktadır. Bir kümedeki diğerlerine en yakın olan veri noktasını "medid" olarak kullanır.
Ufuk Can Bicici

1
It seems that there are some special string clustering algorithms. Özellikle metin madenciliği alanından geliyorsanız, istatistik / veri analizinden değil, bu ifadeye garanti verilir. Ancak, kümelenme dalını olduğu gibi öğrenirseniz, dize verileri için "özel" algoritmalar bulunmadığını görürsünüz. "Özel", böyle bir veriyi küme analizine girmeden önce nasıl işlediğinizdir.
ttnphns


Affinity Propagation ve K-Means kümelenmesi ve hesaplama süresini nasıl etkileyeceği arasındaki farkı not edin. quora.com/…
Gabriel Alon,

Yanıtlar:


37

İkincil @ mican'ın yakınlık yayılımı için önerisi .

Makaleden: L Frey, Brendan J. ve Delbert Dueck. Msgstr "Veri noktaları arasında mesaj ileterek kümeleme." bilim 315.5814 (2007): 972-976. .

Pek çok pakette kullanımı kolaydır. İkili benzerliği tanımlayabileceğiniz herhangi bir şey üzerinde çalışır. Levenshtein mesafesini -1 ile çarparak elde edebilirsiniz.

Sorunuzun ilk paragrafını girdi olarak kullanarak birlikte hızlı bir örnek attım. Python 3'te:

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))

Çıktı şudur (kümelerin solundaki italikteki örnekler, örneklerdir):

  • var: şans, düzenleme, el, sahip, yüksek
  • takip ediyor: takip ediyor
  • problem: problem
  • Ben: Ben, listesinde, vb.
  • muhtemelen: muhtemelen
  • küme: küme
  • kelime: Çünkü, uzun, ihtiyaç için, çok, sözcük, kelimeler
  • benzer: benzer
  • Levenstein: Levenstein
  • mesafe: mesafe
  • ile: o, bu, için, ile
  • same: example, list, adlar, same, soyadları
  • algoritma: algoritma, alogrithm
  • görünmek: görünmek, görünmek

50 rasgele adın bir listesinde çalıştırılıyor :

  • Diane: Deana, Diane, Dionne, Gerald, Irina, Lisette, Minna, Nicki, Ricki
  • Jani: Clair, Jani, Jason, Jc, Kimi, Lang, Marcus, Maxima, Randi, Raul
  • Verline: Destiny, Kellye, Marylin, Mercedes, Sterling, Verline
  • Glenn: Elenor, Glenn, Gwenda
  • Armandina: Armandina, Augustina
  • Shiela: Ahmed, Estella, Milissa, Shiela, Thresa, Wynell
  • Laureen: Sonbahar, Haydee, Laureen, Lauren
  • Alberto: Albertha, Alberto, Robert
  • Lore: Ammie, Doreen, Eura, Josef, Lore, Lori, Porter

Bana oldukça harika görünüyor (eğlenceliydi).


Sadece sklearn kullanarak aynı algoritmaya sahip olmak mümkün mü? veya scipy.spatial.distance hamming ile kullanın mı? levenstein kullanmanın avantajı nedir? Sanırım bu soruyu kullanmayı denemek zorunda kalacağım: stackoverflow.com/questions/4588541/…
pierre

1
Pierre Levenshtein “heceleyici mesafesi” olarak adlandırdığım şeydir, insan heceleme hatası olasılığı için iyi bir vekildir. Damerau Levenshtein daha da iyi olabilir. Hamming Distance'ın eşit olmayan uzunluktaki dizeler için tanımlandığını bilmiyorum . Sadece takaslara izin verir, takmalara değil. Telin en makul şekilde nasıl yastığına / kırpılacağına karar vermek Levenshtein farkını hesaplamak kadar zordur. Başlamayı doldurmalı mı / kesmeli mi? Son? Ortadan bazıları?
Lyndon White

Mesafelere bağımlılığı önlemek istiyorsanız. Rossetta Kod Uygulamasını
Lyndon White

en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance 'in okunması, transpozisyonun yazım hatası ve python için özel olarak nasıl bir fark yaratabileceğini görebiliyorum. Bunu bir kelime listesine karşı nasıl kullanabileceğimi ve "en yakınını" nasıl kullanabileceğimi görebiliyorum, ancak en önemlisi olmayabilir. Listemi alıp tf-idf ile kontrol etmeliyim. Harika teşekkür ederim
pierre

1
@dduhaime neredeyse kesinlikle. Genel olarak Afinite Yayılımı, uyumsuz olmayan algılamalar için işe yarar, ancak bu simetrik olduğu için devam eder. SciPy'deki bir şeyin, ördek matlarını tam bir matris olarak tanımlayan üçgen bir matris tipine sahip olduğundan eminim. Julia-lang ülkesinde uzun zamandır kaldım ve bunun python ile nasıl yapıldığını hatırlayamıyorum. (Julia’da kullanacaksınız Symmetric)
Lyndon White

5

Louvain kümelemesi, Sınırlı Mahalle Arama Kümelemesi (RNSC), Affinity Propgation Kümelemesi (APC) veya Markov Kümesi algoritması (MCL) gibi grafik kümeleme algoritmaları kullanın.


Peki ya bulduğum Kedoid yöntemi? Bu çözümü mümkün olan en kısa sürede uygulamaya ihtiyacım var, bu yüzden bana iyi bir çözüm gibi geldi. Bu grafik tabanlı yöntemlerin varlığının farkındayım, ancak bunları anlamak ve uygulamak için gereken zamanı göze alamayacağımdan korkuyorum.
Ufuk Can Bicici,

Bunların hepsi için, GNU GPL gibi oldukça kısıtlayıcı olmayan lisans sözleşmelerine sahip yazılımlar mevcuttur. Ben k-mediods tür algoritmasının büyük bir hayranı değilim, çünkü çoğunlukla k parametresi yüzünden size bağlı. Şirket içi bir uygulamaya ihtiyacınız varsa, APC ve MCL'nin uygulanması en kolay yöntem olduğunu düşünüyorum. Bunu yapacak olsaydın, önce onları dene.
mikan

2

Vektör uzayı modelini, vektör uzayı girişleri olarak kelimelerin n gramlarıyla deneyebilirsiniz. Bu durumda düzenleme mesafesi yerine kosinüs benzerliği gibi bir ölçü kullanmanız gerektiğini düşünüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.