[출처 : http://python.kr/viewtopic.php?t=25357&start=0&postdays=0&postorder=asc&highlight=]

파이썬으로 두 문자열간의 유사도를 측정하는 edit distance를 구현해 보았습니다. 

근데 영어는 예상한 대로 잘 나오는데 한글의 경우 2byte라 그런지 예상대로 

잘 안됩니다. 

내혈안 -> 냉혈한 을 계산 할 경우 3 이 나옵니다. 

자소분해한 것을 가지고 계산해도 

ㄴㅐㅎㅕㄹㅇㅏㄴ -> ㄴㅐㅇㅎㅕㄹㅎㅏㄴ 3이 나옵니다. 

영문처럼 위의 문자열 변경시 2군데만 수정하면 되므로 2 가 나오도록 하고 싶은 
데 어찌 하면 될까요?

> 답변

유니코드로 바꿔서 처리하세요. 

코드:

In [6]: edit.levenshtein(u"내혈안", u"냉혈한") 
Out[6]: 2 

In [7]: edit.levenshtein("내혈안", "냉혈한") 
Out[7]: 3 

감사합니다. 알려주신대로 unicode로 변경하여 처리하니 원하는대로 유사도가 나옵니다. 

코드:

def edit_distance(first , second): 
    first_len , second_len = len(first) , len(second) 
  
    if first_len > second_len : 
        first , second = second , first 
        first_len , second_len = second_len , first_len 
  
    print first_len 
    print second_len 
    current = range(first_len+1) 
  
    for i in range(1,second_len+1): 
        previous , current = current , [i]+[0]*second_len 
  
        for j in range(1,first_len+1): 
            add , delete = previous[j]+1 , current[j-1]+1 
            change = previous[j-1] 
            if first[j-1] != second[i-1]: 
                change = change + 1 
  
            current[j] = min(add , delete , change) 
  
    return current[first_len] 



sFirstStr = sys.argv[1] 
sSecondStr = sys.argv[2] 
  
sFirst = unicode(sFirstStr,'cp949') 
sSecond = unicode(sSecondStr,'cp949') 


nDistanceValue = edit_distance(sFirst,sSecond) 
  
print nDistanceValue 

+ Recent posts