Customized Konlpy 사용하기

Text Mining 데이터 분석은 다른 데이터 종류 분석보다 손이 많이 가고 데이터를 더 많이 들여다보아야 한다.
특히, 한국어 Text Mining은 같은 의미 단어라도 뒤에 붙는 조사/어미에 따라 변형될 수 있는 경우의 수가 많고 clean data로 정제하기가 까다롭기 때문에 영어 Text Mining 보다도 더욱 지난한 과정을 거친다.
Konlpy라는 모듈이 있어 한국어 분석을 용이하게 할 수 있는데 (https://github.com/konlpy/konlpy),
Customized Konlpy는 Konlpy의 customized version이라고 보면 된다. 사용자 친화적인 기능을 추가적으로 지원한다.

설치하기

Customized Konlpy를 사용하기 전 아래 두 패키지가 먼저 설치되어 있어야 한다.

  • JPype >= 0.6.1
  • KoNLPy >= 0.4.4 (pip install konlpy)

Customized konlpy 설치

  • git clone https://github.com/lovit/customized_konlpy.git
  • pip install customized_konlpy

Ckonlpy 버전 확인

최근 ckonlpy의 버전이 0.0.5x에서 0.6.6으로 버전 업 되었다.
버전 업 된 후 아래와 같은 함수 변경이 있으므로 버전 확인이 필요하다.
(자세한 사항은 https://github.com/lovit/customized_konlpy 에서 확인)

변경

  • ckonlpy.tag.Twitter.use_twitter_dictionary ( <- ckonlpy.tag.Twitter._loaded_twitter_default_dictionary)
  • ckonlpy.tag.Twitter.dictionary ( <- ckonlpy.tag.Twitter._dictionary)

추가

  • ckonlpy.tag.Postprocessor의 ngram 단어 입력
  • 여러 개의 복합 명사를 하나의 단어로 묶어 형태소 분석할 수 있게 해주는 기능이다.

특히 추가된 ngram의 기능은 텍스트마이닝 할 때 ‘필수적’으로 필요한 기능인데 기존 다른 형태소 분석기에도 존재하지 않는 기능이어서 전처리에서 아쉬운 부분이 많았다. 실무에서 형태소 분석기를 사용할 경우 domain specific한 customized를 얼마나 잘 반영할 수 있느냐에 따라 데이터 분석 결과가 많이 차이나기 때문이다. cknolpy 제작자 분 github에 가서 기능 문의/요청을 드렸는데, 얼마되지 않아 새롭게 구현하여 추가해주셨다. 바쁘실텐데도 사용자의 입장을 잘 이해하고 구현해주셔서 너무너무 감사했다. 앞으로도 계속 기능 업데이트를 할 예정인것으로 보여서, 텍스트 마이닝 할 때에는 Ckonlpy로 정착하려고 한다 ^-^

Ckonlpy로 전처리하고 형태소 분석하기

전처리 단에서는 단어 추가, 치환, 필터, 복합명사 변환 작업 등을 하면서 data cleansing 작업을 한다.
Ckonlpy에서는 add_dictionary 함수와 Postprocessor 모듈을 통해서 이와 같은 작업을 할 수 있다.

  • 단어 추가 : domain specific한 단어 추가 (ex. 아이오아이, 트와이스 ..)
  • 단어 치환 : 오타 관련 cleansing 작업 (ex. 잇다 -> 있다 ..)
  • 단어 선택 : 선택한 단어/품사만 추출
  • 단어 필터 : 너무 general 데이터 분석에 도움이 안되는 단어들 삭제 (ex. 나, 너..)
  • 단어 결합 : n-gram 이상의 단어를 한 단어로 결합

단어 추가 (add_dictionary)

기존 트위터 분석기 사전에 존재하지 않는 단어를 추가할 때 사용한다.
자신이 분석하는 domain specific 단어를 추가할 때 유용하다.

  • add_dictionary 함수 사용 : 단어 또는 단어 리스트 단위로 등록
  • 사전 파일 등록 : 파일 단위로 단어 뭉치 등록
    위치 : customized_konlpy/ckonlpy/data/twitter (자신이 등록하는 파일의 품사에 따라 등록)

주의사항 !!!
파일 단위로 단어를 등록하는 경우에는 등록한 이후 pip install customized_konlpy를 다시 실행시켜줘야 반영이 된다.

from konlpy.tag import Twitter as OriginalTwitter

twitter_original = OriginalTwitter()
print(twitter_original.pos('우리아이오아이는 정말 이뻐요'),'\n')

from ckonlpy.tag import Twitter
twitter.add_dictionary('아이오아이', 'Noun')
print(twitter.pos('우리아이오아이는 정말 이뻐요'))
/opt/conda/lib/python3.6/site-packages/konlpy/tag/_okt.py:16: UserWarning: "Twitter" has changed to "Okt" since KoNLPy v0.4.5.
  warn('"Twitter" has changed to "Okt" since KoNLPy v0.4.5.')


[('우리', 'Noun'), ('아이오', 'Noun'), ('아이', 'Noun'), ('는', 'Josa'), ('정말', 'Noun'), ('이뻐요', 'Adjective')] 

[('우리', 'Noun'), ('아이오아이', 'Noun'), ('는', 'Josa'), ('정말', 'Noun'), ('이뻐요', 'Adjective')]

단어 선택/필터/치환/결합 (Postprocessor 모듈 통해서 진행 )

단어 선택/필터/치환/결합 목록을 파일에 저장하고 로딩해서 실행하기

  • stopwords : 해당 단어 필터
  • passwords : 해당 단어만 선택
  • passtags : 해당 품사만 선택
  • replace : 해당 단어 set 치환
  • ngram : 해당 복합 단어 set을 한 단어로 결합
from ckonlpy.tag import Postprocessor

## 파일을 로딩해서 전처리 하기 ##
from ckonlpy.utils import load_wordset
passwords = load_wordset('./passwords.txt')
stopwords = load_wordset('./stopwords.txt')

from ckonlpy.utils import load_replace_wordpair
replace = load_replace_wordpair('./replacewords.txt')

from ckonlpy.utils import load_ngram
ngrams = load_ngram('./ngrams.txt')
####################################

postprocessor = Postprocessor(
    base_tagger = twitter, # base tagger
    stopwords = stopwords, # 해당 단어 필터
    passwords = passwords, # 해당 단어만 선택
    passtags = passtags, # 해당 품사만 선택
    replace = replace, # 해당 단어 set 치환
    ngrams = ngrams # 해당 복합 단어 set을 한 단어로 결합
)

print(passwords)
print(stopwrods)
print(replace)
print(ngrams)
/opt/conda/lib/python3.6/site-packages/konlpy/tag/_okt.py:16: UserWarning: "Twitter" has changed to "Okt" since KoNLPy v0.4.5.
  warn('"Twitter" has changed to "Okt" since KoNLPy v0.4.5.')

단어 리스트를 직접 등록하기

stopwords, passwords, passtags, replace, ngrams의 데이터 타입이 모두 다르니 주의해서 입력하도록 하자.

stopwords = {'는'}

passwords = {'아이오아이', ('정말', 'Noun')}

passtags = {'Noun'}

replace = {
    '아이오아이': '아이돌',
    ('이뻐', 'Adjective'): '예쁘다'
}

ngrams = [(('미스', '함무라비'), 'Noun'), (('바람', '의', '나라'), 'Game')]
postprocessor = Postprocessor(
    base_tagger = twitter, # base tagger
    #stopwords = stopwords, # 해당 단어 필터
    #passwords = passwords, # 해당 단어만 선택
    #passtags = passtags, # 해당 품사만 선택
    #replace = replace, # 해당 단어 set 치환
    ngrams = ngrams # 해당 복합 단어 set을 한 단어로 결합
)

sent = '바람의 나라는 게임이름 입니다'
print('before : %s\n' % twitter.pos(sent))
print('after  : %s' % postprocessor.pos(sent))
before : [('바람', 'Noun'), ('의', 'Josa'), ('나라', 'Noun'), ('는', 'Josa'), ('게임', 'Noun'), ('이름', 'Noun'), ('입니다', 'Adjective')]

after  : [('바람 - 의 - 나라', 'Game'), ('는', 'Josa'), ('게임', 'Noun'), ('이름', 'Noun'), ('입니다', 'Adjective')]

ngram 단어 결합 방식을 바꾸고 싶다면 ./customized_konlpy/ckonlpy/tag/postprocess.py 파일의
words
.append((‘ - ‘.join([w for w, _ in sliced]), ngram_pos)) 부분을 수정하면 된다.

마무리

ckonlpy는 기존의 다른 형태소 분석기와 다르게 사용자 맞춤형으로 단어 추가/필터/변형/결합 등 data cleansing을 분석가 구미에 맞게 수정할 수 있는 파이썬 패키지이다. 더불어, 지속적으로 업데이트가 되고 있고 질문을 올리면 만드신 분이 feedback도 잘 주어서 앞으로도 더 발전해 나갈것으로 보인다.
실제로 한국어 Text Mining을 하였을 때 ckonlpy를 쓰면서 성능이 많이 좋아졌다. ckonlpy 말고도 soyspacing, KR-WordRank 등 한국어 관련 여러가지 라이브러리를 개발하고 계신데, 앞으로 이런것들이 잘 통합되어서 한국어 Text 분석의 디딤돌이 되었으면 좋겠다.

댓글남기기