긴 문자열 (단어) 목록을 유사 그룹으로 클러스터링


31

다음과 같은 문제가 있습니다. 단어, 이름, 성 등 매우 긴 목록이 있습니다.이 단어 목록을 클러스터링하여 유사한 단어 (예 : 유사한 편집 (Levenshtein) 거리를 가진 단어가 동일한 클러스터. 예를 들어 "algorithm"과 "alogrithm"은 같은 클러스터에 나타날 가능성이 높습니다.

패턴 인식 문헌에서 k- 평균 군집화, EM 군집화와 같은 고전적인 감독되지 않은 군집 방법을 잘 알고 있습니다. 여기서 문제는 이러한 방법이 벡터 공간에있는 점에서 작동한다는 것입니다. 나는 내 손에 줄의 단어가 있습니다. 지금까지의 조사 노력에 따르면 수치 벡터 공간에서 문자열을 표현하고 문자열 클러스터의 "평균"을 계산하는 방법에 대한 질문에 충분히 대답하지 않은 것 같습니다. 이 문제를 공격하는 순진한 접근 방식은 k- 평균 군집화와 레 벤슈 테인 거리를 결합하는 것이지만 여전히 "문자열의"평균 "을 나타내는 방법"이라는 질문이 남아 있습니다. TF-IDF 가중치라고하는 가중치가 있지만 이는 단일 단어의 클러스터링이 아니라 "텍스트 문서"클러스터링 영역과 관련이있는 것 같습니다. http://pike.psu.edu/cleandb06/papers/CameraReady_120.pdf

이 분야에 대한 검색은 여전히 ​​진행 중이지만 여기서 아이디어를 얻고 싶었습니다. 이 경우 어떤 종류의 문제에 대한 방법을 알고 있습니까?


1
나는 "K-medoids"라는 k-mean 변종의 존재에 대해 배웠다. en.wikipedia.org/wiki/K-medoids 그것은 witk L2 유클리드 거리에서 작동하지 않으며 평균 계산이 필요하지 않습니다. 클러스터의 다른 데이터 포인트에 가장 가까운 데이터 포인트를 "메도 이드"로 사용합니다.
Ufuk Can Bicici

1
It seems that there are some special string clustering algorithms. 통계 / 데이터 분석이 아닌 텍스트 마이닝 분야에서 나온 경우이 진술이 필요합니다. 그러나 클러스터링 브랜치를 배우면 문자열 데이터에 대한 "특별한"알고리즘이 없다는 것을 알게 될 것입니다. "특별"은 클러스터 분석에 데이터를 입력하기 전에 이러한 데이터를 사전 처리하는 방법입니다.
ttnphns


선호도 전파와 K- 평균 군집의 차이점과 계산 시간에 미치는 영향에 유의하십시오. quora.com/…
Gabriel Alon

답변:


37

친 화성 전파에 대한 두 번째 @mican의 권장 사항 .

논문에서 : L Frey, Brendan J. 및 Delbert Dueck. "데이터 포인트간에 메시지를 전달하여 클러스터링." 과학 315.5814 (2007) : 972-976. .

많은 패키지를 통해 사용하기 매우 쉽습니다. 쌍별 유사성을 정의 할 수있는 모든 항목에서 작동합니다. Levenshtein 거리에 -1을 곱하면 얻을 수 있습니다.

질문의 첫 번째 단락을 입력으로 사용하여 간단한 예를 함께 보냈습니다. 파이썬 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 : I, A, AT 등
  • 아마도 : 아마도
  • 클러스터 : 클러스터
  • 단어 : 그리고, 그리고, 오랫동안, 필요, 매우, 단어, 단어
  • 비슷한 : 비슷한
  • 레 벤슈 테인 : 레 벤슈 테인
  • 거리 : 거리
  • 그 : 그,이,
  • 같은 : 예, 목록, 이름, 같은 성
  • 알고리즘 : 알고리즘, 알고리즘
  • 나타남 : 나타남

임의의 이름 50 개 목록에서 실행 :

  • 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
  • 글렌 : 엘레노어, 글렌, 그웬 다
  • 아르만 디나 : 아르만 디나, 아우 구스 티나
  • 시엘 라 : Ahmed, Estella, Milissa, Shiela, Thresa, Wynell
  • 로린 : 가을, 헤이 디, 로린, 로렌
  • Alberto : Albertha, Alberto, Robert
  • Lore : Ammie, Doreen, Eura, Josef, Lore, Lori, Porter

나에게 꽤 좋아 보인다 (그것은 재미 있었다).


sklearn 만 사용하여 동일한 알고리즘을 사용할 수 있습니까? 또는 해밍과 함께 scipy.spatial.distance를 사용합니까? 레 벤슈 테인을 사용하면 어떤 이점이 있습니까? 이 질문을 사용해보아야 할 것 같습니다 : stackoverflow.com/questions/4588541/…
pierre

1
@pierre Levenshtein은 내가 "맞춤법 검사기의 거리"라고 부르는 것인데, 그것은 철자 실수의 가능성에 대한 좋은 대리자입니다. Damerau Levenshtein 이 더 나을 수도 있습니다. 길이가 다른 문자열에 대해 해밍 거리 가 정의되어 있는지 모르겠습니다 . 삽입이 아닌 스왑 만 허용합니다. 끈을 가장 적당하게 패딩 / 트리밍하는 방법을 결정하는 것은 레 벤슈 테인 거리를 계산하는 것만 큼 어렵습니다. 시작을 패딩 / 트림해야합니까? 끝? 중간에서 일부?
Lyndon White

거리에 대한 의존성을 피하고 싶다면. Rossetta 코드 구현
Lyndon White를

en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance를 읽으면 조옮김이 오타와 특별히 차이를 만드는 방법을 알 수 있습니다. 파이썬에는 새로운 패키지가 있습니다. 나는 단어 목록에 대해 이것을 사용하고 "가장 가까운 단어"를 얻는 방법을 볼 수 있지만 가장 중요하지 않을 수 있습니다. 내 목록을 가져 와서 tf-idf로 확인해야합니다. 감사합니다
pierre

1
@dduhaime 거의 확실합니다. 일반적으로 선호도 전파는 비 symatric 간섭에 대해 작동하지만 대칭이므로 계속 진행하십시오. SciPy의 무언가에는 완전한 행렬로 덕 타이밍되는 삼각 행렬 유형이 있다고 확신합니다. 줄리아 랭 땅에서 너무 오래 지났고 파이썬에서 어떻게 이루어 졌는지 기억할 수 없습니다. (줄리아에서는 사용 Symmetric)
Lyndon White

5

Louvain 클러스터링, RNSC (Restricted Neighborhood Search Clustering), APC (Affinity Propgation Clustering) 또는 Markov Cluster 알고리즘 (MCL)과 같은 그래프 클러스터링 알고리즘을 사용하십시오.


내가 찾은 K-medoids 방법은 어떻습니까? 가능한 빨리이 솔루션을 구현해야하므로 좋은 솔루션 인 것 같습니다. 이러한 그래프 기반 방법의 존재를 알고 있지만 그 방법을 이해하고 구현하는 데 시간을 할애 할 수 없을 것 같습니다.
Ufuk Can Bicici

이들 모두에 대해 GNU GPL과 같은 상당히 비 제한적인 라이센스 계약으로 소프트웨어를 사용할 수 있습니다. 나는 k 매개 변수 때문에 k-mediods 유형의 알고리즘을 좋아하지는 않지만 자연스럽게 당신에게 달려 있습니다. 사내 구현이 필요한 경우 APC와 MCL이 구현하기 가장 쉬운 것 같습니다. 그렇게하려면 먼저 시도해보십시오.
micans

2

단어의 n- 그램을 벡터 공간 항목으로 사용하여 벡터 공간 모델을 시도 할 수 있습니다. 이 경우 편집 거리 대신 코사인 유사성과 같은 척도를 사용해야한다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.