# ソフトわかち書き

## 概要

MeCab 0.90 よりソフトわかち書きの機能が付きました. ソフトわかち書きは 入力文に対して可能なすべての形態素列を周辺確率付きで出力する機能です. 全文検索のインデキシングに使うことで,複合語の単語分割の曖昧性等を 解決することができます.

ソフトわかち書きの詳細については論文をご参照下さい.

## 全形態素の出力

MeCab はデフォルトで最適解のみを出力します. -a オプションを指定すると 最適解ではなく, ラティス中の全形態素を出力します.

    % mecab -a
    東京都庁
    東京    名詞,固有名詞,地域,一般,*,*,東京,トウキョウ,トーキョー
    東      名詞,固有名詞,一般,*,*,*,東,ヒガシ,ヒガシ
    東      名詞,固有名詞,地域,一般,*,*,東,ヒガシ,ヒガシ
    東      名詞,固有名詞,人名,名,*,*,東,ヒガシ,ヒガシ
    東      名詞,固有名詞,人名,姓,*,*,東,アズマ,アズマ
    東      名詞,一般,*,*,*,*,東,ヒガシ,ヒガシ
    京都    名詞,固有名詞,一般,*,*,*,京都,キョウト,キョート
    京都    名詞,固有名詞,地域,一般,*,*,京都,キョウト,キョート
    京      名詞,固有名詞,地域,一般,*,*,京,キョウ,キョー
    京      名詞,固有名詞,人名,名,*,*,京,ミヤコ,ミヤコ
    京      名詞,固有名詞,人名,姓,*,*,京,キョウ,キョー
    都庁    名詞,一般,*,*,*,*,都庁,トチョウ,トチョー
    都      名詞,接尾,地域,*,*,*,都,ト,ト
    都      名詞,固有名詞,地域,一般,*,*,都,ミヤコ,ミヤコ
    都      名詞,固有名詞,人名,姓,*,*,都,ミヤコ,ミヤコ
    都      名詞,固有名詞,人名,名,*,*,都,ミヤコ,ミヤコ
    都      名詞,一般,*,*,*,*,都,ト,ト
    庁      名詞,接尾,一般,*,*,*,庁,チョウ,チョー
    庁      名詞,固有名詞,地域,一般,*,*,庁,チョウ,チョー
    庁      名詞,一般,*,*,*,*,庁,チョウ,チョー
    EOS

## 周辺確率の計算と出力

各形態素の周辺確率(その形態素が入力文の中でどのくらいの確率で出現する のか)の計算を行うには, -a と -m オプションを同時に使います.

-m オプションを使うと浮動小数点演算が入るためデフォルトに比べて 8倍程度遅くなります.

各形態素の周辺確率を出力するには, -F オプションを使って出力フォーマットを個別に出力す る必要があります. 通常 %pP %pb を使います. 出力フォーマットの指定方法は こちらをご覧下ざい.

- %pP: 周辺確率
- %pb: 最適解のとき * それ以外は空白文字

    % mecab -m -a -F"%m %H %pP %pb\n" -E"EOS\n"
    京都大学
    京都大学 名詞,固有名詞,組織,*,*,*,京都大学,キョウトダイガク,キョートダイガク 0.559944 *
    京都大 名詞,固有名詞,組織,*,*,*,京都大,キョウトダイ,キョートダイ 0.073824
    京都 名詞,固有名詞,一般,*,*,*,京都,キョウト,キョート 0.004990
    京都 名詞,固有名詞,地域,一般,*,*,京都,キョウト,キョート 0.360982
    京 名詞,固有名詞,地域,一般,*,*,京,キョウ,キョー 0.000161
    京 名詞,固有名詞,人名,名,*,*,京,ミヤコ,ミヤコ 0.000003
    京 名詞,固有名詞,人名,姓,*,*,京,キョウ,キョー 0.000096
    都 名詞,接尾,地域,*,*,*,都,ト,ト 0.000166
    都 名詞,固有名詞,地域,一般,*,*,都,ミヤコ,ミヤコ 0.000001
    都 名詞,固有名詞,人名,姓,*,*,都,ミヤコ,ミヤコ 0.000006
    都 名詞,固有名詞,人名,名,*,*,都,ミヤコ,ミヤコ 0.000072
    都 名詞,一般,*,*,*,*,都,ト,ト 0.000015
    大学 名詞,固有名詞,地域,一般,*,*,大学,ダイガク,ダイガク 0.004919
    大学 名詞,固有名詞,人名,名,*,*,大学,ダイガク,ダイガク 0.004441
    大学 名詞,一般,*,*,*,*,大学,ダイガク,ダイガク 0.350523
    大 名詞,接尾,一般,*,*,*,大,ダイ,ダイ 0.003603
    大 接頭詞,名詞接続,*,*,*,*,大,ダイ,ダイ 0.001123
    大 接頭詞,動詞接続,*,*,*,*,大,オオ,オー 0.000011
    大 名詞,固有名詞,地域,一般,*,*,大,オオ,オー 0.000171
    大 名詞,固有名詞,人名,名,*,*,大,マサル,マサル 0.000016
    大 名詞,一般,*,*,*,*,大,ダイ,ダイ 0.001424
    学 名詞,接尾,一般,*,*,*,学,ガク,ガク 0.067828
    学 名詞,固有名詞,地域,一般,*,*,学,ガク,ガク 0.001092
    学 名詞,固有名詞,人名,名,*,*,学,マナブ,マナブ 0.004203
    学 名詞,一般,*,*,*,*,学,ガク,ガク 0.007051
    EOS

-t 数値 オプションを使って確率値の「なめらかさ」を変更することができます. 数値を小さくると, 確率値がなめらかになり, 短かい形態素が大きな確率値を 持つようになります. 数値を大きくすると最適解の確率が大きくなります.デフォルトは 0.75 です.

    % mecab -m -a -F"%m %H %pP %pb\n" -t0.1 -E"EOS\n"
    京都大学
    京都大学 名詞,固有名詞,組織,*,*,*,京都大学,キョウトダイガク,キョートダイガク 0.023617 *
    京都大 名詞,固有名詞,組織,*,*,*,京都大,キョウトダイ,キョートダイ 0.052790
    京都 名詞,固有名詞,一般,*,*,*,京都,キョウト,キョート 0.113576
    京都 名詞,固有名詞,地域,一般,*,*,京都,キョウト,キョート 0.200919
    京 名詞,固有名詞,地域,一般,*,*,京,キョウ,キョー 0.206514
    京 名詞,固有名詞,人名,名,*,*,京,ミヤコ,ミヤコ 0.157030
    京 名詞,固有名詞,人名,姓,*,*,京,キョウ,キョー 0.245554
    都 名詞,接尾,地域,*,*,*,都,ト,ト 0.168921
    都 名詞,固有名詞,地域,一般,*,*,都,ミヤコ,ミヤコ 0.090030
    都 名詞,固有名詞,人名,姓,*,*,都,ミヤコ,ミヤコ 0.098721
    都 名詞,固有名詞,人名,名,*,*,都,ミヤコ,ミヤコ 0.120077
    都 名詞,一般,*,*,*,*,都,ト,ト 0.131348
    大学 名詞,固有名詞,地域,一般,*,*,大学,ダイガク,ダイガク 0.056029
    大学 名詞,固有名詞,人名,名,*,*,大学,ダイガク,ダイガク 0.063926
    大学 名詞,一般,*,*,*,*,大学,ダイガク,ダイガク 0.097919
    大 名詞,接尾,一般,*,*,*,大,ダイ,ダイ 0.150510
    大 接頭詞,名詞接続,*,*,*,*,大,ダイ,ダイ 0.151888
    大 接頭詞,動詞接続,*,*,*,*,大,オオ,オー 0.083163
    大 名詞,固有名詞,地域,一般,*,*,大,オオ,オー 0.101090
    大 名詞,固有名詞,人名,名,*,*,大,マサル,マサル 0.090363
    大 名詞,一般,*,*,*,*,大,ダイ,ダイ 0.128706
    学 名詞,接尾,一般,*,*,*,学,ガク,ガク 0.233658
    学 名詞,固有名詞,地域,一般,*,*,学,ガク,ガク 0.150100
    学 名詞,固有名詞,人名,名,*,*,学,マナブ,マナブ 0.174424
    学 名詞,一般,*,*,*,*,学,ガク,ガク 0.200327
    EOS

## ライブラリからの利用

-a オプションを指定した場合, mecab_sparse_tonode が返す node は 全形態素を辿ることができる双方向リストとなります. -m を指定すると mecab_node_t::prob に周辺確率が代入されます.

    mecab_t *mecab;
    mecab_node_t *node;

    mecab = mecab_new2("-m -a");

    node = mecab_sparse_tonode(mecab, input);
    for (; node; node = node->next) {
      /* 最適解もしくは確率が 0.05 以上のとき出力 */
      if (node->isbest || node->prob >= 0.05)  {
        fwrite (node->surface, sizeof(char), node->length, stdout);
        printf("\t%s\t%f\n", node->feature, node->prob);
      }
    }