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
$ 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
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
|
댓글 없음:
댓글 쓰기