알파벳에서 발음 구별 기호(Diacritic, Accent Mark) 분리하기

Python3.6 · 2019. 10. 1. 03:46

데이터를 가공하다가 불어, 이탈리아어 등을 만나면 항상 악센트 마크가 같이 있는데 (예. Ś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