MeCabをコマンドラインから実行する場合の指定できる引数の一覧と、その実行例を並べました。
使用しているMeCabのバージョンは0.98pre2、システム辞書はNAIST(mecab-naist-jdic-0.6.1-20090630)を使っています。
Linuxでの実行例です。Windowsユーザの方は、随時内容を心の目で読み替えてください。
● | -r | --rcfile | FILE | 使用するリソースファイルを指定する |
● | -d | --dicdir | DIR | 使用するシステム辞書を指定する |
● | -u | --userdic | FILE | 使用するユーザ辞書を指定する |
● | -l | --lattice-level | INT | 索性レベルを指定する |
● | -D | --dictionary-info | 辞書の情報を表示する | |
● | -a | --all-morphs | 該当する全ての形態素を表示する | |
● | -O | --output-format-type | TYPE | 出力するフォーマット形式を指定する |
● | -p | --partial | 制約付き解析(部分解析) | |
● | -F | --node-format | STR | Nodeの出力方式を設定する |
● | -U | --unk-format | STR | 未知語の出力形式を設定する |
● | -B | --bos-format | STR | BOSの出力形式を指定する |
● | -E | --eos-format | STR | EOSの出力形式を指定する |
● | -S | --eon-format | STR | N Bsetの終端文字列を指定する |
● | -x | --unk-feature | STR | 未知語のfeature文字列を指定する |
● | -b | --input-buffer-size | INT | 入力文字列のバッファサイズを指定する |
● | -P | --dump-config | MeCabのパラメータを表示する | |
-M | --open-mutable-dictionary | mutable辞書を開く(実験中) | ||
● | -C | --allocate-sentence | 入力文に新しいメモリを割当てる | |
● | -N | --nbest | INT | 最良の解析結果を上位N個表示する |
● | -t | --theta | FLOAT | thetaを指定する |
● | -c | --cost-factor | INT | cost factorを指定する |
● | -o | --output | FILE | 出力するファイルを指定する |
● | -v | --version | バージョン情報を表示する | |
● | -h | --help | ヘルプを表示する |
使用するリソースファイルを指定する
リソースファイルとは、辞書ディレクトリに入っている「dicrc」ファイルを指します。
試しにシステム辞書の「dicrc」ファイルをコピーして、「dicrc2」というファイルを作り、その中の「; simple」の「EOS」を「eos」に書き換えます。するとこんな風になります。
// リソースを指定せずに実行
$ echo テスト | mecab -O simple
テスト 名詞-サ変接続
EOS
// リソースを改変したdic2に指定して実行
$ echo テスト | mecab -r dicrc2 -O simple -d /usr/local/lib/mecab/dic/naist-jdic
テスト 名詞-サ変接続
eos
我が家の環境では、システム辞書ディレクトリをカレントディレクトリとした状態にするか、「-d」でシステム辞書ディレクトリを指定しないと、「-r」時に「./dicrc」に対して「no such file or directory」というエラーが出ました。
あまり使う機会が無さそうなコマンドなので詳細は未調査。
使用するシステム辞書を指定する
システム辞書がインストールされているディレクトリを指定することで、デフォルト以外のシステム辞書を手軽に使うことができます。
// IPA辞書がインストールされているディレクトリを指定
$ echo hoge | mecab -d /usr/local/lib/mecab/dic/ipadic
hoge 名詞,固有名詞,組織,*,*,*,*
EOS
// 同UniDicを指定
$ echo hoge | mecab -d /usr/local/lib/mecab/dic/unidic-mecab-1.3.12
hoge 名詞,普通名詞,一般,*,*,*
EOS
辞書を変えたので、結果が微妙に変化しました。
これらの使い分けをするには、もちろんそれぞれの辞書のインストールが必要です。
使用するユーザ辞書を指定する
ユーザ辞書ファイルを指定することで、指定した辞書の情報を含めて解析することができます。
試しに以下のような一語だけを含んだファイル(hoge1.csv)から、辞書を作成してみます。
アーサー王,1349,1349,-30000,名詞,固有名詞,人名,一般,*,*,*,アーサー王,アーサーオウ,アーサーオー
// ユーザ辞書作成コマンド
$ /usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/naist-jdic -u hoge1.dic -t utf-8 -f utf-8 hoge1.csv
生成されたdic1.dicという辞書を使って解析をしてみます。
// 未指定の場合の結果
$ echo アーサー王 | mecab
アーサー 名詞,固有名詞,人名,姓,*,*,アーサー,アーサー,アーサー,,
王 名詞,接尾,一般,*,*,*,王,オウ,オー,,
EOS
/ユーザ辞書指定時
$ echo アーサー王 | mecab -u dic1.dic
アーサー王 名詞,固有名詞,人名,一般,*,*,*,アーサー王,アーサーオウ,アーサーオー
EOS
複数のユーザ辞書使用する場合は、カンマで繋げます。(hoge2.dicはランスロットという言葉を含む)
// 未指定の場合の結果
$ echo ランスロット | mecab
ラン 名詞,一般,*,*,*,*,ラン,ラン,ラン,,
スロット 名詞,一般,*,*,*,*,スロット,スロット,スロット,,
EOS
$ echo ランスロット | mecab -u dic1.dic,dic2.dic
ランスロット 名詞,固有名詞,人名,一般,*,*,*,ランスロット,ランスロット,ランスロット
EOS
索性レベルを指定する
lattice-levelの設定は以下の3つ。
0 : 最適解のみが出力可能なレベル(デフォルト、高速)
1 : N-best解が出力可能なレベル(中速)
2 : ソフトわかち書きが可能なレベル(低速)
alpha, beta, prob辺りの結果を取る場合は、これを設定する必要があります。
$ echo 気分屋 | mecab -F"%m,%pP,%pA,%pB\n" -l1
気分,0.000000,0.000000,0.000000
屋,0.000000,0.000000,0.000000
EOS
$ echo 気分屋 | mecab -F"%m,%pP,%pA,%pB\n" -l2
気分,0.996378,-4.683214,-4.079328
屋,0.977003,-8.642894,-0.139286
EOS
辞書の情報を表示する
$ mecab -D
filename: /usr/local/lib/mecab/dic/naist-jdic/sys.dic
version: 102
charset: utf8
type: 0
size: 485263
left size: 1377
right size: 1377
どのシステム辞書を設定したっけとか、文字コードちゃんとUTF-8で設定されてるかなといったことを確認するのに使えそうです。「size」は登録したワードの数、「left size」と「right size」はleft-idとright-idの数のようです。
「-d」でシステム辞書を指定したり、「-u」でユーザ辞書を指定すれば、その情報も見られます。
$ mecab -D -d /usr/local/lib/mecab/dic/ipadic/
filename: /usr/local/lib/mecab/dic/ipadic/sys.dic
version: 102
charset: utf8
type: 0
size: 392126
left size: 1316
right size: 1316
IPAを「-d」で指定すると上記のような情報が出ました。sizeはNAISTより10万近く小さいようです。ちなみにUniDicは62万でした。
「-u」でユーザ辞書を指定した場合は、システム辞書とユーザ辞書、両方の情報が出ます。もちろんユーザ辞書をカンマ区切りで複数指定することも可能です。
$ mecab -D -u hoge1.dic,hoge2.dic
filename: /usr/local/lib/mecab/dic/naist-jdic/sys.dic
version: 102
charset: utf8
type: 0
size: 485263
left size: 1377
right size: 1377
filename: hoge.dic
version: 102
charset: utf-8
type: 1
size: 1
left size: 1377
right size: 1377
filename: hoge2.dic
version: 102
charset: utf-8
type: 1
size: 1
left size: 1377
right size: 1377
一致する可能性のある全ての形態素が表示されます。試しに「天使」という言葉を解析してみます。
$ echo 天使 | mecab -a
天使 名詞,一般,*,*,*,*,天使,テンシ,テンシ,,
天 名詞,一般,*,*,*,*,天,テン,テン,,
天 名詞,固有名詞,人名,名,*,*,天,タカシ,タカシ,,
天 名詞,一般,*,*,*,*,天,アメ,アメ,,
使 名詞,一般,*,*,*,*,使,ツカイ,ツカイ,,
使 名詞,一般,*,*,*,*,使,ヅカイ,ヅカイ,,
使 名詞,接尾,一般,*,*,*,使,シ,シ,,
EOS
たった2文字でこれだけの形態素が表示されます。普通の文章を流したら、出力量はえらいことになります。
ユーザ辞書を適用した際に思っていた解析結果が得られなかったら、これを使ってまず形態素として認識されているかを見るのも良いかもしれません。
また、これの解析結果を見ていると、指定した言葉に対してどんなパターンがあるかを感覚的に学べたりします。
thetaを指定する
Q. thetaとは何か。
A. すいません、分かりません。
Viterbiクラスの一要素みたいなので、多分、ビタビアルゴリズムに使う係数か何かなんでしょうが、不勉強の為詳細不明。とりあえずalpha、beta、prob辺りを計算する際に使用されているように見えます。
ソースをちゃんと読めば分かるとは思います。はい、すいません、いつか読みます。
cost factorを指定する
Q. cost factorとは何か。
A. すいません、分かりません。
内部的な値なので、値を変えるとどう結果が変わるかは不明。0以下が設定されるとエラーになります。
MeCab内のdefault値は700で、NAIST辞書はdicrcで800をデフォルト指定しています。
ソースを見た感じでは、辞書をgenerateする時と、Viterbiクラスでset_thetaする際にも見かけた。でも、値を変えると結果がどう変わるかは不明。
出力するフォーマット形式を指定する
Chasen互換、ヨミ付与、全情報出力などが選択できます。
指定できる引数の値は、各辞書ディレクトリの中のdicrc(IPAなら/usr/locallib/mecab/dic/ipadic/dicrc)の中に書いてあります。
また、ハードコーディングで「dump」と「wakati」の2つが設定されています。
まず引数なしで「もう 眠い」という言葉(「もう」と「眠い」の間に半角スペースあり)を解析した場合。半角スペースは無視され、以下のような結果になります。
$ echo もう眠い | mecab
もう 副詞,一般,*,*,*,*,もう,モウ,モー,,
眠い 形容詞,自立,*,*,形容詞・アウオ段,基本形,眠い,ネムイ,ネムイ,ねむい/眠い,
EOS
次に-Ochasenを指定してみます。chasenを指定すると、茶筌互換形式で表示されます。これがあるお陰で、茶筌用のソフトウェアでもつつがなくMeCabは動きます。
$ echo もう 眠い | mecab -Ochasen
もう モウ もう 副詞-一般
眠い ネムイ 眠い 形容詞-自立 形容詞・アウオ段 基本形
EOS
ちなみにchasenフォーマットのフォーマット文字列はこんな感じです。
; ChaSen
node-format-chasen = %m\t%f[7]\t%f[6]\t%F-[0,1,2,3]\t%f[4]\t%f[5]\n
unk-format-chasen = %m\t%m\t%m\t%F-[0,1,2,3]\t\t\n
eos-format-chasen = EOS\n
chasen2という身も蓋もない名前の引数を指定すると「include spaces」、つまり半角スペースを無視せずに扱います。下記の結果では、「眠い」という言葉の前の半角スペースが無視されずに解析結果に入っています。
$ echo もう 眠い | mecab -Ochasen2
もう モウ もう 副詞-一般
眠い ネムイ 眠い 形容詞-自立 形容詞・アウオ段 基本形
EOS
下はchasen2のフォーマット文字列です。chasenが「%m」にしている箇所が「%M」になっています。
; ChaSen (include spaces)
node-format-chasen2 = %M\t%f[7]\t%f[6]\t%F-[0,1,2,3]\t%f[4]\t%f[5]\n
unk-format-chasen2 = %M\t%m\t%m\t%F-[0,1,2,3]\t\t\n
eos-format-chasen2 = EOS\n
yomiは本当にシンプルに読みだけを出力します。
$ echo もう眠い | mecab -Oyomi
モウネムイ
フォーマット文字列はこんな感じです。
; yomi
node-format-yomi = %pS%f[7]
unk-format-yomi = %M
eos-format-yomi = \n
wakatiは単純に文字をスペースで分割しただけの結果を返します。
$ echo もう眠い | mecab -Owakati
もう 眠い
dumpは言葉の通り、実行結果のダンプを出してくれます。へー、これだけ処理してるんだ、という感覚を掴む為の勉強になります。
$ echo もう眠い | mecab -Odump
0 BOS BOS/EOS,*,*,*,*,*,*,*,* 0 0 0 0 0 0 2 1 0.000000 -5.983542 0.000000 0
3 もう 副詞,一般,*,*,*,*,もう,モウ,モー,, 0 6 1341 1341 34 6 0 1 -3.912857 -2.070693 0.999993 3652 0:3652:0.999993
2 も 動詞,自立,*,*,五段・ラ行,体言接続特殊2,もる,モ,モ,も/盛, 0 3 811 811 31 6 0 0 -11.365714 -10.379019 0.000000 10608 0:10608:0.000000
1 も 助詞,係助詞,*,*,*,*,も,モ,モ,, 0 3 285 285 16 6 0 0 -6.233571 -11.548766 0.000008 5818 0:5818:0.000008
7 う 動詞,自立,*,*,五段・ラ行,体言接続特殊2,うる,ウ,ウ,う/売/賣, 3 6 811 811 31 6 0 0 -16.561792 -6.377543 0.000000 15458 2:12280:0.000000 1:9640:0.000000
6 う 形容詞,自立,*,*,形容詞・アウオ段,ガル接続,うい,ウ,ウ,う/憂, 3 6 12 12 10 6 0 0 -15.224633 -4.668724 0.000001 14211 2:9711:0.000000 1:8393:0.000001
5 う 感動詞,*,*,*,*,*,う,ウ,ウ,, 3 6 3 3 2 6 0 0 -13.632860 -5.450216 0.000002 12733 2:6453:0.000000 1:6915:0.000002
4 う 助動詞,*,*,*,不変化型,基本形,う,ウ,ウ,, 3 6 531 531 25 6 0 0 -13.771323 -4.489350 0.000005 12878 2:5645:0.000000 1:7060:0.000005
<以下略>
長いので途中で省略しました。「もう」という言葉を解析するだけで、これだけのパターンを試しています。
各項目はハードコーディングされてるのでソースを参照してください。私が見た時は「writer.cpp」の「Writer::writeDump」にそれらしき記述がありました。
出力内容は以下のようなフォーマットになっているようです。大半はNodeのdumpです。
[ダンプされる項目] 0 : NodeID(内部ID) 1 : surface 2 : feature 3 : 文字の始端(int)(surface - str) 4 : 文字の終端(int)(surface - str + node->length) 5 : rcAttr(右文脈ID) 6 : lcAttr(左文脈ID) 7 : posid(形態素ID:pos-id.def参照) 8 : char_type(文字種情報:char.def参照) 9 : stat(普通:0,未知語:1,BOS:2,EOS:3) 10 : isbest(bestなら1) 11 : alpha(forward log確率) 12 : beta(backward log確率) 13 : prob(周辺確率) 14 : 単語生起コスト 15~ : 左NodeのID:cost:prob
左Nodeの内部ID:cost:probは複数ある場合は全て出力します。上記の実行例の最終行(ID:4)では、「う」という言葉の左Nodeとして「2:5645:0.000000」と「1:7060:0.000005」が選ばれています。「う」は「も」を左辺として持つ為、解析結果の中の「も = 1と2」が左辺として設定されているわけです。
(int)(surface - str) と (int)(surface - str + node->length) は文字の位置になります。実行例では、「も」は「0,3」、「う」は「3,6」、「もう」は「0,6」に設定されています。辞書がUTFなので1文字で3バイト取ってるようです。アルファベットをdumpすると、1文字の長さは1になります。
制約付き解析(部分解析)
文章の中の「この部分は名詞として」、「この部分は動詞として」といった指定をした上で解析をしてくれます。他の引数で出しているような「echo」で渡すとセグメンテーション違反が起きた為、「mecab -p」で実行した上で、解析する文字列を入力しています。
灰色の部分が入力値、白い文字が出力値になります。
「-p」を指定しなかった場合、「東京メトロ」を解析すると、「東京」と「メトロ」に分かれます。
$ mecab
東京メトロで帰る
東京 名詞,固有名詞,地域,一般,*,*,東京,トウキョウ,トーキョー,,
メトロ 名詞,一般,*,*,*,*,メトロ,メトロ,メトロ,,
で 助詞,格助詞,一般,*,*,*,で,デ,デ,,
帰る 動詞,自立,*,*,五段・ラ行,基本形,帰る,カエル,カエル,かえる/帰る,
EOS
これを「-p」で実行し、タブ区切りで「東京メトロ」を名詞として指定すると、こう解析できます。
$ mecab -p
東京メトロ 名詞
で帰る
EOS
東京メトロ 名詞
で 助詞,格助詞,一般,*,*,*,で,デ,デ,,
帰る 動詞,自立,*,*,五段・ラ行,基本形,帰る,カエル,カエル,かえる/帰る,
EOS
Nodeの出力形式を指定する
形式の指定の仕方は以下を参照
http://mecab.sourceforge.net/format.html
良く使うのは、この辺り。
%s - 形態素種類 (0: 通常, 1: 未知語, 2:文頭, 3:文末) %c - 単語生起コスト %pC - 1つ前の形態素との連接コスト %pc - 連接コスト + 単語生起コスト (文頭から累積)
実際にこれらを使用して解析してみる。
$ echo twitter | mecab -F"%m,%s,%c\n" -N2
twitter,1,12213
EOS
twitter,1,14043
EOS
上記例では、「%m - 表層文字列」、「%s - 形態素種類」(未知語なので1)、「%c - 単語生起コスト」を表示しています。
試しに「-N」で2つ表示してみましたが、別コストのtwitterが取れました。未知のアルファベットの連結でも種類があるのだなぁ。
未知語の出力形式を設定する
辞書にない語句を解析した場合の出力指定。試しに未知語に対しては「未知語」と表示させるように設定します。
$ echo ボスケテ、ボス | mecab -U"%M,未知語\n"
ボスケテ,未知語
、 記号,読点,*,*,*,*,、,、,、,,
ボス 名詞,一般,*,*,*,*,ボス,ボス,ボス,,
EOS
BOSの出力形式を指定する
解析結果の文頭の文字列を指定できます。下記の例では試しに「BOS」という言葉を文頭に出しています。
$ echo はまぐり | mecab -B "BOS\n"
BOS
はまぐり 名詞,一般,*,*,*,*,はまぐり,ハマグリ,ハマグリ,,
EOS
EOSの出力形式を指定する
引数なしで解析すると、必ず結果の終端にEOS(end of string)が付きます。
$ echo はまぐり | mecab
はまぐり 名詞,一般,*,*,*,*,はまぐり,ハマグリ,ハマグリ,,
EOS
「-E」を使うと、EOSの箇所に来る文字列を自由に変えられます。試しに「おしまい」に変えてみます。
$ echo はまぐり | mecab -E おしまい
はまぐり 名詞,一般,*,*,*,*,はまぐり,ハマグリ,ハマグリ,,
おしまい
空文字を指定すれば、何も出力されなくなります。
echo はまぐり | mecab -E ""
はまぐり 名詞,一般,*,*,*,*,はまぐり,ハマグリ,ハマグリ,,
N Bsetの終端文字列を指定する 使い方はこちらを参照。 http://sourceforge.jp/projects/mecab/lists/archive/users/2009-April/000355.html
$ echo "日本" | mecab -U'%m' -S'EONおしまい\n' -N2
日本 名詞,固有名詞,地域,国,*,*,日本,ニッポン,ニッポン,,
EOS
日本 名詞,固有名詞,地域,国,*,*,日本,ニホン,ニホン,,
EOS
EONおしまい
我が家の環境では「-U」を指定しないと「EONおしまい」が表示されませんでした。出来て間もない機能のようなので、詳細不明。
未知語のfeature文字列を指定する
$ echo ボスケテ、ボス | mecab -U"%M,未知語\n"
ボスケテ,未知語
、 記号,読点,*,*,*,*,、,、,、,,
ボス 名詞,一般,*,*,*,*,ボス,ボス,ボス,,
EOS
--unk-formatがあれば使う機会はあまりなさそうな気もするけど。
入力文字列のバッファサイズを指定する
デフォルトは8192。指定できる数字はソースを読む限り、「8192~ 8192*640」の間のようです。
MeCabは確か1行ごとに解析をしていたはずですが、試しに1行10000byteのファイルを食わせてみても落ちたりはしませんでした。
でもエラーメッセージ的にはこんなのが用意してあります。
input-buffer overflow. The line is splitted. use -b #SIZE option.
うーん、どういう挙動なんだろう。ちゃんとソース読まないと分からない。
MeCabのパラメータを表示する
システム辞書ファイルのパスや、出力フォーマット、nbestやthetaの値などを表示します。
$ mecab -P
bos-feature: BOS/EOS,*,*,*,*,*,*,*,*
bos-format:
config-charset: EUC-JP
cost-factor: 700
dicdir: /usr/local/lib/mecab/dic/naist-jdic
dump-config: 1
eon-format:
eos-format: EOS\n
eos-format-chasen: EOS\n
eos-format-chasen2: EOS\n
eos-format-simple: EOS\n
eos-format-yomi: \n
eval-size: 8
lattice-level: 0
nbest: 1
node-format: %m\t%H\n
node-format-chasen: %m\t%f[7]\t%f[6]\t%F-[0,1,2,3]\t%f[4]\t%f[5]\n
node-format-chasen2: %M\t%f[7]\t%f[6]\t%F-[0,1,2,3]\t%f[4]\t%f[5]\n
node-format-simple: %m\t%F-[0,1,2,3]\n
node-format-yomi: %pS%f[7]
theta: 0.75
unk-eval-size: 4
unk-format: %m\t%H\n
unk-format-chasen: %m\t%m\t%m\t%F-[0,1,2,3]\t\t\n
unk-format-chasen2: %M\t%m\t%m\t%F-[0,1,2,3]\t\t\n
unk-format-yomi: %M
入力文に新しいメモリを割当てる
内部的な話なので結果には影響ないです。たぶん。
ソースを見ると、「viterbi.cpp」辺りでこんな記述がありました。
copy_sentence_ = param.get("allocate-sentence");
<中略>
if (!partial_ && copy_sentence_) {
sentence_.resize(len + 1);
std::strncpy(&sentence_[0], str, len);
str = &sentence_[0];
}
partial指定してない時だったら、メモリを新たに確保しているようです。まぁ、あまり使う機会は無いか。
最良の解析結果を上位N個表示する
デフォルトでは最もコストの良い1つの結果を出しますが、「-N」を指定することで、コストの良い上位数件を出すことができます。
$ echo ありえん | mecab -N2
あり 動詞,自立,*,*,五段・ラ行,連用形,ある,アリ,アリ,あり/在り/有り,
えん 動詞,非自立,*,*,一段,体言接続特殊,える,エン,エン,,
EOS
あ フィラー,*,*,*,*,*,あ,ア,ア,,
りえん 名詞,サ変接続,*,*,*,*,りえん,リエン,リエン,,
EOS
上記結果のように別の解が出ることもありますが、いくらNを大きく指定しても品詞だけ違って分割される場所は同一の結果ばかりが並ぶこともしばしばです。
出力ファイルを指定する
$ echo hoge | mecab -o out.txt
上記コマンドを実行すると、「hoge」を解析した結果がファイル出力されます。Linuxユーザ的はリダイレクトで書くと思うので、使われることは少ないような気もします。
$ echo hoge | mecab > out.txt
これでももちろん、結果は同じです。
バージョンを表示する
$ mecab -v
mecab of 0.98pre2
引数の一覧とその簡易説明が出ます。
$ mecab -h
MeCab: Yet Another Part-of-Speech and Morphological Analyzer
Copyright(C) 2001-2008 Taku Kudo
Copyright(C) 2004-2008 Nippon Telegraph and Telephone Corporation
Usage: mecab [options] files
-r, --rcfile=FILE use FILE as resource file
-d, --dicdir=DIR set DIR as a system dicdir
-u, --userdic=FILE use FILE as a user dictionary
<以下略>