본문 바로가기
DL|ML

KoNLPy, mecab 설치하기 (ubuntu 16.04)

by 이든Eden 2019. 12. 11.

파이썬 형태소 분석기 패키지인 KoNLPy를 설치해보겠습니다.

KoNLPy는 POS 태거(tagger)인 Twitter와 mecab을 가지고 있습니다. (Twitter는 KoNLPy 버전 0.4.5 부터 이름이 Okt로 바뀌었다고 합니다)

 

1. JDK 설치

제일 먼저 JDK를 설치해야 합니다. 저는 이클립스 없이는 클래스 하나 못만드는 바보이기 때문에(이것이 제가 파이썬과 차라리 코딩하기에 C++가 낫다고 생각하는 이유죠) Java의 J도 듣기 싫어하지만 설치해야 합니다.

 

대학생 때도 썼었던 익숙한 JDK 1.8을 설치하고, python3-dev도 설치합니다.

저는 python3를 쓰기 때문에 python3-dev를 설치합니다. python2를 사용하시는 분들은 python-dev를 설치하셔야 합니다.

$ sudo apt-get install openjdk-8-jdk python-dev 
$ sudo apt-get install python3-dev 

 

2. KoNLPy 설치

KoNLPy 설치는 pip과 함께라면 까다롭지 않습니다.

$ pip install konlpy

설치가 완료되었으면 KoNLPy가 제대로 설치되었는지 확인해보겠습니다.

python interactivate mode(python 입력하면 나오는거)로 만들고 테스트 해봅시다.

python
Python 3.7.5 (default, Oct 25 2019, 15:51:11)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from konlpy.tag import Okt
>>> t = Okt()
>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/eden/anaconda3/envs/chatbot/lib/python3.7/site-packages/konlpy/tag/_okt.py", line 91, in __init__
    jvm.init_jvm(jvmpath, max_heap_size)
  File "/home/eden/anaconda3/envs/chatbot/lib/python3.7/site-packages/konlpy/jvm.py", line 67, in init_jvm
    convertStrings=True)
TypeError: startJVM() got an unexpected keyword argument 'convertStrings'

네 에러가 생겼죠? ^^ 제가 NLP를 안하는 사이 KoNLPy와 JDK에 많은 심경의 변화가 있었나 봅니다.

실제로 startJVM()은 'converStrings'라는 argument를 가지고 있습니다. 그런데 자꾸 unexpected라고 하네요.

큰 해결 방법을 못찾았습니다. 그래서 저는 그냥 저 argument를 안보내기로 결정했습니다.

 

오류가 있던 코드(/home/eden/anaconda3/envs/chatbot/lib/python3.7/site-packages/konlpy/jvm.py)로 가보았습니다.

jvm.py의 67번째 줄의 코드에서 convertStrings=True로 argument를 보내는 것을 찾았고, convertStrings argument 부분을 아예 아래처럼 지웠습니다.

 

이렇게 막 나갈 수 있었던 이유는 JDK github에서 convertStrings의 default값이 True라고 한 걸 알아냈기 때문입니다. 이미 True라면 굳이 True를 보낼 필요는 없겠죠?

(하지만 그래도 혹시 안전한 방법을 아시는 분은 댓글 부탁드려요!

 

66번째 줄을 없애버리고 다시 Okt의 객체를 만들어 보았습니다. 그리고 '이상하게 생각해도 어쩔 수 없어 반했으니까', '사탕처럼 달콤하다는데' 라는 두 문장으로 pos tagging을 시도해 보았습니다. Pos tagging이 아름답게 잘 되네요.

>>> t = Okt()
>>> t.pos('이상하게 생각해도 어쩔 수 없어 반했으니까')
[('이상하게', 'Adjective'), ('생각', 'Noun'), ('해도', 'Verb'), ('어쩔', 'Adverb'), ('수', 'Noun'), ('없어', 'Adjective'), ('반했으니까', 'Adjective')]
>>> t.pos('사탕처럼 달콤하다는데')
[('사탕', 'Noun'), ('처럼', 'Josa'), ('달콤하다는데', 'Adjective')]

 

이제는 또 다른 pos tagger인 Mecab을 사용해보겠습니다.

>>> from konlpy.tag import Mecab
>>> m = Mecab()
Traceback (most recent call last):
  File "/home/eden/anaconda3/envs/chatbot/lib/python3.7/site-packages/konlpy/tag/_mecab.py", line 108, in __init__
    self.tagger = Tagger('-d %s' % dicpath)
NameError: name 'Tagger' is not defined

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/eden/anaconda3/envs/chatbot/lib/python3.7/site-packages/konlpy/tag/_mecab.py", line 113, in __init__
    raise Exception('Install MeCab in order to use it: http://konlpy.org/en/latest/install/')
Exception: Install MeCab in order to use it: http://konlpy.org/en/latest/install/

오류가 생겼습니다. 인생은 호락호락하지 않아요. 그렇게 생각하는대로, 마음대로 되지 않는다구요.

사실 mecab은 KoNLPy 설치와는 별개로 따로 설치를 또 해줘야합니다. 설치를 해보겠습니다.

 

3. Mecab 설치

KoNLPy 사이트에 나와있는 것처럼 Mecab을 설치 해보겠습니다.

$ sudo apt-get install curl
$ bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)

어쩌구저쩌구

Successfully installed mecab-python-0.996-ko-0.9.2

Done.

이 나왔습니다. 설치가 잘되었습니다. 이제 Mecab Tagger 테스트를 해보겠습니다.

>>> from konlpy.tag import Mecab
>>> m = Mecab()
Traceback (most recent call last):
  File "/home/eden/anaconda3/envs/chatbot/lib/python3.7/site-packages/konlpy/tag/_mecab.py", line 108, in __init__
    self.tagger = Tagger('-d %s' % dicpath)
NameError: name 'Tagger' is not defined

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/eden/anaconda3/envs/chatbot/lib/python3.7/site-packages/konlpy/tag/_mecab.py", line 113, in __init__
    raise Exception('Install MeCab in order to use it: http://konlpy.org/en/latest/install/')
Exception: Install MeCab in order to use it: http://konlpy.org/en/latest/install/

여전히 같은 에러가 나옵니다. Pos Tagger들은 유저가 간단하게 pos tagging 하는 꼴은 보지 못합니다. 다른 방법을 찾아보겠습니다.

나 같은 사람이 한 두명이 아니라는 사실을 깨달았습니다.. Mecab은 KoNLPy와 상관없이 개별 설치 되어야합니다.

 

자, 개별 설치 스타트

 

어떤 버전의 Mecab이 가장 최신인지는 아래 링크를 통해 알 수 있습니다. Bitbucket에 있네요. 이거 유료아닌가? 부자넹

https://bitbucket.org/eunjeon/mecab-ko/downloads/

 

가장 최근 버전인 0.9.2를 설치해 보겠습니다. 말은 최신이지만 사실 몇 년 째 0.9.2가 최신입니다.

$ wget https://bitbucket.org/eunjeon/mecab-ko/downloads/mecab-0.996-ko-0.9.2.tar.gz
$ tar -zxvf mecab-*-ko-*.tar.gz
$ cd mecab-*-ko-*
$ ./configure
$ make
$ make check
$ sudo make install

자 설치가 다 끝났습니다. 이제 Mecab이 잘 설치되었는지 확인하기 위해 버전 확인을 해보겠습니다.

에러없이 버전을 잘 가르쳐주는 것을 보니 설치가 잘 되었나봅니다.

eden ~ $ mecab --version
mecab of 0.996/ko-0.9.2

이제 Mecab-ko-dic 사전을 설치해보겠습니다.

$ wget https://bitbucket.org/eunjeon/mecab-ko-dic/downloads/mecab-ko-dic-2.0.1-20150920.tar.gz
$ tar -zxvf mecab-ko-dic-2.0.1-20150920.tar.gz
$ cd mecab-ko-dic-2.0.1-20150920/
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

$ git clone https://bitbucket.org/eunjeon/mecab-python-0.996.git
$ cd mecab-python-0.996/
$ python3 setup.py build
$ python3 setup.py install

사전까지 설치가 끝났으니 이제 KoNLPy의 mecab이 잘 돌아가기를 바라면서 아까 그 두 개의 문장으로 pos tagging 테스트해보겠습니다.

다행히도 잘됩니다. 이제 pos tagging을 할 수 있게 되었습니다.

>>> from konlpy.tag import Mecab
>>> m = Mecab()
>>> m.pos('이상하게 생각해도 어쩔 수 없어 반했으니까')
[('이상', 'NNG'), ('하', 'XSV'), ('게', 'EC'), ('생각', 'NNG'), ('해도', 'XSV+EC'), ('어쩔', 'VV+ETM'), ('수', 'NNB'), ('없', 'VA'), ('어', 'EC'), ('반했', 'VV+EP'), ('으니까', 'EC')]
>>> m.pos('사탕처럼 달콤하다는데')
[('사탕', 'NNG'), ('처럼', 'JKB'), ('달콤', 'XR'), ('하', 'XSA'), ('다는데', 'EC')]

 

여기까지 KoNLPy, Mecab 설치 방법이었습니다.