ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [KoNLPy] 파이썬에서 한국어 토큰화 하는 방법 알아보기
    Python/자연어처리 2024. 9. 20. 18:27
    반응형

    KoNLPy를 이용한 한국어 토큰화


    자연어 처리


    자연어 처리(NLP, Natural Language Processing)는 컴퓨터가 인간의 언어를 이해, 생성, 조작할 수 있도록 해주는 인공지능(AI)의 한 분야로 정의되어 있습니다. 만약 자연어 처리를 능수능란하게 할 수 있다면, 인터넷에서 흔히 구할 수 있는 문서 데이터를 모두 데이터 분석에 활용할 수 있기 때문에 활용도 또한 높지요.

     

    파이썬(Python)에는 다양한 자연어 처리 패키지가 있습니다. 다만, 그 다수는 영어 기반인데요, 한국어 자연어 분석을 하기 위해서는 코엔엘파이(KoNLPy)와 같은 전용 패키지를 이용할 필요가 있습니다. 코엔엘파이는 자바를 이용하는 패키지이기 때문에 공식 홈페이지의 설치 안내에 따라, JDK를 설치 후 이용해 주시기 바랍니다.

     

     

    한국어 데이터의 토큰화


    자연어 데이터는 입력된 그대로 분석하기에는 활용(活用, conjugation)이나 조사 등의 문제가 있습니다. 이에 따라, 규격화된 토큰(Token)으로 자연어 데이터를 분리하기 위해 자연어 처리 패키지는 토큰화(Tokenization)라는 작업을 요구합니다. 이번에는 KoNLPy의 Okt를 이용해 토큰화하는 예시를 보여드리겠습니다.

     

     

    from konlpy.tag import Okt
    tokenizer = Okt()
    
    sample_text = '오, 그녀는 정말 횃불에게 찬란히 타오르는 법을 가르치누나! 그녀가 밤의 뺨에 걸려 있는 모양이, 에티오피아 여인 귀에 걸린 화려한 보석 같아.'
    
    print(tokenizer.morphs(sample_text))
    ['오', ',', '그녀', '는', '정말', '횃불', '에게', '찬란히', '타오르는', '법', '을', '가르치', '누나', '!', '그녀', '가', '밤', '의', '뺨', '에', '걸려', '있는', '모양', '이', ',', '에티오피아', '여인', '귀', '에', '걸린', '화려한', '보석', '같아', '.']

     

     

    위와 같은 코드를 실행하면, sample_text 가 단어의 뜻에 따라 분리되는 것을 볼 수 있습니다. Okt 토크나이저(Tokenizer)에서 분리하는 기준은 단어의 의미를 나타내는 단위인 형태소인데요, 토크나이저의 종류(Kkma, Hannanum, Komoran, Okt 등)에 따라 우리가 학교에서 배운 형태소의 기준과는 약간 다를 수 있으니 참고해 주시기 바랍니다.

     

     

    문장부호 등을 삭제하는 방법


    그런데, 이렇게 토큰화를 하는건 대개 자연어의 의미를 분석하기 위한 목적일겁니다. 이 때는 특별한 의미가 없는 각종 문장부호나 외국어 등을 삭제해야 하는데요, 다양한 방법이 있지만 re 패키지를 이용해서 한국어를 제외한 모든 데이터를 삭제하는게 편리합니다. 또는, 아래에서 살펴볼 토큰의 품사 태깅을 통해 필요한 요소만 선택하는 방법도 있지요.

     

     

    import re
    
    sample_text_2 = re.sub('[^가-힣 ]+','',sample_text)
    
    print(tokenizer.morphs(sample_text_2))
    ['오', '그녀', '는', '정말', '횃불', '에게', '찬란히', '타오르는', '법', '을', '가르치', '누나', '그녀', '가', '밤', '의', '뺨', '에', '걸려', '있는', '모양', '이', '에티오피아', '여인', '귀', '에', '걸린', '화려한', '보석', '같아']

     

     

    단어의 품사 알아보기


    자연어 데이터를 분석할 때, 품사에 따라 분석에 이용하거나 이용하지 않을 수 있습니다. 이를 위해서는 자연어 토큰화를 한 다음 각 토큰의 품사(POS, part-of-speech)를 알아봐야 하는데요, KoNLPy에서는 각 토크나이저에서 pos 라는 함수를 통해 품사 정보를 제시해 주고 있습니다. 지원하는 품사 정보는 Korean POS tags comparison chart 를 참조하거나, tagset 함수를 이용해 주세요. Okt 토크나이저는 Twitter라는 이름으로 작성되어 있습니다.

     

     

    tokenizer.pos(sample_text_2)
    [('오', 'Noun'),
     ('그녀', 'Noun'),
     ('는', 'Josa'),
     ('정말', 'Noun'),
     ('횃불', 'Noun'),
     ('에게', 'Josa'),
     ('찬란히', 'Adjective'),
     ('타오르는', 'Verb'),
     ('법', 'Noun'),
     ('을', 'Josa'),
     ('가르치', 'Verb'),
     ('누나', 'Noun'),
     ('그녀', 'Noun'),
     ('가', 'Josa'),
     ('밤', 'Noun'),
     ('의', 'Josa'),
     ('뺨', 'Noun'),
     ('에', 'Josa'),
     ('걸려', 'Verb'),
     ('있는', 'Adjective'),
     ('모양', 'Noun'),
     ('이', 'Josa'),
     ('에티오피아', 'Noun'),
     ('여인', 'Noun'),
     ('귀', 'Noun'),
     ('에', 'Josa'),
     ('걸린', 'Verb'),
     ('화려한', 'Adjective'),
     ('보석', 'Noun'),
     ('같아', 'Adjective')]

     

    tokenizer.tagset
    {'Adjective': '형용사',
     'Adverb': '부사',
     'Alpha': '알파벳',
     'Conjunction': '접속사',
     'Determiner': '관형사',
     'Eomi': '어미',
     'Exclamation': '감탄사',
     'Foreign': '외국어, 한자 및 기타기호',
     'Hashtag': '트위터 해쉬태그',
     'Josa': '조사',
     'KoreanParticle': '(ex: ㅋㅋ)',
     'Noun': '명사',
     'Number': '숫자',
     'PreEomi': '선어말어미',
     'Punctuation': '구두점',
     'ScreenName': '트위터 아이디',
     'Suffix': '접미사',
     'Unknown': '미등록어',
     'Verb': '동사'}
    반응형

    댓글

문의: jwkang3929@naver.com