$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