Embulkで日本語をお手軽に形態素解析


[embulk-filter-kuromoji](https://github.com/toyama0919/embulk-filter-kuromoji)という日本語解析するプラグインを作りました。

kuromojiを使えば漢字を読みがなに変換したり形態素解析したりすることが出来ます。

今回はサンプルに従って幾つか代表的なユースケースを書きます。

# 使い方

## 今回のサンプルデータ
|title|
|:--|
|                    GMが燃料電池車の開発状況について講演、ホンダとの共同研究にも言及|
|                                          コンピュータエンターテインメントが向かう先|
|   Linear Technology、140V入力が可能な最大400mA出力の降圧型DC-DCコンバーターICを発売|
|         三菱電機、非飽和電圧検出機能を搭載した1200V耐圧のパワー半導体駆動用ICを発売|
|          東芝とSK Hynixがナノインプリントリソグラフィを共同開発、2017年の量産目指す|
|                 スマホと連携できる超小型FPGA開発キット、IoT向けにマクニカが量産出荷|
|ICチップの「指紋」をIoTのセキュリティ基盤に使う、三菱電機が遅延ベースのPUF技術を発表|
|        ユーザーが操作アプリや周辺アクセサリーを開発、オリンパスのレンズ交換型カメラ|
|            「インドネシアをもっと骨太の拠点にしていきたい」、スズキ常務役員の長尾氏|
|           インドネシアとタイの不振で営業利益は横ばい、スズキの2014年度第3四半期決算|


## 読みがなに変換

漢字を読みがなに変換したいだけの場合

```yaml
in:
  type: mysql
  host: localhost
  user: root
  database: hoge
  query: |
    select title from article limit 10
filters:
  - type: kuromoji
    keep_input: false
    key_names:
      - title
    settings:
      - { # 読みに変換、delimiterを空文字列にしているので形態素解析せず「読み」に変換するだけ
          suffix: '_reading_only', method: 'reading', delimiter: '' 
        }
out:
  type: stdout
```

methodをreadingにすると、カタカナに変換して出力されます。

```
$ embulk preview yml/kuromoji.yml
2015-12-03 14:30:13.117 +0900: Embulk v0.7.7
2015-12-03 14:30:15.343 +0900 [INFO] (preview): Loaded plugin embulk-input-mysql (0.6.0)
2015-12-03 14:30:15.385 +0900 [INFO] (preview): Loaded plugin embulk-filter-kuromoji (0.2.0)
2015-12-03 14:30:15.444 +0900 [INFO] (preview): Fetch size is 10000. Using server-side prepared statement.
2015-12-03 14:30:16.620 +0900 [INFO] (preview): Fetch size is 10000. Using server-side prepared statement.
2015-12-03 14:30:16.629 +0900 [INFO] (preview): SQL: select title from article limit 10

2015-12-03 14:30:16.633 +0900 [INFO] (preview): > 0.00 seconds
+---------------------------------------------------------------------------+
|                                                 title_reading_only:string |
+---------------------------------------------------------------------------+
|                   GMガネンリョウデンチシャノカイハツジョウキョウニツイテコウエン、ホンダトノキョウドウケンキュウニモゲンキュウ |
|                                                    コンピュータエンターテインメントガムカウサキ |
| Linear Technology、140Vニュウリョクガカノウナサイダイ400mAシュツリョクノコウアツガタDC-DCコンバーターICヲハツバイ |
|            ミツビシデンキ、ヒホウワデンアツケンシュツキノウヲトウサイシタ1200VタイアツノパワーハンドウタイクドウヨウICヲハツバイ |
|                    トウシバトSK Hynixガナノインプリントリソグラフィヲキョウドウカイハツ、2017ネンノリョウサンメザス |
|                         スマホトレンケイデキルチョウコガタFPGAカイハツキット、IoTムケニマクニカガリョウサンシュッカ |
|                ICチップノ「シモン」ヲIoTノセキュリティキバンニツカウ、ミツビシデンキガチエンベースノPUFギジュツヲハッピョウ |
|                           ユーザーガソウサアプリヤシュウヘンアクセサリーヲカイハツ、オリンパスノレンズコウカンガタカメラ |
|                             「インドネシアヲモットホネブトノキョテンニシテイキタイ」、スズキジョウムヤクインノナガオシ |
|                        インドネシアトタイノフシンデエイギョウリエキハヨコバイ、スズキノ2014ネンドダイ3シハンキケッサン |
+---------------------------------------------------------------------------+
```


## 形態素解析

形態素解析して、名詞だけ取り出すケースです。

```yml
in:
  type: mysql
  host: localhost
  user: root
  database: hoge
  query: |
    select title from article limit 10
filters:
  - type: kuromoji
    keep_input: false
    ok_parts_of_speech:
      - 名詞
    key_names:
      - title
    settings:
      - {
          suffix: _surface_form, method: 'surface_form', delimiter: '###'
        }
out:
  type: stdout

```

* 特定の品詞だけ出力してほしい(名詞だけ欲しいなど)というケースの場合はok_parts_of_speechを設定します

```
$ embulk preview yml/kuromoji_keitaiso.yml
2015-12-03 16:42:02.276 +0900: Embulk v0.7.7
2015-12-03 16:42:04.597 +0900 [INFO] (preview): Loaded plugin embulk-input-mysql (0.6.0)
2015-12-03 16:42:04.632 +0900 [INFO] (preview): Loaded plugin embulk-filter-kuromoji (0.2.0)
2015-12-03 16:42:04.693 +0900 [INFO] (preview): Fetch size is 10000. Using server-side prepared statement.
2015-12-03 16:42:05.818 +0900 [INFO] (preview): Fetch size is 10000. Using server-side prepared statement.
2015-12-03 16:42:05.826 +0900 [INFO] (preview): SQL: select title from article limit 10

2015-12-03 16:42:05.829 +0900 [INFO] (preview): > 0.00 seconds
+--------------------------------------------------------------------------------------------------------+
|                                                                              title_surface_form:string |
+--------------------------------------------------------------------------------------------------------+
|                                                   GM###燃料###電池###車###開発###状況###講演###ホンダ###共同###研究###言及 |
|                                                                                コンピュータ###エンターテインメント###先 |
| Linear###Technology###140###V###入力###可能###最大###400###mA###出力###降圧###型###DC###-###DC###コンバーター###IC###発売 |
|                           三菱電機###飽和###電圧###検出###機能###搭載###1200###V###耐圧###パワー###半導体###駆動###用###IC###発売 |
|                                             東芝###SK###Hynix###ナノインプリントリソグラフィ###共同###開発###2017###年###量産 |
|                                         スマ###ホ###連携###小型###FPGA###開発###キット###IoT###向け###マクニカ###量産###出荷 |
|                                    IC###チップ###指紋###IoT###セキュリティ###基盤###三菱電機###遅延###ベース###PUF###技術###発表 |
|                                        ユーザー###操作###アプリ###周辺###アクセサリー###開発###オリンパス###レンズ###交換###型###カメラ |
|                                                              インドネシア###骨太###拠点###スズキ###常務###役員###長尾###氏 |
|                                      インドネシア###タイ###不振###営業###利益###横ばい###スズキ###2014###年度###3###四半期###決算 |
+--------------------------------------------------------------------------------------------------------+

```

* 形態素解析された結果が`###`に区切られて出力されました
* 現状、形態素解析した結果は文字列にdelimiterを挟んでますが、EmbulkにJSON型がサポートされれば配列にして出力する予定です。
  *  [Adding JSON type · Issue #306 · embulk/embulk](https://github.com/embulk/embulk/issues/306)
* methodをsurface_formにすると、形態素解析と正規化だけされます。


## 辞書を適用する場合

上記の場合ですが辞書に網羅されていない日本語が変なところで区切られています

* スマホ
* 燃料電池
* ICチップ

などです。

こういった場合は独自辞書を適用できます。
以下のような辞書を作ってみます。

```csv:kuromoji.txt
ICチップ,ICチップ,アイシーチップ,カスタム名詞
燃料電池,燃料電池,ネンリョウデンチ,カスタム名詞
スマホ,スマホ,スマホ,カスタム名詞
```

```yaml
in:
  type: mysql
  host: localhost
  user: root
  database: hoge
  query: |
    select title from article limit 10
filters:
  - type: kuromoji
    keep_input: false
    dictionary_path: txt/kuromoji.txt
    key_names:
      - title
    settings:
      - {
          suffix: _surface_form, method: 'surface_form', delimiter: '###'
        }
out:
  type: stdout

```

dictionary_pathに辞書のPathを指定します

```
$ embulk preview yml/kuromoji_keitaiso.yml
2015-12-03 17:04:15.141 +0900: Embulk v0.7.7
2015-12-03 17:04:17.389 +0900 [INFO] (preview): Loaded plugin embulk-input-mysql (0.6.0)
2015-12-03 17:04:17.438 +0900 [INFO] (preview): Loaded plugin embulk-filter-kuromoji (0.2.0)
2015-12-03 17:04:17.506 +0900 [INFO] (preview): Fetch size is 10000. Using server-side prepared statement.
2015-12-03 17:04:18.701 +0900 [INFO] (preview): Fetch size is 10000. Using server-side prepared statement.
2015-12-03 17:04:18.709 +0900 [INFO] (preview): SQL: select title from article limit 10

2015-12-03 17:04:18.714 +0900 [INFO] (preview): > 0.00 seconds
+--------------------------------------------------------------------------------------------------------------------------------+
|                                                                                                      title_surface_form:string |
+--------------------------------------------------------------------------------------------------------------------------------+
|                                           GM###が###燃料電池###車###の###開発###状況###について###講演###、###ホンダ###と###の###共同###研究###に###も###言及 |
|                                                                                              コンピュータ###エンターテインメント###が###向かう###先 |
| Linear### ###Technology###、###140###V###入力###が###可能###だ###最大###400###mA###出力###の###降圧###型###DC###-###DC###コンバーター###IC###を###発売 |
|                      三菱電機###、###非###飽和###電圧###検出###機能###を###搭載###する###た###1200###V###耐圧###の###パワー###半導体###駆動###用###IC###を###発売 |
|                                       東芝###と###SK### ###Hynix###が###ナノインプリントリソグラフィ###を###共同###開発###、###2017###年###の###量産###目指す |
|                                          スマホ###と###連携###できる###超###小型###FPGA###開発###キット###、###IoT###向け###に###マクニカ###が###量産###出荷 |
|                  ICチップ###の###「###指紋###」###を###IoT###の###セキュリティ###基盤###に###使う###、###三菱電機###が###遅延###ベース###の###PUF###技術###を###発表 |
|                                            ユーザー###が###操作###アプリ###や###周辺###アクセサリー###を###開発###、###オリンパス###の###レンズ###交換###型###カメラ |
|                                 「###インドネシア###を###もっと###骨太###の###拠点###に###する###て###いく###たい###」###、###スズキ###常務###役員###の###長尾###氏 |
|                                  インドネシア###と###タイ###の###不振###だ###営業###利益###は###横ばい###、###スズキ###の###2014###年度###第###3###四半期###決算 |
+--------------------------------------------------------------------------------------------------------------------------------+

```

## まとめ
* お手軽に形態素解析したいと用途に。
* デフォルト辞書の精度が[neologd/mecab-ipadic-neologd](https://github.com/neologd/mecab-ipadic-neologd)がかなり凄いことがわかったので、辞書はこちらに差し替えるかも。
* もう一つ日本語を正規化する[toyama0919/embulk-filter-icu4j](https://github.com/toyama0919/embulk-filter-icu4j)も作ったのですが、こちらは別の機会に書こうと思います。

## 参考
* [toyama0919/embulk-filter-kuromoji](https://github.com/toyama0919/embulk-filter-kuromoji)
* [kuromoji - japanese morphological analyzer](http://www.atilika.org/)
* [atilika/kuromoji](https://github.com/atilika/kuromoji)
* [Adding JSON type · Issue #306 · embulk/embulk](https://github.com/embulk/embulk/issues/306)