Senna rev827で追加されたsen_lex_set_mecab_args関数

Senna開発者の方がさっそくmecab_new関数呼び出し時の引数を事前に指定するためのAPIを作ってくださいました!

Senna内部でのMeCabの初期化はlib/lex.cにてSOLE_MECAB_CONFIRMマクロを通じて行われていました。

以前は"-Owakati"が固定で指定されていたのですが、このリビジョンからオプションを外部設定できるようになりました。

+static char *sen_lex_default_mecab_argv[] = {"", "-Owakati"};
+
+static int sen_lex_mecab_argc = 2;
+static char **sen_lex_mecab_argv = sen_lex_default_mecab_argv;
+
 #define SOLE_MECAB_CONFIRM do {\
   if (!sole_mecab) {\
-    char *arg[] = {"", "-Owakati"};\
     MUTEX_LOCK(sole_mecab_lock);\
-    if (!sole_mecab) { sole_mecab = mecab_new(2, arg); }\
+    if (!sole_mecab) { sole_mecab = mecab_new(sen_lex_mecab_argc, sen_lex_mecab_argv); }\
     MUTEX_UNLOCK(sole_mecab_lock);\
   }\
 } while(0)

+sen_rc
+sen_lex_set_mecab_args(int argc, char **argv)
+{
+  sen_lex_mecab_argc = argc;
+  sen_lex_mecab_argv = argv;
+  if (sole_mecab) {
+    SEN_LOG(sen_log_alert, "mecab already initialized");
+    return sen_invalid_argument;
+  }
+  SOLE_MECAB_CONFIRM;
+  return sen_success;
+

与えた引数で完全に上書きする感じですね。

mecab_newはsen_init時に呼ばれるのではなく、sen_init後の初回のlex処理時に呼ばれます。ですのでsen_lex_set_mecab_argsを呼ぶべきタイミングはsen_init直後とかが良いですね。

Tritonnではこれを利用して$basedir/lib/mecab/ipadicとかをdicdirとして指定するようにしてみたいと思います。