안녕하세요

MeCab 경로 인식 문제 해결 본문

삽질

MeCab 경로 인식 문제 해결

godxxy1229 2023. 12. 9. 22:27

 

import tokenization_kisti as tokenization
	 
vocab_file = "./vocab_kisti.txt"  

tokenizer = tokenization.FullTokenizer(  
                        vocab_file=vocab_file,  
                        do_lower_case=False,  
                        tokenizer_type="Mecab"  
                    )  

example = "본 고안은 주로 일회용 합성세제액을 집어넣어 밀봉하는 세제액포의 내부를 원호상으로 열중착하되 세제액이 배출되는 절단부 쪽으로 내벽을 협소하게 형성하여서 내부에 들어있는 세제액을 잘짜질 수 있도록 하는 합성세제 액포에 관한 것이다."  
tokens = tokenizer.tokenize(example)  
encoded_tokens = tokenizer.convert_tokens_to_ids(tokens)  
decoded_tokens = tokenizer.convert_ids_to_tokens(encoded_tokens)  
    
print("Input example ===>", example)  
print("Tokenized example ===>", tokens)  
print("Converted example to IDs ===>", encoded_tokens)  
print("Converted IDs to example ===>", decoded_tokens)

 

위 코드를 실행하는데 Mecab()에서 다음과 같은 문제가 발생했다.

File c:\Users\User\AppData\Local\Programs\Python\Python311\Lib\site-packages\konlpy\tag\_mecab.py:80, in Mecab.__init__(self, dicpath)
     78     # self.tagset = utils.read_json('%s/data/tagset/mecab.json' % utils.installpath)
     79 except RuntimeError:
---> 80     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)
     81 except NameError:
     82     raise Exception('Install MeCab in order to use it: http://konlpy.org/en/latest/install/')
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')"

 

문제의 원인은 다음과 같다:
Windows 시스템에서 백슬래시(\)를 경로 구분자로 사용한다.
Python에서 백슬래시는 특수 문자를 나타내는 이스케이프 문자로 사용된다.

따라서 문자열 내에서 백슬래시를 그대로 사용하면, 예상치 못한 이스케이프 시퀀스가 생성되어 경로가 올바르게 해석되지 않는다.

해결 방법은 2가지 방법이 있다.

1. Raw String 사용:

Python에서 raw string은 이스케이프 시퀀스를 무시하고 문자열을 있는 그대로 해석한다.
따라서 경로를 raw string으로 지정하면, 백슬래시가 일반 문자로 처리된다.

mecab = Mecab(dicpath=r"C:\mecab\mecab-ko-dic")

 


2. 슬래시(/) 사용:

Windows 시스템에서도 슬래시를 경로 구분자로 사용할 수 있다.
Python 코드에서 경로를 지정할 때 슬래시를 사용하면, 이스케이프 문자 문제를 피할 수 있다.

mecab = Mecab(dicpath="C:/mecab/mecab-ko-dic")

 

위 방법을 사용하면 MeCab 경로 인식 문제를 해결할 수 있을것이다.

오류가 발생한 Mecab 모듈의 딕셔너리 경로를 2번 방법과 같이 수정하여 문제를 해결했다:

# ... 

def __init__(self, dicpath="C:/mecab/mecab-ko-dic"):
        self.dicpath = dicpath
        try:
            self.tagger = Tagger('-d %s' % dicpath)
            # self.tagset = utils.read_json('%s/data/tagset/mecab.json' % utils.installpath)
        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: http://konlpy.org/en/latest/install/')
            
# ...​