アプリケーション開発ポータルサイト
ServerNote.NET
Amazon.co.jpでPC関連商品タイムセール開催中!
カテゴリー【C/C++DebianFreeBSD
形態素解析エンジンMecabをソースからインストールしてC/C++で使う
POSTED BY
2023-10-12

Mecabとは入力文字列を文節に分解してくれるオープンソースの形態素解析エンジン。
ユーザー入力を分解して自動応答するチャットボットで広く使われている。

まず、以下本家サイトから本体とIPA辞書をダウンロードする。

https://taku910.github.io/mecab/

mecab-0.996.tar.gz # 本体
mecab-ipadic-2.7.0-20070801.tar.gz # IPA辞書

取得したら /usr/local/src に設置する。

本体コンパイル・インストール

sudo -s
cd /usr/local/src
tar xvfzp mecab-0.996.tar.gz
cd mecab-0.996
./configure --with-charset=utf8 --enable-utf8-only
make
make install

辞書コンパイル・インストール

sudo -s
cd /usr/local/src
tar xvfzp mecab-ipadic-2.7.0-20070801.tar.gz
mecab-ipadic-2.7.0-20070801
./configure --with-charset=utf8 --enable-utf8-only
make
make install

/usr/local/以下にインストールされたので、一般ユーザーに戻ってテストしてみる。

hogeuser@debian:~$ mecab
すもももももももものうち
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

ソースからインストールすると、C/C++のライブラリも自動で入るのですぐ使える。
以下、サンプルを書いてみる。

C/C++mecab.cGitHub Source
#include <stdio.h>
#include <mecab.h>
#include <stdlib.h>
#include <string.h>

#define strnull(x) (x == NULL || x[0] == '\0')
#define countof(x) sizeof(x) / sizeof(x[0])

int main(void) {
  char name[512], *ptr;
  char *argv_a[] = {(char *)"mecab", (char *)"-Owakati"};
  char *argv_b[] = {(char *)"mecab", (char *)"-Ochasen"};
  mecab_t *mecab;

  sprintf(name, "すもももももももものうち");

  if ((mecab = mecab_new(countof(argv_a), argv_a)) != NULL) {
    fprintf(stdout, "mecab_new ok\n");
    if ((ptr = (char *)mecab_sparse_tostr(mecab, name)) != NULL) {
      fprintf(stdout, "mecab_sparse_tostr ok string is:\n%s\n", ptr);
    }
    mecab_destroy(mecab);
  }

  if ((mecab = mecab_new(countof(argv_b), argv_b)) != NULL) {
    fprintf(stdout, "mecab_new ok\n");
    if ((ptr = (char *)mecab_sparse_tostr(mecab, name)) != NULL) {
      fprintf(stdout, "mecab_sparse_tostr ok string is:\n%s\n", ptr);
    }
    mecab_destroy(mecab);
  }

  return 0;
}

char*型配列をmecab_newに渡す。これはmecabコマンドを呼ぶのと同じ形式になる。
argv_aは mecab -Owakati と実行するに同じ、
argv_bは mecab -Ochasen と実行するに同じ。
mecab_sparse_tostrで入力文字列の解析を実行し、結果がptrに返る。コマンドの出力と同じもの。
終わったらmecab_destroy。

コンパイル、実行結果

gcc -o mecab.x mecab.c -I/usr/local/include -L/usr/local/lib -lmecab

./mecab.x

mecab_new ok
mecab_sparse_tostr ok string is:
すもも も もも も もも の うち

mecab_new ok
mecab_sparse_tostr ok string is:
すもも  スモモ  すもも  名詞-一般
も      モ      も      助詞-係助詞
もも    モモ    もも    名詞-一般
も      モ      も      助詞-係助詞
もも    モモ    もも    名詞-一般
の      ノ      の      助詞-連体化
うち    ウチ    うち    名詞-非自立-副詞可能
EOS

MecabをPythonに組み込む編はこちら

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

☆ServerNote.NETショッピング↓
ShoppingNote / Amazon.co.jp
☆お仲間ブログ↓
一人社長の不動産業務日誌
【キーワード検索】