2014-04-28 2 views
0

나는 유사성에 의해 함께 그룹화하려는 1000 개 이상의 키워드 목록을 가지고 있습니다.문자열의 감독되지 않은 클러스터링

  • "안뜰 가구"

  • "새 의자" "의자를 사용"
  • "거실 가구"나는 싶습니다 : 예를 들어

    "가구"와 "의자"용어가 함께 묶입니다.

    내가 할 수있는 한 가지 방법은 미리 선택된 "중심"용어를 지정한 다음 Levenshtein 거리를 계산하고 kmeans를 사용하여 클러스터링하는 것입니다.

    하지만 알아내는 데 관심이있는 것은 "의자"및 "가구"와 같은 중심 용어를 미리 지정하지 않으면 어떻게 할 수 있는지입니다.

    감사합니다.

    답변

    2

    당신은 거리 행렬을 계산하는 stringdist 패키지를 사용할 수 있습니다

    str <- c("patio furniture", 
        "living room furniture", 
        "used chairs", 
        "new chairs") 
    
    library(stringdist) 
    d <- stringdistmatrix(str, str) 
    

    stringdist 거리 함수를 지원합니다. 기본값은 '제한된 Damerau-Levenshtein 거리'입니다. 그런 다음 계층 적 클러스터링을 수행 할 수 hclust이 거리 행렬을 사용할 수 있습니다

    cl <- hclust(as.dist(d)) 
    plot(cl) 
    

    hclust는 다른 방법을 가지고 있습니다. ?hclust을 참조하십시오. 고정 된 수의 그룹을 생성하려면 (여기 2) :

    cutree(cl, 2) 
    

    그러나 이것은 아마도 여러 가지 가능한 해결책 중 하나입니다.

    기본적으로
    2

    ,이 사용하는 계층 적 클러스터링과 같이 일할 수 :

    library(tm) 
    library(arules) # or other package with (dis)similarity measures... 
    docs <- c("patio furniture", "living room furniture", "used chairs", "new chairs") 
    dtm <- as.matrix(DocumentTermMatrix(Corpus(VectorSource(docs)))) 
    # comparse & choose measure, e.g. Jaccard vs Dice Distance 
    plot(hc <- hclust(dist(dtm, method="binary")), main="Jaccard Dist") 
    plot(hc <- hclust(dissimilarity(dtm, method="Dice")), main="Dice Dist") 
    # determine cutting distance (e.g. 0.6)_ 
    clusters <- cutree(hc, h=.6) 
    # result 
    cbind.data.frame(docs, clusters) 
    #     docs clusters 
    # 1  patio furniture  1 
    # 2 living room furniture  1 
    # 3   used chairs  2 
    # 4   new chairs  2 
    
    관련 문제