その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

mecab での形態素解析を試してみました

https://github.com/FLCLjp/iPhone-libmecab
こちらに上げられている mecab を用いて形態素解析を行うサンプルアプリで、どういう結果がでるのか試してみました。

  • 入力文1:ゴルフに行ってきた



  • 入力文2:ゴルフ行ってきた




うーん、微妙だ。。


キーワード抽出的な使い方ができればと思ったのですが、助詞を抜いただけで「ゴルフ行」となるのでは精度的に厳しいものがあります。


どっかパラメータいじって調整の余地はあるのか、他にも使えそうな情報がとれるのか、調べてみました。


こちらの本家のページによると、mecabから形態素解析結果として得られる mecab_node_t 構造体の中身は、以下のようになっています。

struct mecab_node_t  *prev;  // 一つ前の形態素へのポインタ
struct mecab_node_t  *next;  // 一つ先の形態素へのポインタ

struct mecab_node_t  *enext; // 同じ位置で終わる形態素へのポインタ
struct mecab_node_t  *bnext; // 同じ開始位置で始まる形態素へのポインタ

char  *surface;             // 形態素の文字列情報
                            // NULL terminateされていません. 文字列として取り出すには
	      // strncpy(buf, node->feature, node->length) とする必要があります

char  *feature;             // CSV で表記された素性情報
unsigned int   length;      // 形態素の長さ
unsigned int   rlength;     // 形態素の長さ(先頭のスペースを含む)
unsigned int   id;          // 形態素に付与される ユニークID
unsigned short rcAttr;      // 右文脈 id
unsigned short lcAttr;      // 左文脈 id
unsigned short posid;       // 形態素 ID
unsigned char  char_type;   // 文字種情報
unsigned char  stat;        // 形態素の種類: 以下のマクロの値
                            // #define MECAB_NOR_NODE  0
                            // #define MECAB_UNK_NODE  1
                            // #define MECAB_BOS_NODE  2
                            // #define MECAB_EOS_NODE  3
unsigned char  isbest;      // ベスト解の場合 1, それ以外 0

float          alpha;       // forward backward の foward log 確率
float          beta;        // forward backward の backward log 確率
float          prob;        // 周辺確率
                            // alpha, beta, prob は -l 2 オプションを指定した時に定義されます

short          wcost;       // 単語生起コスト
long           cost;        // 累積コスト


この中でfeature、surface以外に使えそうな値は、char_type(文字種情報)、stat(形態素の種類)、isbest(ベスト解の場合 1, それ以外 0)、prob(周辺確率)あたりでしょうか。
char_typeやstatは品詞の手がかりになるかもしれませんし、isbestやprobは精度の低い結果をリジェクトするのに使えるかもしれません。


が、usr/include/mecab.h を見ると、

#if 1 /* MECAB_APPLE_ENHANCEMENT */
#else  /* original */
  unsigned char         isbest;
  unsigned int          sentence_length; /* it is avaialbe only when BOS node */
  float                 alpha;
  float                 beta;
  float                 prob;
#endif

こんな感じで、iPhoneにビルトインされたmecabではprobやisbestは使えなくされているようでした・・・



で、とりあえずchar_type(文字種情報)、stat(形態素の種類)を出力してみた結果

  • 入力文1:ゴルフに行ってきた

surface:ゴルフ, feature:補助, stat:1, char_type:0
surface:に, feature:煮, stat:0, char_type:5
surface:行, feature:補助, stat:1, char_type:0
surface:って, feature:って, stat:0, char_type:5
surface:きた, feature:北, stat:0, char_type:5

  • 入力文2:ゴルフ行ってきた

surface:ゴルフ行, feature:補助, stat:1, char_type:0
surface:って, feature:って, stat:0, char_type:5
surface:きた, feature:北, stat:0, char_type:5


ちょっとこの例文だけだと何とも言いがたいのと、mecabはiPhoneでちゃんと稼働している実績があるので何かやりようはあるはずなので、また追って研究します。