ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [customized KoNLPy] 한국어 사용자 지정 품사 태깅 및 N-gram 분석하기
    Python/자연어처리 2024. 9. 23. 17:19
    반응형

    customized KoNLPy를 이용한 한국어 자연어 분석하기


    한국어를 이용한 자연어 분석에는 주로 코엔엘파이(KoNLPy)를 이용합니다. 하지만, 이 패키지에서 지원하는 기능이 제한적인 탓에 자연어 분석에 주로 활용되는 몇몇 기능은 사용자가 임의로 만들어서 활용해야 하지요. 이 문제를 손쉽게 해결하는 방법은, KoNLPy와 동일한 방법으로 이용할 수 있으면서 사용자 정의 기능을 지원하는 customized KoNLPy를 이용하는 방법입니다.

     

     

    customized KoNLPy의 기본 이용법


    customized KoNLPy는 KoNLPy와 거의 동일한 방법으로 이용할 수 있습니다. 아래에 기재된 설치 및 이용에 대한 예제를 참고해 주세요. KoNLPy의 Okt는 customized KoNLPy에서 Twitter라고 부르니 참고해 주세요. Twitter는 Okt의 옛이름입니다.

     

     

    # customized KoNLPy 설치
    # !pip install customized_konlpy

     

    # customized KoNLPy를 이용한 토큰화
    from ckonlpy.tag import Twitter
    
    tokenizer = Twitter()
    
    sample_text = '미주는 대학 졸업 후 반년 이상 지옥과도 같은 취업난을 몸으로 부딪히며 참 많이도 좌절해야 했었다. 합격자 명단에 없다는 말을 들을 때마다 마음은 갈가리 찢어졌고, 그 깊은 상실감은 누구와 나눌 수조차 없었다.'
    
    print(tokenizer.pos(sample_text))
    C:\ProgramData\anaconda3\envs\test311\Lib\site-packages\konlpy\tag\_okt.py:17: UserWarning: "Twitter" has changed to "Okt" since KoNLPy v0.4.5.
      warn('"Twitter" has changed to "Okt" since KoNLPy v0.4.5.')
    
    
    [('미주', 'Noun'), ('는', 'Josa'), ('대학', 'Noun'), ('졸업', 'Noun'), ('후', 'Noun'), ('반년', 'Noun'), ('이상', 'Noun'), ('지옥', 'Noun'), ('과도', 'Noun'), ('같은', 'Adjective'), ('취업', 'Noun'), ('난', 'Josa'), ('을', 'Josa'), ('몸', 'Noun'), ('으로', 'Josa'), ('부딪히며', 'Verb'), ('참', 'Verb'), ('많', 'Adjective'), ('이도', 'Noun'), ('좌절', 'Noun'), ('해', 'Josa'), ('야', 'Exclamation'), ('했었다', 'Verb'), ('.', 'Punctuation'), ('합격자', 'Noun'), ('명단', 'Noun'), ('에', 'Josa'), ('없다는', 'Adjective'), ('말', 'Noun'), ('을', 'Josa'), ('들을', 'Verb'), ('때', 'Noun'), ('마다', 'Noun'), ('마음', 'Noun'), ('은', 'Josa'), ('갈가리', 'Noun'), ('찢어졌고', 'Verb'), (',', 'Punctuation'), ('그', 'Noun'), ('깊은', 'Adjective'), ('상', 'Noun'), ('실감', 'Noun'), ('은', 'Josa'), ('누구', 'Noun'), ('와', 'Josa'), ('나눌', 'Verb'), ('수조', 'Noun'), ('차', 'Noun'), ('없었다', 'Adjective'), ('.', 'Punctuation')]

     

     

    사용자 정의 품사 태깅


    위 형태소 분석에서는 '취업난'와 같은 말이 '취업'이라는 명사와, '난'이라는 조사로 인식됩니다. 이외에도 고유명사 또는 고어의 경우 기본 형태소 분석기에서는 제대로 토큰화가 되지 않는 문제가 있지요. 이 때는 사용자 정의 품사 태깅을 이용해서 성능이 조금 더 좋은 형태소 분석기를 만들 수 있습니다. 이번에는 tokenizer.add_dictionary() 함수를 이용해서 '취업난'이라는 명사를 등록해 보도록 하겠습니다.

     

     

    tokenizer.add_dictionary('취업난','Noun')
    
    print(tokenizer.pos(sample_text))
    [('미주', 'Noun'), ('는', 'Josa'), ('대학', 'Noun'), ('졸업', 'Noun'), ('후', 'Noun'), ('반년', 'Noun'), ('이상', 'Noun'), ('지옥', 'Noun'), ('과도', 'Noun'), ('같은', 'Adjective'), ('취업난', 'Noun'), ('을', 'Josa'), ('몸', 'Noun'), ('으로', 'Josa'), ('부딪히며', 'Verb'), ('참', 'Verb'), ('많', 'Adjective'), ('이도', 'Noun'), ('좌절', 'Noun'), ('해', 'Josa'), ('야', 'Exclamation'), ('했었다', 'Verb'), ('.', 'Punctuation'), ('합격자', 'Noun'), ('명단', 'Noun'), ('에', 'Josa'), ('없다는', 'Adjective'), ('말', 'Noun'), ('을', 'Josa'), ('들을', 'Verb'), ('때', 'Noun'), ('마다', 'Noun'), ('마음', 'Noun'), ('은', 'Josa'), ('갈가리', 'Noun'), ('찢어졌고', 'Verb'), (',', 'Punctuation'), ('그', 'Noun'), ('깊은', 'Adjective'), ('상', 'Noun'), ('실감', 'Noun'), ('은', 'Josa'), ('누구', 'Noun'), ('와', 'Josa'), ('나눌', 'Verb'), ('수조', 'Noun'), ('차', 'Noun'), ('없었다', 'Adjective'), ('.', 'Punctuation')]

     

     

    N-gram 언어 모델


    단순히 형태소 단위로도 자연어 분석을 할 수 있지만, N-gram이라고 하는 방식을 이용해 여러 단어 묶음을 분석할 수도 있습니다. N-gram이란, 특정 순서로 인접한 N개의 기호 시퀀스를 이르는 말입니다. 자연어의 경우, 앞뒤 단어의 배열에 따라 의미가 달라질 수 있기 때문에 N-gram 분석이 유효한 경우가 많지요. customized KoNLPy에서는 tag.Postprocessor 클래스에서 해당 기능을 지원합니다.

     

     

    from ckonlpy.tag import Postprocessor
    
    ngrams = [(('대학','졸업'), 'Noun'), (('지옥', '과도'), 'Noun'), (('합격자', '명단'), 'Noun')]
    
    postprocessor = Postprocessor(
        base_tagger = tokenizer,
        ngrams = ngrams # 해당 복합 단어 set을 한 단어로 결합
    )
    
    print(postprocessor.pos(sample_text))
    [('미주', 'Noun'), ('는', 'Josa'), ('대학 - 졸업', 'Noun'), ('후', 'Noun'), ('반년', 'Noun'), ('이상', 'Noun'), ('지옥 - 과도', 'Noun'), ('같은', 'Adjective'), ('취업난', 'Noun'), ('을', 'Josa'), ('몸', 'Noun'), ('으로', 'Josa'), ('부딪히며', 'Verb'), ('참', 'Verb'), ('많', 'Adjective'), ('이도', 'Noun'), ('좌절', 'Noun'), ('해', 'Josa'), ('야', 'Exclamation'), ('했었다', 'Verb'), ('.', 'Punctuation'), ('합격자 - 명단', 'Noun'), ('에', 'Josa'), ('없다는', 'Adjective'), ('말', 'Noun'), ('을', 'Josa'), ('들을', 'Verb'), ('때', 'Noun'), ('마다', 'Noun'), ('마음', 'Noun'), ('은', 'Josa'), ('갈가리', 'Noun'), ('찢어졌고', 'Verb'), (',', 'Punctuation'), ('그', 'Noun'), ('깊은', 'Adjective'), ('상', 'Noun'), ('실감', 'Noun'), ('은', 'Josa'), ('누구', 'Noun'), ('와', 'Josa'), ('나눌', 'Verb'), ('수조', 'Noun'), ('차', 'Noun'), ('없었다', 'Adjective'), ('.', 'Punctuation')]

     

     

    위 예시는 앞서 살펴본 문장에서 '대학 졸업', '지옥과도', '합격자 명단' 이라는 표현을 N-gram 설정을 한 사례입니다. 이 중에서, '지옥과도'라는 단어는 Twitter 토크나이저에서 '지옥'과 '과도'라는 명사로 잘못된 분리를 했는데, 이게 해결된 모습을 확인할 수 있지요. 나머지 두 표현의 경우에는 서로 묶여있을 때 제한적인 의미를 가지게 되어서 자연어 분석을 할 때 목적성을 가지고 분석할 수 있도록 도와줍니다.

    반응형

    댓글

문의: jwkang3929@naver.com