티스토리 뷰
[파이썬 NLP] Window에서 Mecab 사용하기 / Konlpy 토크나이저 비교
HONG_YP 2020. 8. 25. 23:31
이번 포스팅은 Konlpy 라이브러리의 여러 토크나이저들과 그 성능을 비교해보는 시간을 가져보겠습니다!
또한 Konlpy와 별개로 추가 설치를 해야하는 Mecab 토크나이저의 설치 방법도 다뤄보도록 하겠습니다.
아래의 내용은 이기창님의 '한국어 임베딩' 도서의 내용을 참고하였습니다.
윈도우 사용자 Mecab 설치 방법
-
mecab-ko-msvc 설치
1-1. https://github.com/Pusnow/mecab-ko-msvc/releases/tag/release-0.9.2-msvc-3 설치를 위해 이 링크로 들어가줍니다.
1-2. 본인의 윈도우 버전을 확인 후 32비트/64비트 선택하여 다운로드 ('내 PC' 폴더의 속성에 들어가서 확인할 수 있습니다!
1-3. 본인의 C드라이브에 mecab폴더를 만들어줍니다. >> "C:/mecab"
1-4. 1-2에서 다운 받은 zip파일을 mecab폴더에 압축을 풀어줍니다. (하위 폴더가 생기지 않고, 파일만 풀어지도록) -
mecab-ko-dic-msvc.zip 설치
2-1. https://github.com/Pusnow/mecab-ko-dic-msvc/releases/tag/mecab-ko-dic-2.1.1-20180720-msvc 설치를 위해 이 링크로 들어가줍니다.
2-2. 'mecab-ko-dic-msvc.zip' 가장 위에 있는 이 zip 파일을 다운 받아줍니다. (시간이 좀 소요될 수 있습니다.)
2-3 "C:/mecab" 폴더에 압축풀기 (1-4와 동일하게 파일만 풀어지도록 해줍니다.) -
python wheel 설치하기
3-1. https://github.com/Pusnow/mecab-python-msvc/releases/tag/mecab_python-0.996_ko_0.9.2_msvc-2 설치를 위해 이 링크로 들어가줍니다.
3-2. 파이썬 및 윈도우 버전 확인 후 맞는 whl 다운로드
ex. 윈도우 64bit, 파이썬 3.7버전 >> mecab_python-0.996_ko_0.9.2_msvc-cp37-cp37m-win_amd64.whl
3-3. 다운로드 받은 파일을 site-package 폴더에 옮겨놓기 아나콘다 사용자 경우 대부분
C:\Users\HONG\Anaconda3\Lib\site-packages
3-4. anaconda prompt를 킨 후 site-package 폴더로 이동 후 pip로 whl 설치
<anaconda prompt에 아래의 코드를 실행시켜주세요 (본인의 경로로 지정해주어야함)>
cd C:\Users\HONG\Anaconda3\Lib\site-packages
pip install mecab_python-0.996_ko_0.9.2_msvc-cp37-cp37m-win_amd64.whl
* 아래의 폴더처럼 압축을 풀어주세요!
* site-packages 경로 찾는법
import site; site.getsitepackages()
본인의 site-packages 폴더를 찾기 어려울 경우 jupyter에 위의 코드를 치면 경로가 나옵니다!
설치가 성공적으로 되었으면 anaconda prompt를 종료 후 재실행 혹은 다시 경로를 본인 로컬 경로로 지정 후 jupyter 켜주시면 됩니다 :)
들어가기 앞서 Konlpy의 토크나이저는 아래와 같은 토큰나이징 기준을 가집니다.
ex. mecab 사용
- 형태소 단위: mecab.morphs()
- 명사 단위: mecab.nouns()
- 품사 태깅: mecab.pos()
Mecab 사용해보기
그럼 힘들게 설치한 Mecab을 사용해보도록 합니다!
from konlpy.tag import Mecab
mecab = Mecab(dicpath=r"C:\mecab\mecab-ko-dic")
일반적인 Konlpy의 토크나이저와는 다르게 mecab은 dicpath라는 파라미터를 지정해주어야 합니다.
설치 과정을 잘 따라오셨다면 dicpath에 들어갈 경로는 위의 코드와 같습니다!
Mecab 토크나이저를 사용했을 때 위의 텍스트가 어떻게 토큰화 되는지 살펴보겠습니다.
mecab.morphs("아버지가방에들어가신다")
토크나이징 튜토리얼의 국룰이라고 할 수 있는 텍스트입니다.
Mecab의 형태소 단위 토크나이징을 수행한 후 토큰들을 확인하면 완벽하게 토큰화가 진행된 것을 볼 수 있습니다.
품사까지 태깅해보도록 합시다.
mecab.pos("아버지가방에들어가신다")
품사가 굉장히 다양하게 태깅됩니다.
Mecab의 경우 '~~형 명사' 와 같이 굉장히 다양한 품사를 토크나이징에 사용합니다.
위의 텍스트를 Konlpy의 다른 토크나이저들은 어떻게 토큰화 하는지 살펴봅시다.
위의 그림은 아마 Konlpy를 사용하신 분이라면 한번쯤은 보셨을 그림입니다.
보통 기본 Konlpy의 토크나이저 중 Okt를 사용하는데, (그림의 Twitter에서 Okt로 이름이 바뀜)
Okt는 단순 명사, 조사 등으로 분류하는것에 비하면 Mecab은 굉장히 다양한 품사를 다루는 것을 볼 수 있습니다.
Tokenizer 성능 비교
왜 저렇게 귀찮은 추가설치를 하면서까지 Mecab을 사용할까요?
Konlpy의 모든 토크나이저의 성능을 비교해보면 알 수 있습니다.
from konlpy.tag import Okt, Komoran, Mecab, Hannanum, Kkma
def get_tokenizer(tokenizer_name):
if tokenizer_name == "komoran":
tokenizer = Komoran()
elif tokenizer_name == "okt":
tokenizer = Okt()
elif tokenizer_name == "mecab":
tokenizer = Mecab(dicpath=r"C:\mecab\mecab-ko-dic")
elif tokenizer_name == "hannanum":
tokenizer = Hannanum()
elif tokenizer_name == "kkma":
tokenizer = Kkma()
else:
tokenizer = Mecab(dicpath=r"C:\mecab\mecab-ko-dic")
return tokenizer
비교를 위해 모든 토크나이저를 불러오는 코드를 만들어봅니다.
import time
import pandas as pd
time_list = []
tokenizer_list = ["komoran", "okt", "mecab", "hannanum", "kkma"]
for i in tokenizer_list:
start = time.time()
tokenizer = get_tokenizer(i)
tokenizer.morphs("""한국어 자연어 처리 분야에 정말 괜찮은 책이 나왔다
출간되자 마자 읽어 보고 저자의 내공에 참 놀랐다
이렇게 좋은 품질의 도서가 더 많이 나와야 한다고 생각하는 입장에서 저자에게 고마울 따름이다
하지만 네이버 책정보에도 YES24에도 이제까지 연결된 리뷰가 하나도 없다는 점이 좀 의아했다 네이버 블로그 리뷰는 좀 있음에도
그 이유는 아마도 책 제목 때문이 아닐까 싶었다 아무래도 입문자 분들이 많이 봐야 할텐데 인공지능이나 딥러닝 같은 키워드가 아닌 한국어 임베딩이라고 제목이 달려있으니
뭔가 다른 기술이거나 아니면 매우 작은 범위의 기술로 착각할 수 있기 때문이다
임베딩은 자연어 처리 뿐만 아니라 컴퓨터 비전 음성에서도 매우 중요한 키워드가 됐다
나 같은 경우 딥러닝 공부 초창기에 GAN에서 임베딩이라는 개념을 처음 접하게 되었는데
이걸 이해하려고 고생했던 기억이 있다 딥러닝을 공부하면 할 수록 임베딩이라는 용어는 여러 개념을 관통하는 너무나 중요한 용어다.
이 책은 최신 자연어 처리 기술을 포함하고 있으며 이를 한국어에 맞게 적용할 수 있도록 일목요연하게 설명한 책이다
특히 저자의 언어로 이러한 기술들을 설명한 점이 가장 중요하다
최근 자연어 처리 기술이 BERT를 통해 퀀텀 점프를 하였고 XLNet과 같은 후속 연구가 빠르게 진행되면서 급속하게 발전하고 있다
저자는 BERT까지만 다루었는데 XLNet 같은 경우 직접 실험해보니 BERT보다 성능이 부족하다 판단하여 제외했다는 언급이 있다 이러한 부분이 책의 신뢰성을 더 높인다고 생각한다
직접 실험해보고 고민해보고 이해한 흔적이 저자만의 언어로 설명되면 독자는 더 많은 통찰을 얻을 수 있다 데이터를 다루는 부분부터 소스코드도 괜찮고 그림 설명도 훌륭하다
다만 코드를 마이크로하게 설명하는 부분은 부족하여 입문자 분들에겐 힘들수도 있지만 그래도 중요한 부분은 모두 언급했기 때문에 나쁘지 않다고 생각한다
한국어 용어도 내 입장에서는 매우 마음에 들었다 영어 발음 그대로 한국어로 쓰는 것을 싫어하시는 분들도 계시겠지만 결국 최신 기술은 영어 논문을 읽어야 하기 때문에 어설프게 한국어로 번역된 용어 보다 훨씬 낫다고 생각한다
처음 나오는 전문용어 옆에는 영어로 표시하여 헷갈리지 않도록 충분히 배려했다 제발 다른 번역서도 이 책을 참고하여 어설프게 한국어로 번역하지 않았으면 하는 바람이다
자연어 처리의 딥러닝 기술을 매우 잘 설명한 좋은 책이다 아직 리뷰가 하나도 없지만 더 많은 리뷰도 달리고 더 잘 팔려서 최신 기술을 담은 2판이 나오길 희망한다""")
time_required = time.time() - start
tokenizer_and_time = i, time_required
time_list.append(tokenizer_and_time)
소요시간측정 = pd.DataFrame(time_list, columns = ['토크나이저', '토큰화 소요시간'])
반복문을 통해 위의 텍스트를 토큰화하는 소요시간을 살펴보도록 합니다.
위의 텍스트는 이기창님의 '한국어 임베딩' 책의 리뷰입니다.
모든 토크나이저를 사용하여 위의 텍스트를 토큰화하는데 얼만큼 시간이 걸리는지 알아보도록 합니다.
소요시간측정
위의 코드에서 DataFrame으로 만들어준 '소요시간측정'을 출력해본 결과입니다.
단 하나의 짧은 텍스트를 토큰화하는데 소요되는 시간임에도 불구하고 큰 차이를 보이는 모습입니다.
역시나 Mecab의 소요시간이 굉장히 빠른 모습입니다.
굉장히 많고 긴 텍스트를 사용하게되면 훨씬 도드라지게 확인할 수 있습니다.
결론적으로 "아버지가방에들어가신다"라는 텍스트를 토큰화 하는 성능, 또 이기창님 서적의 네티즌 리뷰를 토큰화하는데 걸리는 시간을 종합적으로 봤을 때, Mecab의 성능이 굉장히 좋은것을 확인할 수 있습니다.
그렇기 때문에 귀찮더라도, Mecab을 설치하여 사용하는 것이 좋습니다!
그 외에 카카오의 khaiii (아쉽지만 윈도우는 지원하지 않습니다.), 비지도 학습 기반 토크나이징 등 다양한 토크나이저가 존재합니다.
기회가 된다면 다음 포스팅에서 다뤄보도록 하겠습니다 감사합니다 :)