본문 바로가기

프로그래밍/Python

[Konlpy|Mecab] Ubuntu 에서 Mecab-ko를 설치했으나, Mecab이 설치되었는지를 다시 묻는다.

반응형

Mecab 형태소 분석기를 이용해 보기 위해서, Ubuntu 환경에서 konlpy 와 Mecab-ko 설치를 진행해 보았다.

http://konlpy.org/ko/latest/install/ 의 가이드를 따라 mecab 설치까지 진행하였으나, mecab 은 구동되지만, Mecab 클래스 인스턴스를 만드는 부분에서 mecab 설치가 안 되었다는 에러가 발생했다.

환경은 Ubuntu 18.x 이고, 다른 파이썬 패키지와의 꼬임을 방지하기 위해서, python3 venv 를 이용해 가상환경(virtual env)를 따로 만들어 진행했다. 문제는 가이드에서 제공하는 스크립트는 가상환경에 대한 고려가 되어 있지 않았기 때문에, 가상환경에 수동으로 추가적으로 패키지를 깔아주어야 했던 것이다.

진행한 순서는 다음과 같다.

openjdk-8-sdk , g++, python3-dev 등을 apt install 로 설치한다.

python3 -m venv nlp36                      : nlp36 이란 이름의 가상환경을 만든다.

source Venvs/nlp36/bin/activate           : nlp36 환경에 들어간다.

pip install konlpy                              : konlpy 를 설치한다.

$ bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)  : 스크립트를 실행한다. 스크립트는 mecab-ko, mecab-ko-dic, mecab-python 을 설치한다.

이것을 진행하고서, python 을 실행하고 간단한 형태소 분석을 진행하려 하였다.

(nlp36) daewon@daewon-VirtualBox:~/Venvs$ python

Python 3.6.7 (default, Oct 22 2018, 11:32:17) 

[GCC 8.2.0] on linux

Type "help", "copyright", "credits" or "license" for more information.

>>> from konlpy.tag import Mecab

>>> m = Mecab()

Traceback (most recent call last):

  File "/home/daewon/Venvs/nlp36/lib/python3.6/site-packages/konlpy/tag/_mecab.py", line 107, 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/daewon/Venvs/nlp36/lib/python3.6/site-packages/konlpy/tag/_mecab.py", line 112, 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 까지만 설치했을 때와 동일한 에러 메시지이다. 분명 mecab 까지 설치했고, 셸에서도 mecab 명령으로, 설치된 단독 mecab 이 잘 동작하는 것까지 확인할 수 있는데 이상하다.

그래서,

https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh

이 스크립트에서 무슨 짓을 하는지 살펴보면, 마지막에 mecab-python 설치 부분이 다음과 같다.

# install mecab-python
cd /tmp
git clone https://bitbucket.org/eunjeon/mecab-python-0.996.git
cd mecab-python-0.996

python setup.py build
$sudo python setup.py install

if hash "python3" &>/dev/null
then
    python3 setup.py build
    $sudo python3 setup.py install
fi

/tmp 폴더에 bitbucket.org 에서 mecab-python-0.996 소스를 복제해 온다.

소스를 빌드하고, python setup.py install 명령으로 설치를 한다.

그런데, 이 때 진행되었던 메시지 마지막 부분을 보면 다음과 같았다.

running build_ext

running install_lib

copying build/lib.linux-x86_64-3.6/MeCab.py -> /usr/local/lib/python3.6/dist-packages

copying build/lib.linux-x86_64-3.6/_MeCab.cpython-36m-x86_64-linux-gnu.so -> /usr/local/lib/python3.6/dist-packages

byte-compiling /usr/local/lib/python3.6/dist-packages/MeCab.py to MeCab.cpython-36.pyc

running install_egg_info

Removing /usr/local/lib/python3.6/dist-packages/mecab_python-0.996_ko_0.9.2.egg-info

Writing /usr/local/lib/python3.6/dist-packages/mecab_python-0.996_ko_0.9.2.egg-info

즉 해당 명령으로는 내가 만들어 놓은 가상환경에 설치된 것이 아니라, /usr/local/lib/python3.6 즉 시스템의 기본 python3 에 설치가 된 것이다. 그래서, (nlp36) 환경의 python 에서는 에러가 발생한 것.

그래서, 가상환경이 activate 된 상태로, tmp 폴더로 가서, 복제되어 있는 폴더로 찾아가서, python setup.py install 을 실행하여 (nlp36) 가상환경에도 설치를 진행하여 문제를 해결했다.

(nlp36) daewon@daewon-VirtualBox:/tmp$ cd mecab-python-0.996/

(nlp36) daewon@daewon-VirtualBox:/tmp/mecab-python-0.996$ ls -l

total 368

-rw-r--r-- 1 daewon daewon     28 12월  6 16:57 AUTHORS

-rw-r--r-- 1 daewon daewon   1602 12월  6 16:57 BSD

-rw-r--r-- 1 daewon daewon    240 12월  6 16:57 COPYING

-rw-r--r-- 1 daewon daewon  18009 12월  6 16:57 GPL

-rw-r--r-- 1 daewon daewon  26428 12월  6 16:57 LGPL

-rw-r--r-- 1 daewon daewon  15733 12월  6 16:57 MeCab.py

-rw-r--r-- 1 daewon daewon 264856 12월  6 16:57 MeCab_wrap.cxx

-rw-r--r-- 1 daewon daewon    353 12월  6 16:57 README

-rw-r--r-- 1 daewon daewon   1212 12월  6 16:57 README.md

-rw-r--r-- 1 daewon daewon   9473 12월  6 16:57 bindings.html

drwxr-xr-x 6 daewon daewon   4096 12월  6 16:57 build

-rw-r--r-- 1 daewon daewon    503 12월  6 16:57 setup.py

-rw-r--r-- 1 daewon daewon   1205 12월  6 16:57 test.py

(nlp36) daewon@daewon-VirtualBox:/tmp/mecab-python-0.996$ python setup.py install

running install

running build

running build_py

running build_ext

running install_lib

copying build/lib.linux-x86_64-3.6/MeCab.py -> /home/daewon/Venvs/nlp36/lib/python3.6/site-packages

copying build/lib.linux-x86_64-3.6/_MeCab.cpython-36m-x86_64-linux-gnu.so -> /home/daewon/Venvs/nlp36/lib/python3.6/site-packages

byte-compiling /home/daewon/Venvs/nlp36/lib/python3.6/site-packages/MeCab.py to MeCab.cpython-36.pyc

running install_egg_info

Writing /home/daewon/Venvs/nlp36/lib/python3.6/site-packages/mecab_python-0.996_ko_0.9.2.egg-info

(nlp36) daewon@daewon-VirtualBox:/tmp/mecab-python-0.996$ python

Python 3.6.7 (default, Oct 22 2018, 11:32:17) 

[GCC 8.2.0] on linux

Type "help", "copyright", "credits" or "license" for more information.

>>> from konlpy.tag import Mecab

>>> m = Mecab()

>>> m.pos('안녕하세요.')

[('안녕', 'NNG'), ('하', 'XSV'), ('세요', 'EP+EF'), ('.', 'SF')]

>>>
728x90