2015년 8월 31일 월요일

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


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

GCC 컴파일러 설치 여부 확인


$gcc -v

configure: error: C compiler cannot create executables
Mac OS에서 위와 같은 메시지가 출력하면 컴파일러가 설치되지 않은 것이다.

App Store > Xcode 설치

mecab-ko 설치

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

2. 압축풀기 및 컴파일
    $ 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 설치

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

2. 압축풀기 및 컴파일
    $ 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 설치

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

2. 압축풀기 및 컴파일
    $ 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


댓글 없음:

댓글 쓰기