[출처 : http://python.kr/viewtopic.php?t=25357&start=0&postdays=0&postorder=asc&highlight=]
파이썬으로 두 문자열간의 유사도를 측정하는 edit distance를 구현해 보았습니다.
근데 영어는 예상한 대로 잘 나오는데 한글의 경우 2byte라 그런지 예상대로
잘 안됩니다.
내혈안 -> 냉혈한 을 계산 할 경우 3 이 나옵니다.
자소분해한 것을 가지고 계산해도
ㄴㅐㅎㅕㄹㅇㅏㄴ -> ㄴㅐㅇㅎㅕㄹㅎㅏㄴ 3이 나옵니다.
영문처럼 위의 문자열 변경시 2군데만 수정하면 되므로 2 가 나오도록 하고 싶은
데 어찌 하면 될까요?
근데 영어는 예상한 대로 잘 나오는데 한글의 경우 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 |