새소식

AI 개발

같은 글자의 유니코드가 다를때, 정규식이 먹지 않을때

  • -

 

 

파이썬으로 텍스트 전처리를 하다가 정규식으로 한글 영어만 추출하고 있었는데,

그렇게 텍스트 클렌징 후 데이터가 None이 되는 경우가 많았다.

 

살펴보니깐 같은 문자라도 아스키 코드가 달랐고, 그렇다보니 정규식이 먹지 않았던 것.

 

 

 

 


 

 

ord('A')
# 65

chr(65)
# 'A'

파이썬에서는 ord(문자) 함수로 문자의 아스키코드를 알 수 있고

chr(아스키코드) 함수로 아스키코드의 문자를 알 수 있다.

 

그런데, 똑같은 '한'이라는 글자가 아스키코드 값이 달랐다. 그래서 찾아보니 '유니코드 정규화(Unicode Normalization)'이 필요하다고 한다.

 

대표적인 예로 옴(Ω)과 오메가(Ω)는 서로 다른 문자로 취급된다. 이런 경우는 동일한 기호가 서로 사용되는 분야가 다를 때 다른 유니코드를 반환한다.

 

또 한글과 같이 동일한 문자라도 조합형과 완성형 두 가지 방식으로 표현될 수 있는데 모든 현대 한글 글자를 표현하는데 문제가 없지만 구한말 이전에 쓰였던 옛한글까지 표현하는 경우는 불가능해서 옛 한글의 경우 유니코드 표준에서는 첫가끝 코드라고 부르는 방식을 이용해 표현한다.

 

다른 문자셋과 호환문제가 있다. 이던에 euc-kr이라는 문자셋을 사용했었는데, 유니코드 표준을 제정할 때 다른 문자셋과 호환을 염두하고 유니코드와 타 문자 셋간 변환이 가능해지도록 했다ㅏ. 그래서 한글 문자셋의 경우 동일한 한자를 한자음에 따라 다른 코드를 부여하는 해괴한 일을 낳게 됬다고 한다. 예로 같은 한자 쇠금(金) 이라고 해도 '금'을 입력하고 변환한 金과 '김'을 입력하고 변환한 金의 유니코드가 다르다.

 

따라서 문자열 비교, 검색 등 또는 정규식을 먹일 때 꼭 유니코드 정규화(Unicode Normalization)을 해야 한다.

유니코드 정규화는 NFC, NFD, NFKC, NFKD 네가지 방식이 있다.

거의 모든 언어에서 유니코드 정규화를 지원하는 함수가 있다.

 

파이썬에서는 unicodedata 클래스를 사용하면 된다.

# 사용예시
>>> import unicodedata

>>> unicodedata.normalize('NFC', '안녕')
안녕
>>> unicodedata.lookup('LEFT CURLY BRACKET')
'{'
>>> unicodedata.name('/')
'SOLIDUS'
>>> unicodedata.decimal('9')
9
>>> unicodedata.decimal('a')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: not a decimal
>>> unicodedata.category('A')  # 'L'etter, 'u'ppercase
'Lu'
>>> unicodedata.bidirectional('\u0660') # 'A'rabic, 'N'umber
'AN'

unicodedata.normalize() 함수를 통해 정규화 해준 후 사용하면 됨.

 

 

 

 

 

 

 

References

 

http://blog.naver.com/PostView.nhn?blogId=devaux&logNo=221258775328&redirect=Dlog&widgetTypeCall=true&directAccess=false 

https://velog.io/@leejh3224/%EB%B2%88%EC%97%AD-%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C-%EC%8A%A4%ED%8A%B8%EB%A7%81%EC%9D%84-%EB%85%B8%EB%A9%80%EB%9D%BC%EC%9D%B4%EC%A7%95-%ED%95%B4%EC%95%BC%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0

'AI 개발' 카테고리의 다른 글

[Pandas] 메모리 줄이기 read_csv, chunk, multiprocessing  (0) 2021.07.01
Pandas vs PySpark  (0) 2021.06.22
[Pandas] pandas 꿀팁(?)  (0) 2021.05.17
[Docker] ML + NLP Dockerfile 만들기  (0) 2021.05.11
[Python] 인코딩 정리  (0) 2021.04.29
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.