Mac에서 MeCab Ko의 Java API 사용하기

NoCoDe·2021년 10월 18일
0

Mac에서 Mecab Ko를 수정한 후 디버깅 환경을 구축할 때 생각보다 고생을 많이해서 글을 남깁니다.

Mac에서 MeCab Ko Java API 구축 환경

MacBook Pro (Retina, 15-inch, Late 2013)
Mac OS X 10.10.5
2.3 GHz Intel Core i7
16GB 1600 MHz DDR3
OpenJDK 1.8

GCC 컴파일러 설치 여부 확인

$gcc -v

configure: error: C compiler cannot create executables

Mac OS에서 위와 같은 메시지가 출력하면 컴파일러가 설치되지 않은 것이다.

App Store > Xcode 설치

mecab-ko 설치

  1. https://bitbucket.org/eunjeon/mecab-ko/downloads

    mecab-0.996-ko-0.9.2.tar.gz 다운로드

  1. 압축풀기 및 컴파일

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

    $ ./configure

    $ make

    $ make check

    $ make install

mecab-ko-dic 설치

  1. https://bitbucket.org/eunjeon/mecab-ko-dic/downloads

    mecab-ko-dic-2.0.1-20150825.tar.gz 다운로드

  1. 압축풀기 및 컴파일

    $ tar xvfz mecab-ko-dic-2.0.1-20150825.tar.gz

    $ cd mecab-ko-dic-2.0.1-20150825

    $ ./configure

    $ sudo ./autogen.sh

    $ make

    $ make install

# autogen.sh의 실행을 안하면 Mac에서는 make에서 AM_INIT_AUTOMAKE(mecab-ko-dic, 2.0.0)라는 컴파일 에러가 발생한다.

mecab-ko-lucene-analyzer 설치

  1. https://bitbucket.org/eunjeon/mecab-ko-lucene-analyzer

    mecab-java-0.996.tar.gz 다운로드

  1. 압축풀기 및 컴파일

    $ tar xvfz mecab-java-0.996.tar.gz

    $ cd mecab-java-0.996

    > ! Mac에서는 Makefile이 제대로 동작하지 않기 때문에 다음과 같이 변경한다.

    > 빨간색으로 표시한 영역이 수정된 설정값이다.

    $ vi Makefile

TARGET=MeCab
JAVAC=javac
JAVA=java
JAR=jar
CXX=c++
INCLUDE=/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers

PACKAGE=org/chasen/mecab

LIBS=`mecab-config --libs`
INC=`mecab-config --cflags` -I$(INCLUDE) -I$(INCLUDE)/MacOS

all:
$(CXX) -O3 -c -fpic $(TARGET)_wrap.cxx  $(INC)
        $(CXX) -dynamiclib  $(TARGET)_wrap.o -o lib$(TARGET).dylib $(LIBS)
        $(JAVAC) $(PACKAGE)/*.java
        $(JAVAC) test.java
        $(JAR) cfv $(TARGET).jar $(PACKAGE)/*.class

test:
        env DYLD_LIBRARY_PATH=. $(JAVA) test

clean:
        rm -fr *.jar *.o *.dylib *.so *.class $(PACKAGE)/*.class

cleanall:
        rm -fr $(TARGET).java *.cxx
 \> 수정이 다 되었으면 저장

>> make 명령을 실행해서 libMeCab.dylib와 MeCab.jar가 생성되어 있어야 한다.

$ make

컴파일이 성공적으로 완료되면 디렉토리명을 수정한후 경로를 다음과 같이 변경하자.

mv mecab-java-0.996 mecab-java # 디렉토리 이름을 변경

mv mecab-java /usr/local/bin/ # 디렉토리 위치 변경

로컬 계정의 profile파일에 동적 라이브러리 경로를 추가하자

$ cd ~/

$ vi .bash_profile

export DYLD_LIBRARY_PATH=/usr/local/bin/mecab-java

# 저장 후 반영

$ . .bash_profile

MeCab에서 형태소 분석 프로그램 작성

mecab-java-0.996 압축을 해제한 폴더에서 MeCabTest.java 파일을 만든다.

import org.chasen.mecab.Tagger;
import org.chasen.mecab.Node;
import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;

public class MeCabTest {
    static {
        try {
            System.loadLibrary ( "MeCab"); // MeCab을로드
        } catch (UnsatisfiedLinkError e) {
            // MeCab을로드 할 때의 처리
            System.err.println ( "Can not load the example native code \ nMake sure your LD_LIBRARY_PATH contains \ n"+ e);
            System.exit (1);
        }
    }

    public static void main (String [] args)
    {
        HashMap map = new HashMap ();

        Tagger tagger = new Tagger (); // 형태소 분석의 준비
        String aString = "자연어처리의 시작이라 할 수 있는 형태소 분석에 대해서 알아본다.";
        System.out.println ( "입력 :"+ aString);

        tagger.parse (aString); // 이것을 쓰고 두지 않으면 다음 잘 작동하지 않았다.

           Node node = tagger.parseToNode (aString); // 노드에 분해
        for (; node! = null; node = node.getNext ()) // 노드를 순차적으로 출력
        {
            String str = node.getFeature (); // 품사 등의 정보를 저장
            String [] strAry = str.split ( ""); // ","로 구분하여 배열에 저장

            String word = node.getSurface (); // 단어를 저장
            String feature = strAry [0]; // 품사를 저장

            System.out.println (word + "\ t"+ feature); // 단어와 품사를 출력

            if (map.containsKey (word)) {
                // 만약 이미 map에 등록되어있는 단어라면 카운트 플러스
                map.put (word, map.get (word) + 1); // 단어 word로 이미 저장되어있는 카운트 수에 1을 더해 등록하기
            } else {
                // 만약 아직 map에 등록되지 않은 단어라면 카운트를 1로 등록
                map.put (word, 1); // 단어 word와 횟수는 1 세트에 저장
            }
        }

        // map에서 저장되는 단어와 개수를 출력하는
        for (Iterator it = map.entrySet (). iterator (); it.hasNext ();) {
            Map.Entry entry = (Map.Entry) it.next ();
            Object key = entry.getKey ();
            Object value = entry.getValue ();
            System.out.println ( "단어 :"+ key + "\ t 출현 횟수 :"+ value);
        }
    }
}

출력결과

javac -cp MeCab.jar MeCabTest.java

java -Djava.library.path=/usr/local/bin/mecab-java -cp .:MeCab.jar MeCabTest

입력 :자연어처리의 시작이라 할 수 있는 형태소 분석에 대해서 알아본다.
 B
자연어 N
처리 N
의 J
시작 N
이 V
라 E
할 V
수 N
있 V
는 E
형태소 N
분석 N
에 J
대해서 V
알아본다 V
. S
 B
단어 :  출현 횟수 :2
단어 :할  출현 횟수 :1
단어 :있  출현 횟수 :1
단어 :처리  출현 횟수 :1
단어 :시작  출현 횟수 :1
단어 :분석  출현 횟수 :1
단어 :.  출현 횟수 :1
단어 :알아본다  출현 횟수 :1
단어 :에  출현 횟수 :1
단어 :자연어  출현 횟수 :1
단어 :대해서  출현 횟수 :1
단어 :이  출현 횟수 :1
단어 :는  출현 횟수 :1
단어 :의  출현 횟수 :1
단어 :수  출현 횟수 :1
단어 :형태소  출현 횟수 :1
단어 :라  출현 횟수 :1
profile
Search engine developer / platform architect - software engineer

0개의 댓글