$Id: libmecab.html,v 1.18 2004/06/21 09:34:35 taku-ku Exp $;
MeCabには, C/C++ 共用のライブラリ (mecab.h, libmecab.so/limecab.dll) があります.
C ライブラリは以下の関数を提供しています.
mecab_t *mecab_new (int argc, char **argv)
mecab_t *mecab_new2 (char *arg)
char *mecab_strerror (mecab_t* m)
char *mecab_sparse_tostr (mecab_t *m, char
*str)
char *mecab_sparse_tostr2 (mecab_t *m, char *str,
unsigned int len)
char *mecab_sparse_tostr3 (mecab_t *m, char
*istr,unsigned int ilen char *ostr,unsigned int olen)
char *mecab_nbest_sparse_tostr
(mecab_t *m, unsigned int N, char *str)
char *mecab_nbest_sparse_tostr2
(mecab_t *m, unsigned int N, char *str, unsigned int len)
char *mecab_nbest_sparse_tostr3
(mecab_t *m, unsigned int N, char *str, unsigned int len, char
*ostr, unsigned int olen)
int mecab_nbest_init
(mecab_t* m, char* str);
int mecab_nbest_init2
(mecab_t* m, char* str, len);
char *mecab_next_tostr
(mecab_t* m)
char *mecab_next_tostr2
(mecab_t *m , char *ostr, unsigned int olen)
int mecab_lock (mecab_t *m)
int mecab_unlock (mecab_t *m)
void mecab_destroy(mecab_t *m)
#include <mecab.h> #include <stdio.h> int main (int argc, char **argv) { mecab_t *c; char p[1024] = "太郎は次郎が持っている本を花子に渡した。"; char *r; int i; c = mecab_new (argc, argv); if (c == NULL) { fprintf (stderr, "Exception:%s\n", mecab_strerror (c)); return -1; } r = mecab_sparse_tostr(c, p); if (r == NULL) { fprintf (stderr, "Exception:%s\n", mecab_strerror (c)); mecab_destroy(c); return -1; } printf ("INPUT: %s\n", p); printf ("RESULT:\n%s", r); r = mecab_nbest_sparse_tostr (c, 10, p); if (r == NULL) { fprintf (stderr, "Exception: [%s]\n", mecab_strerror (c)); return -1; } fprintf (stdout, "NBEST: %s", r); if (! mecab_nbest_init (c, p)) { fprintf (stderr, "Exception: [%s]\n", mecab_strerror (c)); return -1; }; for (i = 0; i < 10; ++i) { printf ("%d: %s", i, mecab_nbest_next_tostr (c)); } mecab_destroy(c); return 0; }
% cc -O2 `mecab-config --cflags` example.c -o example \ `mecab-config --libs`
まず, コンパイル作業を行うディレクトリに include\mecab.h,
bin\libmecab.dll lib\libmecab.lib をコピーします.
この後の作業は, 使用するコンパイラによって微妙に変わります.
cygwin/mingw 環境の場合
% gcc -DDLL_IMPORT -I. example.c -o example.exe libmecab.dll
Visual Studio .NET C++の場合
% cl -DDLL_IMPORT -I. example.c libmecab.lib
BCC32 環境の場合
インポートライブラリの作成 % implib.exe /a /f libmecab.lib libmecab.dll コンパイル % bcc32 -DDLL_IMPORT -I. example.c libmecab.lib
さらに, 以下例ように, libmecab.dll と動的
にリンクすることも可能です.
この場合は,
インポートライブラリを作成する必要はありません.
#include <stdio.h> #include <windows.h> typedef void* (WINAPI *FPINIT) (int, char **); typedef char* (WINAPI *FPERR) (void*); typedef char* (WINAPI *FPPARSE) (void*, char*); typedef void (WINAPI *FPDEL) (void *); int main (int argc, char **argv) { char p[] = "太郎は次郎が持っている本を花子に渡した。"; HINSTANCE hLib = LoadLibrary("libmecab.dll"); if (hLib) { FPINIT fpInit = (FPINIT) GetProcAddress(hLib, "mecab_new"); FPERR fpErr = (FPERR) GetProcAddress(hLib, "mecab_strerror"); FPPARSE fpParse = (FPPARSE) GetProcAddress(hLib, "mecab_sparse_tostr"); FPDEL fpDel = (FPDEL) GetProcAddress(hLib, "mecab_destroy"); if (fpInit && fpErr && fpParse && fpDel) { void *c = (void *)(*fpInit)(argc, argv); if (!c) { fprintf (stderr, "Exception %s\n", (*fpErr)(c)); FreeLibrary(hLib); return -1; } printf ("INPUT: %s\n", p); printf ("RESULT:\n%s", (char *)(*fpParse)(c, p)); (*fpDel)(c); } FreeLibrary(hLib); } return 0; }
MeCab は, マルチスレッド環境で使用することが可能です. 使い方は, 以下の2つの方法があります.
1つのスレッドに 1インスタンスを割りあてる場合は, ユーザがとりたてて必要することはございません. 辞書は mmap (MapViewOfFile) を用いて, OS の仮想メモリ上に 割りあてられるため, 複数のインスタンスを作成しても, 多くのメモリを使用することは ありません.
この場合は, 同期をとる必要があります. configure option にて --enable-mutex を指定して make してください. ライブラリでは, mecab_lock にて 1つのスレッドが使用権を取得し, 解析後に mecab_unlock を使い使用権を 開放します. さらに, mecab_sparse_tostr () が返すメモリ領域は, 各インスタンスが管理し ています. そのため, unlock は, mecab_sparse_tostr () の結果を アプリケーション側で処理した 後に 行なう必要があります. ただし, mecab_sparse_tostr3 にて, バッファを指定した場合は その限りではありません.
マルチスレッド (pthread) の場合の例を example/example-thread.c example/example-thread2.c に示します.
$Id: libmecab.html,v 1.18 2004/06/21 09:34:35 taku-ku Exp $;
taku-ku@is.aist-nara.ac.jp