안녕, 세상!

Mecab 윈도우에서 단어사전 추가 및 우선순위조정 본문

It공부/NLP

Mecab 윈도우에서 단어사전 추가 및 우선순위조정

dev_Lumin 2021. 7. 25. 15:51

Mecab은 유명한 한국어 형태소 분석기입니다.

이미 학습되어 있는 모델의 vocab를 load 해서 사용합니다.

하지만 사용자가 vocab에 추가적으로 단어를 추가하여 mecab에 적용시킬 수 있습니다.

mecab은 원래 기본적으로 Linux에서 설치 및 진행이 가능합니다.

하지만 최근에는 window에서도 mecab을 설치하고 적용할 수 있습니다.

우선 mecab을 window에서 사용하기 위해서 다음과 같은 과정을 거칩니다.

 

 

(1) KoNLPy 설치

Mecab을 설치하기 전 우선 KoNLPy가 설치되어야 합니다.

https://liveyourit.tistory.com/56

 

KoNLPy (파이썬 한글 형태소 분석기 ) 윈도우 설치 방법

파이썬 한글 형태소 분석기인 KoNLPy 설치는 아래 기입된 순서대로, 본인 환경(파이썬 버전, 윈도우 비트)에만 맞게 진행해주면 에러가 발생하지 않는다. 참고로 나의 환경은 '파이썬3.8, 윈도우10 x

liveyourit.tistory.com

 

 

(2) Mecab 설치

① mecab-ko-msvc 설치

https://github.com/Pusnow/mecab-ko-msvc/releases/tag/release-0.9.2-msvc-3
해당 링크에 접속하여 본인의 윈도우 버전에 맞는 비트를 선택하여 다운로드를 해줍니다.

c드라이브에 mecab폴더를 만들어주고 해당 폴더에 압축을 풉니다.

 

② mecab-ko-dic-msvc.zpi 설치

https://github.com/Pusnow/mecab-ko-dic-msvc/releases/tag/mecab-ko-dic-2.1.1-20180720-msvc

해당 링크에 접속하여 mecab의 dictionary 즉 vocab을 다운을 받습니다.

이 또한 압축을 아까 풀었던 위치에 동일하게 파일만 풀어지도록 합니다.

 

③ python wheel 설치

https://github.com/Pusnow/mecab-python-msvc/releases/tag/mecab_python-0.996_ko_0.9.2_msvc-2

python에서 mecab을 잘 적용시키게 하기 위해서 mecab python wheel을 설치합니다.

본인이 사용 중인 python 버전에 맞게 설치를 해야 합니다.

위의 링크에서는 최대 python3.7까지만 지원합니다.

위의 파일들 중 cp뒤에 나타난 숫자가 파이썬 버전을 뜻합니다.

다운로드한 파일을 anaconda의 site-package 폴더에 옮겨 놓습니다.

site-package의 폴더 위치는 다음의 코드를 입력하면 알 수 있습니다.

(저는 jupyter 환경에서 진행합니다.)

import site; site.getsitepackages()

 

경로를 알았으니 anaconda prompt를 열어서 해당 경로로 이동해주고 설치를 진행합니다.

( 관리자 권한으로 열어줍니다. )

# cd sitepackages경로
# pip install mecab_python-0.996_ko_0.9.2_mscv-cp37-cp37m-win_amd64.whl

설치가 성공적으로 되었다면 anaconda prompt를 끄고 jupyter을 다시 실행시켜서 mecab이 적용되는지 확인해보겠습니다.

 

 

(3) Mecab 사용

konlpy의 tokenizer은 다음과 같은 방식으로 기준을 같습니다.

  • 형태소 단위 : mecab.morphs()
  • 명사 단위    : mecab.nouns()
  • 품사 태깅    : mecab.pos()

 

mecab을 이용하여 특정 문장을 형태소 분리를 해보겠습니다.

from konlpy.tag import Mecab
mecab=Mecab(dicpath='C:/mecab/mecab-ko-dic')
mecab.morphs('아 더빙 진짜 짜증 나네요 목소리')

['아', '더', '빙', '진짜', '짜증', '나', '네요', '목소리']


결과를 보게 되면 전체적으로 형태소 분리가 비교적 잘 진행된 것을 확인할 수 있습니다.

하지만 '더빙'이라는 단어를 '더'와 '빙'을 분리하여 결과가 출력이 되었습니다.

이러한 이유는 mecab의 dictionary(단어 사전)에 해당 단어에 대한 정보가 없기 때문입니다.

그래서 사용자가 직접 '더빙'이라는 단어를 mecab의 단어 사전에 추가시켜 '더빙'으로 온전하게 형태소 분리가 가능하도록 할 수 있습니다.

 

 

(4) Window에서 mecab 단어사전 추가

mecab의 폴더를 보면 크게 3개의 폴더로 이뤄져 있습니다.

  • mecab-ko-dic : mecab의 단어 사전
  • tools : 단어 사전에 단어를 추가시킨 후 컴파일 및 적용을 시켜주는 프로그램들 존재
  • user-dic : 사용자가 추가적으로 추가한 단어에 대한 단어 사전

단어 사전에 단어를 추가하는 프로세스는 크게 다음과 같이 진행이 됩니다.

 

1. user-dic의 csv 파일에 형식에 맞게 추가하고 싶은 단어를 추가

 

2. tools의 add-userdic-win.ps1라는 프로그램을 실행하여 컴파일 진행하여 추가 사항을 적용

 

3. 2번의 과정에 의해서 user-dic에서 설정한 csv파일이 mecab-ko-dic에 새로 csv파일이 만들어져서 단어 사전에 해당 단어가 적용됨

 

위의 과정대로 진행해보겠습니다.

user-dic 폴더에 가면 다음과 같이 3개의 csv 파일이 존재합니다.

nnp.csv는 명사, person.csv는 인명, place.sv는 등록되지 않는 장소에 대한 이름을 등록하는 csv 파일입니다.

필자는 '더빙'이라는 명사를 단어 사전에 추가할 것이기 때문에 nnp.csv에 추가해보겠습니다.

 

단어를 추가하기 전, 단어를 추가할 때 특정 양식을 맞춰줘야 합니다.

 

단어, 0, 0, 우선순위, 품사 태그, 종성 유무, 읽기, 타입, 첫 번째 품사, 마지막 품사, 원형, 인덱스 표현

 

우선 user-dic의 nnp.csv 파일을 확인합니다.

with open("C:/mecab/user-dic/nnp.csv", 'r', encoding='utf-8') as f: 
    file_data = f.readlines()
file_data

['대우,,,,NNP,*,F,대우,*,*,*,*,*\n', '구글,,,,NNP,*,T,구글,*,*,*,*,*\n']


기본적으로 '대우'라는 단어와 '구글'이라는 단어에 대해서 단어가 있습니다.

 

이제 '더빙'을 추가합니다.

file_data.append('더빙,,,,NNP,*,F,더빙,*,*,*,*,*\n')
with open("C:/mecab/user-dic/nnp.csv", 'w', encoding='utf-8') as f: 
    for line in file_data: 
        f.write(line)

'더빙'이라는 단어를 단어 사전에 넣었으니 이제 컴파일을 시켜서 적용시킵니다.

 

윈도우 환경에서 진행한 것이기 때문에 window powerShell을 사용합니다.

( 관리자 권한으로 열어줍니다.)

만약 현재 jupyter로 mecab을 사용하고 있던 상태였다면 window powerShell로 tools의 쉘 프로그램을 실행시킬 때 오류가 날 수 있으므로 jupyter을 종료시키고 다음 과정을 진행합니다.

 

mecab파일들이 존재하는 디렉터리로 이동하고 다음 명령어로 컴파일을 진행합니다.

.\tools\add-userdic-win.ps1

done! 이 나오면 완료된 것입니다.

다시 jupyter을 실행시키고 mecab의 mecab-ko-dic 파일 안의 user-nnp.csv를 확인해보면 잘 적용된 것을 확인할 수 있습니다.

with open("C:/mecab/mecab-ko-dic/user-nnp.csv", 'r', encoding='utf-8') as f: 
    file_data = f.readlines()
file_data

['대우,1786,3545,3821,NNP,*,F,대우,*,*,*,*,*\n',

'구글,1786,3546,2953,NNP,*,T,구글,*,*,*,*,*\n',

'더빙,1786,3545,2953,NNP,*,F,더빙,*,*,*,*,*\n']


이제 mecab으로 아까 인식을 못한 '더빙'의 단어가 잘 되는지 확인해보겠습니다.

적용이 잘 된 것을 확인할 수 있습니다.

하지만 간혹 안 되는 경우가 있으며 다른 문장에 대해서 안되는 경우도 있습니다.

그 이유는 우선순위가 낮기 때문입니다.

 

 

 

(5) Window에서 mecab 단어 사전 우선순위 수정

우선순위는 3번째 숫자인데 현재 '더빙'이라는 단어에 대해서는 2953이라고 있어서 이를 0번째로 바꿔 보겠습니다.

mecab의 우선순위를 바꾸는데 linux에서는 쉽게 가능하지만 window에서는 추가적인 shell 프로그램을 사용해야 합니다.

 

 

 

https://github.com/Pusnow/mecab-ko-dic-msvc/blob/master/tools/compile-win.ps1

 

GitHub - Pusnow/mecab-ko-dic-msvc: mecab-ko-dic for mecab-ko-msvc

mecab-ko-dic for mecab-ko-msvc. Contribute to Pusnow/mecab-ko-dic-msvc development by creating an account on GitHub.

github.com

이 compile-win.ps1이 있어야 우선순위를 수정할 수 있습니다.

해당 파일을 다운로드한 후 mecab의 tools 파일에 넣어줍니다.

 

우선순위를 수정할 때는 user-dic의 nnp.csv파일을 수정하는 것이 아니라,

mecab-ko-dic폴더 안의 user-nnp.csv파일의 데이터를 수정합니다.

file_data[2]='더빙,1786,3545,0,NNP,*,F,더빙,*,*,*,*,*\n'
with open("C:/mecab/mecab-ko-dic/user-nnp.csv", 'w', encoding='utf-8') as f: 
    for line in file_data: 
        f.write(line)
with open("C:/mecab/mecab-ko-dic/user-nnp.csv", 'r', encoding='utf-8') as f: 
    file_data = f.readlines()
file_data

['대우,1786,3545,3821,NNP,*,F,대우,*,*,*,*,*\n',

'구글,1786,3546,2953,NNP,*,T,구글,*,*,*,*,*\n',

'더빙,1786,3545,0,NNP,*,F,더빙,*,*,*,*,*\n']


우선순위를 0으로 바꿔주었고 windows powerShell에서 앞서 다운한 compile-win.ps1을 실행시킵니다.

# .\tools\compile-win.ps1

다시 jupyter로 돌아가서 아까 '더빙'이 적용되지 않는 문장에 mecab을 적용시키면 다음과 같이 잘 되는 것을 확인할 수 있습니다.

 

이렇게 mecab의 단어 사전에 새로운 단어 추가와 우선순위를 설정함으로써 

추가적으로 형태소 분리가 잘 이뤄질 수 있게 할 수 있습니다.

 

 

 

 

 

 

참조 : https://joyhong.tistory.com/128  

       : https://hong-yp-ml-records.tistory.com/91  

Comments