mecab を便利に利用するためのtips - 高度なKWICをスクリプト無しで実現する -

TD;LR
========================================

- mecab標準のフォーマットは少し扱いづらい
- 出力フォーマットを弄ろう！
- 表層系+品詞の組み合わせができるようになり幸せ


mecabのデフォルトの出力形式は使いづらくないですか？
===============================================

前回の投稿の[複数の形態素解析を一度に見るコマンドを作った話](http://qiita.com/tkngue/items/b32ddcaf3ad80bf93d8c)に引き続き, 
形態素解析器の利用に関するtipsです.

形態素解析と言えば, mecabを使われている方が非常に多いかと思います.
企業利用だと, 製品への組み込みやすさから kuromojiを使ってる方も多いでしょうか？

kuromojiを使ったことはないですが
mecabを使っていて思うことは, "__標準の出力形式扱いづらくない？__"ということです.
よく利用するのは, 僕は__単語分割(分かち書き)__と__品詞取得__, __活用形の原形化__ぐらいなものなのですが
標準の出力形式だと, どうしても後段の処理で扱いづらいです.

ある問題に対する分析を行うため, とりあえずデータを大量にとってきて
用例検索のように 単語がどのように使われているかを検索する(KWIC:key word in the context)ことも多いです.
生のテキストコーパスだと単語分割されているわけではないので, 意外と検索するのが難しいです.

たとえば「〜する」という表現を検索したいとします.
何かしらの検索にはgrepをよく使いますよね. 
単純に "する" で grepすると "するめを食べる", "するが" などがでてきて困るわけですね.
そういうときには「動詞」としての「する」だけを検索したくなるのが良くあることです

ですが, 品詞解析を行うために mecabを通した形式ってこんな形になるんですね.

```sh
% echo 'mecabの標準形式は検索するのが難しい' | mecab
mecab   名詞,固有名詞,組織,*,*,*,*
の      助詞,連体化,*,*,*,*,の,ノ,ノ
標準    名詞,一般,*,*,*,*,標準,ヒョウジュン,ヒョージュン
形式    名詞,一般,*,*,*,*,形式,ケイシキ,ケイシキ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
検索    名詞,サ変接続,*,*,*,*,検索,ケンサク,ケンサク
する    動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
の      名詞,非自立,一般,*,*,*,の,ノ,ノ
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
難しい  形容詞,自立,*,*,形容詞・イ段,基本形,難しい,ムズカシイ,ムズカシイ
EOS
```

思うんですけど, __これってgrep書きづらくないですか？__
grepのオプションの--after, --beforeを使ってある程度の文脈を検索することができると思うのですが,
「行間を超えた検索ってどうするんだ？」 ってことになります.
これって, 1行1文形式になってないことに 起因していて
もう少し検索しやすい形に変換できないかなって思うわけです.
良くを言えば, __正規表現を使って前後の文脈が特定の品詞__を指定できるとなおのこと嬉しいですよね.
他, 活用形を消してしまって網羅率高くコーパスから取り出したいとか, 色々あると思います.

今日紹介するのは、そんなときに便利なtipsです.

## KWIC検索するための grepコマンド

さて待ちきれない人のために, 先にコマンドを紹介します.
品詞を使った正規表現検索をするためには用は以下のコマンドを使えば良いです.

```sh
% echo 'mecabの標準形式は検索するのが難しい' | mecab -F'%M/%f[0] ' --eos-format='' | grep -o '\S\+/名詞 する/動詞'
mecab/名詞 の/助詞 標準/名詞 形式/名詞 は/助詞 検索/名詞 する/動詞 の/名詞 が/助詞 難しい/形容詞
```

mecabには出力形式を変えるオプション(-F)があるので
それを操作して1行1文形式にしてしまえば良いのです.
さてこれを使うと, あっという間に KWIC検索が実現できるようになります.

-o オプションをつければ, マッチ部分だけの抽出ができるので

```sh
% cat path/to/text| mecab -F'%M/%f[0] ' -eos-format='' | grep '-o \S\+/名詞 ラーメン/名詞' | sort | uniq
醤油/名詞 ラーメン/名詞
とんこつ/名詞 ラーメン/名詞
味噌/名詞 ラーメン/名詞
```

というようにラーメンの種類を簡単に取得できるようになりますね！


おすすめの何かを検索したいときには

```sh
% cat path/to/text| mecab -F'%M/%f[0] ' -eos-format='' | grep '-o \S\+/名詞 を/助詞 \(お/接頭詞 )\?勧める/動詞' | sort | uniq
```

することで, お勧めの何かを見つけることができるかもしれません.

"助詞"から"助詞"の間の単語を全部抽出すれば句っぽいのが見つかるかも知れませんね.

```sh
% cat path/to/text| mecab -F'%M/%f[0] ' -eos-format='' | grep '-o \S\+/名詞 を/助詞 \(お/接頭詞 )\?勧める/動詞' | sort | uniq
```

とgrepが使いやすく工夫が色々できるようになるわけです.

他にも工夫次第で色々なことができると思います.

### 未知語を文脈付きで抽出

```sh
% cat path/to/text| mecab -U '%M/未知語' -F'%M/%f[0] ' -eos-format='' | grep '-o \(\(\S\+/\S\+\)\{3} \S\+/未知語 \(\(\S\+/\S\+\)\{3}' | sort | uniq
```

### 単語の頻度を数える(原形)

```sh
cat input.txt | mecab -F'%f[6] \n' -E '' | cut -f1 | sort | uniq -c | sort -nr
```

## mecabオプションの解説

何をやっているかというと, mecabには出力形式を指定するオプション(-Fや-U)があるので
これを使って検索しやすい形に書式を変更しているだけです.

詳しくは以下をご覧ください.
[mecabの出力フォーマットについて](https://taku910.github.io/mecab/format.html)

`mecab-config --dic-dir`下の辞書ごとの設定ファイル(dicrc)に追加することで
よく利用するフォーマットも登録可能です

```text:/usr/lib/mecab/ipadic/dicrc
:
:
:
: 

; oneline 
node-format-yomi = %M/%f[0]\s 
unk-format-yomi = %M/未知語 
eos-format-yomi =
```


```sh
% cat path/to/text| mecab -Ooneline 
```

普段使っているツールも 一工夫で 便利になることはよくあるので
どんどん共有していきましょう