pyeunjeon - koNLPy 스타일 mecab 래퍼 사용하기
koNLPy에서 제공하는 mecab은 윈도우에서 사용이 불가능하다.
https://konlpy-ko.readthedocs.io/ko/v0.4.3/install/
이에 대한 내용은 위의 링크에서 언급하듯이
mecab() 클래스는 윈도우에서 지원하지 않는다고 한다.
아쉽게도 따로 mecab을 설치하여 사용이 가능하다.(이전 포스팅 참조)
그리고 KoNLPy 스타일로 mecab을 래핑한 pyeunjeon 이라는 것도 있다.
https://github.com/koshort/pyeunjeon
이 페이지에 따르면
"pyeunjeon은 은전한닢 프로젝트와 mecab 기반의 한국어 형태소 분석기의 독립형 python 인터페이스입니다."
라고 한다.
단순히 pip install eunjeon 을 실행하면 사용이 가능하다.
또한 mecab-ko-dic 이 준비되어 있으면 사용자 사전도 손쉽게 활용할 수 있다.
그럼 먼저 eunjeon을 설치해보록 한다.
파이참을 사용하여 가상환경에 설치를 해보겠다.
"eunjeon"으로 검색하니 딱 하나가 나온다. 이것을 인스톨하면 된다.
그럼 이제 py 파일을 하나 생성하여 테스트를 해보도록 하자.
from eunjeon import Mecab
mecab = Mecab()
text = "싹쓰리가 이번에 싹 쓸어버리네."
a = mecab.pos(text)
print(a)
a = mecab.morphs(text)
print(a)
결과는 아래와 같다.
[('싹', 'NNG'), ('쓰리', 'NNG'), ('가', 'JKS'), ('이번', 'NNG'), ('에', 'JKB'), ('싹', 'MAG'), ('쓸', 'VV'), ('어', 'EC'), ('버리', 'VX'), ('네', 'EF'), ('.', 'SF')]
['싹', '쓰리', '가', '이번', '에', '싹', '쓸', '어', '버리', '네', '.']
KoNLPy 스타일이라고 하더니 정말 그렇다.
그럼 여기에서 그치는 것이 아니라 사전은 어떻게 추가할수 있을까?
Mecab() 클래스를 확인해 보니 dicpath 인자가 존재한다.
그럼 여기에 사전의 위치를 넣으면 될것 같다.
from eunjeon import Mecab
mecab = Mecab(dicpath='C:/mecab/mecab-ko-dic')
text = "싹쓰리가 이번에 싹 쓸어버리네."
a = mecab.pos(text)
print(a)
a = mecab.morphs(text)
print(a)
위와 같이 Mecab() 클래스에 dicpath 인자로 사전의 위치를 넣어주었다.
그리고 다시 테스트 코드를 실행해 보니
아래와 같은 에러가 발생한다.
Traceback (most recent call last):
File "D:/workspace/pycharm/MecabTest/test2.py", line 3, in <module>
mecab = Mecab(dicpath='C:/mecab/mecab-ko-dic')
File "D:\workspace\pycharm\MecabTest\venv2\lib\site-packages\eunjeon\_mecab.py", line 106, in __init__
raise Exception('The MeCab dictionary does not exist at "%s". Is the dictionary correctly installed?\nYou can also try entering the dictionary path when initializing the Mecab class: "Mecab(\'/some/dic/path\')"' % dicpath)
Exception: The MeCab dictionary does not exist at "C:/mecab/mecab-ko-dic". Is the dictionary correctly installed?
You can also try entering the dictionary path when initializing the Mecab class: "Mecab('/some/dic/path')"
사전이 위 경로에 없다고 한다.
분명 인자값으로 입력한 경로에 사전이 있는데 말이다.
그럼 원래 코드를 살펴봐야겠다.
_mecab.py 106번 라인에서 예외가 발생했다고 하니 그리로 가보도록 하자.
def __init__(self, dicpath=os.path.abspath(os.path.join(installpath, 'data/mecabrc'))):
self.tagset = TAGSET
try:
self.tagger = Tagger('--rcfile %s' % dicpath)
except RuntimeError:
try: # Sometimes it works when we try twice.
self.tagger = Tagger('--rcfile %s' % dicpath)
except RuntimeError:
raise Exception('The MeCab dictionary does not exist at "%s". Is the dictionary correctly installed?\nYou can also try entering the dictionary path when initializing the Mecab class: "Mecab(\'/some/dic/path\')"' % dicpath)
except NameError:
raise Exception('Install MeCab in order to use it: https://github.com/koshort/pyeunjeon/')
여기는 RuntimeError 에러 발생시 처리하는 곳이다.
발생하는 곳이 Tagger() 클래스인 것 같다.
아무래도 인자값이 잘못 들어가는 듯 해보인다.
'--rcfile %s' 이 부분을 '-d %s'로 변경해야겠다.
def __init__(self, dicpath=os.path.abspath(os.path.join(installpath, 'data/mecabrc'))):
self.tagset = TAGSET
try:
self.tagger = Tagger('--rcfile %s' % dicpath)
except RuntimeError:
try: # Sometimes it works when we try twice.
self.tagger = Tagger('-d %s' % dicpath)
except RuntimeError:
raise Exception('The MeCab dictionary does not exist at "%s". Is the dictionary correctly installed?\nYou can also try entering the dictionary path when initializing the Mecab class: "Mecab(\'/some/dic/path\')"' % dicpath)
except NameError:
raise Exception('Install MeCab in order to use it: https://github.com/koshort/pyeunjeon/')
첫번째 try에 있는 Tagger() 는 그냥 두고
두번째 Tagger()의 부분을 위와 같이 변경하였다.
(왜 두번째인가? 첫번째에서 뭐가 걸릴지 확신이 없기 때문이다. ;;;;)
수정을 하였으면 다시 테스트 코드를 실행해 보도록 하자.
[('싹쓰리', 'NNP'), ('가', 'JKS'), ('이번', 'NNG'), ('에', 'JKB'), ('싹', 'MAG'), ('쓸', 'VV'), ('어', 'EC'), ('버리', 'VX'), ('네', 'EF'), ('.', 'SF')]
['싹쓰리', '가', '이번', '에', '싹', '쓸', '어', '버리', '네', '.']
에러가 발생하지 않고 결과가 나왔고, 사전에 입력한 단어가 하나의 명사로(ex, 싹쓰리) 사전의 내용이 반영되어 나오고 있다.
(사전은 여기에서 추가하여 컴파일을 한 상태이다)
끝.