2012-02-02 6 views
4

별도로 수집 된 동일한 학생 세트에 대한 두 개의 이름 목록이 있습니다. 수많은 인쇄 상 오류가 있으며 두 목록을 연결하기 위해 퍼지 매칭을 사용하고 있습니다. 나는 agrep과 비슷한 99 + %를 가지고 있지만 다음과 같은 기본적인 문제에 매달 렸습니다. 예를 들어 forenames "Adrian Bruce"와 "Bruce Adrian"을 어떻게 일치시킬 수 있습니까? Levenshtein 편집 거리는 대소 문자 수를 계산하므로이 특별한 경우에는 좋지 않습니다.R에서 "Firstname Lastname"/ "Lastname Firstname"과 순서 독립적 인 퍼지 매칭?

매우 일반적인 문제 여야하지만 표준 R 패키지 또는 주소 지정 루틴을 찾을 수 없습니다. 나는 명백한 무엇인가 놓치고 있다고 가정한다. .. ???

+0

@Ritchie Cotton은 지적했듯이 3+ 이름, 선택적인 하이픈 넣기를 어떻게 처리합니까? ''와 '-'둘 다에 나눌 수 있습니다. (cat (sort (c ('Smith', 'John')), collapse = '')는 'John Smith'를 제공합니다. – smci

+0

저는 알파벳 순으로 이름 튜플을 재정렬하면 표준 순서를 설정할 수 있습니다. 제목을 편집하여 * "이름 성"/ "성 이름"*으로 주문 독립성을 지정하십시오. 더 보편성이 필요하면 다시 편집하십시오. – smci

답변

3

글쎄, 한 아주 쉬운 방법이 ...

y=c("Bruce Almighty", "Lee, Bruce", "Leroy Brown") 
y2 <- sub("(.*) (.*)", "\\2 \\1", y) 

agrep("Bruce Lee", y) # No match 
agrep("Bruce Lee", y2) # Match! 
+0

하위 - 적어도 내게 또 다른 새로운 명령. 훌륭해, 토미. 고마워. –

+1

@JonathanBurley : 비표준 이름에주의하십시오. 'c "("Lulu ","Ho Chi Minh ","Hugh Fearnley-Whittingstall ", NA)'에 대해 코드를 테스트해야합니다. –

+0

@JonathanBurley :'grep, grepl, regexpr, gregexpr, regexec, sub, gsub' 및'match/pmatch' (관련 :'charmatch' 참조)는 모두 근본적으로 동일한 기본 명령입니다. R 언어를 좋아해! 새로운 세대를위한 PHP와 같은 느낌! – smci

0

나는 보통 꽤 강력하고 순서, 문장 부호 등 상대적으로 둔감 사용하는 기술을 단어를 교환하고 다시 일치하는 것입니다 .. 그것은을 기반으로 "n-grams"라고 불리는 개체. n = 2이면 "bigrams"입니다. 예 :

"Adrian Bruce" --> ("Ad","dr","ri","ia","an","n "," B","Br","ru","uc","ce") 
"Bruce Adrian" --> ("Br","ru","uc","ce","e "," A","Ad","dr","ri","ia","an") 

각 문자열에는 11 개의 bigram이 있습니다. 그들 중 9 명은 공통점이 있습니다. 따라서 유사성 점수는 매우 높습니다 : 9/11 또는 0.818 여기서 1.000은 완벽한 일치입니다.

저는 R에 익숙하지 않지만 패키지가없는 경우이 기술은 코딩하기가 매우 쉽습니다. 문자열 1의 bigrams를 반복하고 문자열 2에 몇 개가 들어 있는지 계산하는 코드를 작성할 수 있습니다.