본문 바로가기

Error_Log

Mecab 설치 및 trouble shooting 하기(+user-dict 셋팅)

Mecab 을 사용하는 가장 큰 이유는 빠르면서도 뛰어난 Tokeinzing 성능과 함께 user dictionary를 활용해서

특정 token의 tokenizing 형태와 우선순위를 조정할 수 있다는 점이다.

 

평소에 mecab을 자주 사용하지는 않기때문에, 매번 설치하고 셋팅할때마다, 여러 오류들에 직면하게 되는데

정상적으로 setting을 완료하기 위한 진행 순서를 정리해보고자 한다.


 

먼저, mecab을 활용해 한국어를 tokenizing하기 위해서는 mecab과 mecab-ko-dic을 각각 설치해야한다.

각각의 역할은 아래와 같다.

1) mecab(ex. mecab-0.996-ko-0.9.2) : 
해당파일은 MeCab의 핵심 엔진을 포함하고 있습니다. 이 엔진은 텍스트를 형태소 분석하는 데 사용되며, 다양한 언어의 사전을 사용할 수 있도록 설계되어 있다.

2) mecab-ko-dic(ex. mecab-ko-dic-2.1.1-20180720) :
이 패키지는 한국어를 위한 사전 데이터로, MeCab 엔진을 사용하여 한국어 텍스트를 분석할 때 필요한 사전 파일들을 포함하고 있다.

 

자, 이제 차례대로 설치 과정을 살펴보자.

 


 

1. Mecab 엔진 설치하기

wget https://bitbucket.org/eunjeon/mecab-ko/downloads/mecab-0.996-ko-0.9.2.tar.gz


tar xvfz mecab-0.996-ko-0.9.2.tar.gz


cd mecab-0.996-ko-0.9.2

# 지금부터 아래 과정들은 가급적 sudo권한으로 실행한다.



./configure
# -> 이 명령은 설치할 소프트웨어의 구성을 준비하는 단계이다. 
# configure 스크립트는 시스템 환경을 검사하여 컴파일러 옵션, 라이브러리 위치, 기타 의존성을 확인하고, 
# 이 정보를 바탕으로 Makefile을 생성합니다. 
# Makefile은 실제 빌드 프로세스(make 명령을 사용할 때)를 지시하는 파일입니다. 
# 사용자는 필요에 따라 ./configure 명령에 다양한 옵션을 지정할 수 있어, 
# 소프트웨어가 특정 조건에 맞게 설치될 수 있도록 한다.

sudo make
# make 명령은 Makefile에 정의된 지시에 따라 소프트웨어를 컴파일하고 빌드하는 과정을 수행한다.
# 이 단계에서 소스 코드가 실행 가능한 바이너리 파일로 컴파일된다. 
# make 과정은 프로젝트에 포함된 모든 필요한 컴포넌트를 컴파일하여 준비한다.

sudo make check
# 이 명령은 빌드된 소프트웨어의 테스트를 실행한다 
# make check는 make를 통해 생성된 실행 파일이 예상대로 작동하는지 검증하기 위한 자체 테스트 케이스를 실행한다. 
# 이 과정을 통해 설치 전에 소프트웨어의 기능성을 확인할 수 있다

sudo make install
# make install 명령은 make로 빌드된 파일들을 시스템의 표준 위치에 복사한다.
# 이는 일반적으로 /usr/local/bin과 같은 디렉토리에 실행 파일을 배치하고, 
# 라이브러리 파일은 /usr/local/lib에 배치하는 등의 작업을 포함한다.
# 이렇게 함으로써, 시스템 전체에서 해당 프로그램을 사용할 수 있게 된다.

sudo ldconfig 
# 시스템이 새로 설치된 라이브러리(예: /usr/local/lib에 설치된 라이브러리)를 찾을 수 있도록 
# 라이브러리 캐시를 업데이트한다.
# 이는 새로 설치된 라이브러리 파일을 시스템이 제대로 인식하고 사용할 수 있도록 한다.

mecab --version
# mecab이 제대로 설치되고, 인식되는지 확인

 

1-1) 오류 발생 시

만약 위 순서대로 실행했는데 진행이 안될 경우 아래 순서대로 다시 진행해본다.

1) 먼저 libmecab.so.2 파일이 /usr/local/lib에 실제로 존재하는지 확인한다.

ls /usr/local/lib | grep libmecab

 

2) 라이브러리 파일(libmecab.so.2)이 존재한다면, 환경 변수 LD_LIBRARY_PATH에 해당 경로를 추가하여 라이브러리를 찾을 수 있도록 한다. 이렇게 하려면, 다음 명령을 사용하여 현재 세션에 대해 환경 변수를 설정하거나, .bashrc 파일에 추가할 수 있게된다.

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

echo 'export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH' >> ~/.bashrc

source ~/.bashrc

 

3) 시스템이 라이브러리 변경사항을 인식할 수 있도록 ldconfig 명령을 사용한다. 이 명령은 관리자 권한이 필요하다

sudo ldconfig

 

4) mecab을 인식하는지 확인한다.

mecab --version

 

 

 

2) Mecab-ko-dic 설치하기

wget https://bitbucket.org/eunjeon/mecab-ko-dic/downloads/mecab-ko-dic-2.1.1-20180720.tar.gz

tar xvfz mecab-ko-dic-2.1.1-20180720.tar.gz

cd mecab-ko-dic-2.1.1-20180720

# 아래 과정은 위와 동일하므로 굳이 설명하지 않겠다.

sudo ./configure

sudo make

sudo make install

 

2-1) 만약 설치 후 오류가 발생할 경우

# mecab 파이썬을 설치해본다
pip3 install --index-url https://pypi.org/simple/ mecab-python3

 

 

3) User-dict 등록하기(custumizing)

# 1. mecab-ko-dic 디렉토리 내부에서 사전을 연다(nnp.csv)
nnp_path = '/home/jovyan/WIDE_HOME/wontae_kim/mecab-ko-dic-2.1.1-20180720/NNP.csv'
nnp = pd.read_csv(nnp_path, header=None, sep=',')


# 2. 사전 내부에 tokenizer를 custumizing할 token들을 넣고 저장한다.(아래는 예시)
nnp = nnp.iloc[:2370] #추가할때마다 중복 추가 저장될 수 있어서, 기존 원본범위에서부터 업데이트하도록 함
new_lines = [
    ['주유비', '*', '*', '*', 'NNP', '*', 'F', '주유비', '*', '*', '*', '*'],
    ['워크샵', '*', '*', '*', 'NNP', '*', 'T', '워크샵', '*', '*', '*', '*'],
    ['더존', '*', '*', '*', 'NNP', '*', 'T', '더존', '*', '*', '*', '*'],
    ['우아한형제들', '*', '*', '*', 'NNP', '*', 'T', '우아한형제들', '*', '*', '*', '*'],
    ['지에스칼텍스', '*', '*', '*', 'NNP', '*', 'T', '지에스칼텍스', '*', '*', '*', '*'],
    ['대중교통비', '*', '*', '*', 'NNP', '*', 'T', '대중교통비', '*', '*', '*', '*'],
    ['택시비', '*', '*', '*', 'NNP', '*', 'T', '택시비', '*', '*', '*', '*'],
    ['커피', '*', '*', '*', 'NNP', '*', 'F', '커피', '*', '*', '*', '*'],
    ['파리바게트', '*', '*', '*', 'NNP', '*', 'F', '파리바게트', '*', '*', '*', '*'],
    ['교통비', '*', '*', '*', 'NNP', '*', 'T', '교통비', '*', '*', '*', '*'],
    ['대중교통', '*', '*', '*', 'NNP', '*', 'T', '대중교통', '*', '*', '*', '*'],
    ['쏘카', '*', '*', '*', 'NNP', '*', 'F', '쏘카', '*', '*', '*', '*'],
    ['야놀자', '*', '*', '*', 'NNP', '*', 'T', '야놀자', '*', '*', '*', '*'],
    ['네이버페이', '*', '*', '*', 'NNP', '*', 'F', '네이버페이', '*', '*', '*', '*'],
    ['카카오페이', '*', '*', '*', 'NNP', '*', 'F', '카카오페이', '*', '*', '*', '*'],
    ['쿠팡페이', '*', '*', '*', 'NNP', '*', 'F', '쿠팡페이', '*', '*', '*', '*'],
    ['여기어때', '*', '*', '*', 'NNP', '*', 'F', '여기어때', '*', '*', '*', '*'],
    ['호텔스컴바인', '*', '*', '*', 'NNP', '*', 'T', '호텔스컴바인', '*', '*', '*', '*'],
    ['아고다', '*', '*', '*', 'NNP', '*', 'F', '아고다', '*', '*', '*', '*'],
    ['에어비엔비', '*', '*', '*', 'NNP', '*', 'F', '에어비엔비', '*', '*', '*', '*'],
    ['GS25', '*', '*', '*', 'NNP', '*', 'F', 'GS25', '*', '*', '*', '*'],
    ['분식', '*', '*', '*', 'NNP', '*', 'T', '분식', '*', '*', '*', '*'],
]
dict_make_cols = ['경비용도명', '가맹점업종명', '경비회계계정명'] # 해당 컬럼의 데이터들은 반복적으로 사용되는 명칭이므로, tokenizing진행 시, 쪼개지지않도록 사전에 등록하여 관리

for col in dict_make_cols:
    for value in df[col].unique():
        temp_tokens = re.split(r'[\s\-_,.(){}\[\]\/]+', value) #특수문자 있을 경우, 특수문자 제거 및 특수문자 기준으로 텍스트 분할
        temp_tokens = [filter_korean(i) for i in temp_tokens]
        temp_tokens = [token for token in temp_tokens if token] #공백문자 있을 경우 제거
        temp_tokens = [i for i in temp_tokens if len(i)>1] # 길이가 2이상인 token만 남김
#         temp_tokens = [token for token in temp_tokens if not any(stop_word in token for stop_word in stop_words)] #stop_words 제거
        
        for token in temp_tokens:
            jongseong_yn = has_jongseong_token(token)
            temp_line = [token, '*', '*', '*', 'NNP', '*', jongseong_yn, token, '*', '*', '*', '*']
            new_lines.append(temp_line)

for line in new_lines:
    nnp.loc[len(nnp)]= line
    
nnp.to_csv(nnp_path, index=False, header=False, sep=',') # 추가된 사전 저장


# 3. 파일을 저장한다.
sudo tools/add-userdic.sh
# 이 명령은 MeCab 설치 폴더 내에 있는 tools 디렉토리에 포함된 add-userdic.sh 스크립트를 
# 실행하는 역할을 하며 이 스크립트의 주된 목적은 사용자 정의 사전을 MeCab에 추가하는 것이다

sudo make install
# make install 명령은 앞서 make 명령을 통해 컴파일된 소프트웨어를 시스템의 표준 위치에 설치한다. 
# 해당 과정은 일반적으로 컴파일된 실행 파일, 라이브러리 파일, 설정 파일 등을 
# /usr/local/bin, /usr/local/lib, /usr/local/etc 등의 디렉토리에 복사하는 역할을 한다.

 

3-1) 사전 추가 시 오류 발생할 경우

 여기서 오류가 발생하는 일은 잘없다. 만약 오류가 발생하면, 해당 dicpath의 읽기권한이 없어서일수있으니

현재 디렉토리에 대한 편집권한을 부여해보자

sudo chmod -R a+r /home/jovyan/WIDE_HOME/wontae_kim/mecab-ko-dic-2.1.1-20180720

 

 

* 추가 : 사용자 사전 내부의 형식은 어떤 의미를 표현하는가?

ref. https://tape22.tistory.com/6

'주유비', '*', '*', '*', 'NNP', '*', 'F', '주유비', '*', '*', '*', '*'

사전에 위와 같은 row가 있다고 가정하자.

이때, 각 자리의 의미는 아래와 같다.

단어, 좌문맥ID, 우문맥ID, 가중치(단어비용), 품사태그, 의미분류, 종성유무, 타입, 첫 품사, 마지막 품사, 표현

이중 필수적으로 입력해야 하는 것들은 단어, 품사태그, 의미분류, 종성유무, 타입 정도 이다. 
품사태그는 위에서 봤던 대로 NNP, NNG, VV 등의 태그를 의미하고
종성유무는 받침이 있으면 T, 없으면 F로 적어준다.

 

품사 태그 설명
https://docs.google.com/spreadsheets/d/1-9blXKjtjeKZqsf4NzHeYJCrr49-nXeRF6D80udfcwY/edit#gid=6