2017-12-16 18 views
1

문자열에있는 사람들의 고유 이름을 계산해야하지만 약간의 오타가있을 수 있다는 점을 고려하여 문제를 다루고 있습니다. 내 생각은 문자열이 특정 임계 값 (예 : 2보다 아래의 levenshtein 거리)을 같게 설정했습니다. 지금은 문자열 거리를 계산할 수 있지만 입력 문자열에 어떤 수정도 가하지 않으면 고유 한 이름이 올바른 숫자가됩니다.R : 거리 측정 값에 의한 올바른 문자열 (stringdistmatrix)

library(stringdist);library(stringr) 
names<-"Michael, Liz, Miichael, Maria" 
names_split<-strsplit(names, ", ")[[1]] 
stringdistmatrix(names_split,names_split) 
    [,1] [,2] [,3] [,4] 
[1,] 0 6 1 5 
[2,] 6 0 7 4 
[3,] 1 7 0 6 
[4,] 5 4 6 0 
(number_of_people<-str_count(names, ",")+1) 
[1] 4 

NUMBER_OF_PEOPLE의 올바른 값은 "마이클은" "Miichael"로 대체 될 경우 물론, 3

나는 유니크 이름의 수에만 관심으로, 나는 걱정하지 오전,해야합니다 또는 다른 방향 라운드.

+3

문제가 잘 정의되어 있는지 확실하지 않습니다. Maria, Mara, Sara, Sarah와 같은 이름을 생각해보십시오. Maria와 Sarah는 2보다 큰 거리를 가지고 있지만 각각의 연속적인 쌍에는 거리 1이 있습니다. 또한 대부분의 사람들은 그 이름 목록에 3 개의 고유 한 이름이 있다고 생각할 것입니다. –

답변

0

하나의 옵션은 거리 행렬을 기반으로 이름을 클러스터하는 것입니다 : (qgrams은/코사인 유용 할, 또는 수 당신이 거리의 유형을 실험 할 필요가 실제 데이터에 따라

library(stringdist) 
# create a 'dist' object (=lower triangular part of distance matrix) 
d <- stringdistmatrix(names_split,method="osa") 
# use hierarchical clustering to group nearest neighbors 
hc <- hclust(d) 
# visual inspection: y-axis labels the distance value 
plot(hc) 
# decide what distance value you find acceptable for grouping. 
cutree(hc, h=3) 

이름의 경우 jaro-winkler 거리).