데이터를 가공하다가 불어, 이탈리아어 등을 만나면 항상 악센트 마크가 같이 있는데 (예. Ślusàrski)
이걸 제거하고 알파벳 형태로만 가져오는 방법이다.
원래 pytorch RNN 튜토리얼을 공부하다가 알게 된 내용인데 실제로 다른 데이터를 가공하다가 필요해서 정리해본다.
아마 pytorch 튜토리얼을 못 봤으면 구글링만 계속 하고 있었을거다.. 검색하기 너무 어렵다...ㅠㅠ
다음은 pytorch rnn 튜토리얼에서 가져온 알파벳에서 발음 구별 기호 분리하는 메소드에서 변수명만 직관적으로 수정한 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import unicodedata import string all_letters = string.ascii_letters + " .,;'" n_letters = len(all_letters) # Turn a Unicode string to plain ASCII, thanks to https://stackoverflow.com/a/518232/2809427 def unicodeToAscii(word): return ''.join( char for char in unicodedata.normalize('NFD', word) if unicodedata.category(char) != 'Mn' and char in all_letters ) print(unicodeToAscii('Ślusàrski')) >>> Slusarski | cs |
간단하게 설명하면 입력받은 word를 발음구별기호와 알파벳으로 분리해준 뒤 알파벳만 받아와 리턴해주는 것이다.
unicodedata.normalize('NFD', word)는 word를 발음구별기호와 알파벳으로 분리해주는 메서드
unicodedata.category(char) != 'Mn'는 char가 발음구별기호인지 확인해주는 단계이다. (확실하지 않음)
'Mn'은 'Mark, Nonspacing'인데 구글링해보면 발음구별기호가 뜬다.
그리고 char가 알파벳인지 string.ascii_letters 기준으로 한 번 더 확인해준다. (추가로 공백, 문장부호 등을 넣어주었다.)
검색하면서 normalize 부분에서 'NFD'와 'NFC'는 각각 윈도우와 맥의 파일 이름 저장 방식이라는 것을 알게 되었다.
다음은 내가 쓰려는 용도에 맞게 메서드를 수정한 버전이다.
1 2 3 4 5 6 7 8 9 10 11 12 | import unicodedata def unicodeToAscii(line): ''' line에 있는 nonspacing mark를 포함한 문자열을 일반 알파벳으로 리턴 :param line: :return: ''' return ''.join( c for c in unicodedata.normalize('NFD', line.decode('utf-8')) if unicodedata.category(c) != 'Mn' ) | cs |
데이터에 특수 기호가 많아서 if문으로 한번 체크한 알파벳이 실제 알파벳이 맞는지 확인하는 과정을 생략했다.
코드를 돌려보면 잘 나온다.
1 2 3 | >>> ref = "Süvenç İ, Kountouris M" >>> print(unicodeToAscii(ref)) Suvenc I, Kountouris M | cs |
(추가)
파이썬 2.7에서도 정상 작동 된다.
다만 한국어가 포함 된 경우 리턴값이 자모음으로 쪼개져서 나오기 때문에
꼭 utf-8로 인코딩을 해줘야 한다.
참고1 : https://ko.wikipedia.org/wiki/%EB%B0%9C%EC%9D%8C_%EA%B5%AC%EB%B3%84_%EA%B8%B0%ED%98%B8
참고2 : https://pytorch.org/tutorials/intermediate/char_rnn_classification_tutorial.html
참고3 : https://en.wikipedia.org/wiki/Unicode_character_property
참고4 : https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%EC%A0%95%EA%B7%9C%ED%99%94
참고5 : http://www.mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=28&ID=464
'Python3.6' 카테고리의 다른 글
XML 문서에 Processing Instruction 추가하기 (0) | 2020.01.23 |
---|---|
XML 문서에 주석 달기 (0) | 2020.01.23 |
요소가 숫자로 구성된 리스트에 join 함수 사용하기 (0) | 2019.09.28 |
문자열에 리스트 요소 포함 여부 확인 (0) | 2019.09.20 |
2차원 배열(list) 중복 제거 (0) | 2019.09.19 |