-
[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 토크나이저에서 '지옥'과 '과도'라는 명사로 잘못된 분리를 했는데, 이게 해결된 모습을 확인할 수 있지요. 나머지 두 표현의 경우에는 서로 묶여있을 때 제한적인 의미를 가지게 되어서 자연어 분석을 할 때 목적성을 가지고 분석할 수 있도록 도와줍니다.
반응형'Python > 자연어처리' 카테고리의 다른 글
[Transformers] 🤗 트랜스포머로 파이썬 텍스트 분석 모델 이용하기 (1) 2024.10.07 [KoNLPy] 파이썬에서 한국어 토큰화 하는 방법 알아보기 (1) 2024.09.20 [KoNLPy] No JVM shared library file found 문제 해결하기 (1) 2024.09.19