[Python] 호환용 한자를 통합 한자로 변환하기

Posted by 적분 ∫2tdt=t²+c
2018.10.28 23:10 프로그래밍

한때 국내를 평정했던 한국어 문자 인코딩 규격인 KS X 1001에는 정말 많고 많은 문제가 있습니다... 다행히도 유니코드의 등장으로 레거시 시스템을 제외하고는 대부분 문자 인코딩 셋이 유니코드로 대통일되고 있는 상황이지만, 아직도 그 잔재가 끼치는 악영향은 이루 말할 수 없죠.. 대표적인 문제 중 하나는 같은 한자인데 발음이 다르다는 이유로 문자 코드에 중복 배당을 하여, 모양은 같지만 코드 상으로는 다른 글자가 수없이 생겨났다는 겁니다. 이 문제의 자세한 정보에 대해서는 나무위키 문서를 참조하시면 좋을 듯 합니다.


현재 유니코드에는 통합 한자와 호환용 한자라는 두 종류의 한자가 배당되어 있습니다. 통합 한자는 말 그대로 모양이 같은(거의 유사한) 한자들은 같은 코드로 합친 영역을 말하며, 호환용 한자는 한중일 각국의 자체 표준과 호환을 위해 중복 배당된 한자를 허용해주는 영역을 말합니다. 유니코드가 이렇게 한자 영역을 나눈 취지는 앞으로 가급적으로는 통합 한자 영역에 있는 한자를 사용하되, 기존의 코드와 호환을 해야할 상황에서만 호환용 영역을 쓰라는 것이었는데, 현실은 입력기에 따라서 통합 영역과 호환용 영역이 둘 다 쓰여서 결국 다시 난장판이 되어버렸습니다.


이 문제를 최근 직접 경험해보았는데요, 한자가 포함된 말뭉치에서 단어 추출 및 검색 등의 실험을 진행하고 있었는데, 이상하게 같은 한자인데도 계속 검색에 잡히지 않는 문제가 있어서 살펴보니, 텍스트 상에서는 호환용 영역의 한자로 입력되어 있었는데, 크롬 등의 브라우저에서는 자동으로 호환용 한자를 통합 영역의 한자로 바꿔서 입력하기 때문에 코드가 일치하지 않아 검색에 실패하는 것이었습니다... 한국어 자연언어처리가 너무 쉬울까봐 심심하지 않게 이런 문제를 발생시켜준 KS X 1001 규격에 감사를 표하는 바입니다.


각설하고, 이를 해결하기 위해 호환용 한자를 통합 한자로 변환하는 Python 코드를 작성했습니다. 검색능력이 딸려서인지 해당 기능을 하는 코드를 찾기 어렵더라구요. (아마 해당 기능이 유니코드 정규화하는 함수 쪽에 포함이 되어있을것 같긴 합니다)




사실 어려운 알고리즘 같은게 있는게 아니라, 그냥 대응하는 호환용 코드와 통합 코드를 테이블에 넣어놓고 변환하는 게 전부입니다. transform('') 과 같이 호출하여 변환하시면 됩니다.



이 댓글을 비밀 댓글로