株式会社スマレジの開発部でスマレジのサーバサイドを作っています

チケットの見える化にチャレンジしてみる(実践編: pythonの辞書をIPA辞書に変更する)

こんにちは!株式会社スマレジ 、開発部のmasaです。

3連休は皆様いかがお過ごしでしょうか?
masaはこのご時世で出歩けないのもあって、個人開発などに勤しんでおりました笑

さて、今回から実践編で実際に今までのソースを組み合わせて、Redmineチケットの簡単な軽量テキスト解析をやっていきます。
そのうち、今回は推奨辞書の切り替えをやっていきます。

## MeCabIPA辞書

準備編で使用した、janomeを使った形態素解析なのですが実はそのまま利用するには問題があるのです。

masa2019.hatenablog.com

というのも、例えば「車」や「飛行機」といった汎用的な名刺はjanomeで正確に分類できるのですが、
「スマレジ 」といった固有名詞については正しく認識してくれないのです。

これはjanome本体ではなく、形態素解析に使用している辞書に固有名詞が載っていないことに原因があります。

そのためこのままjanomeを利用するなら辞書に用語を追加する作業などが発生します。
長く使うのであれば、janomeの辞書をチューニングした方が精度は上がるのですが、登録する用語も多いので、
今回はIPAが利用推奨している辞書に切り替えて、形態素解析をすることを考えます。


### MeCab

janomeで利用する辞書を切り替えることも追々考えるのですが、このIPA辞書との連携については、同じく以前チラッと触れた
MeCabという形態素解析ツールの方が導入が楽ちんです。

ただ、MeCabのライブラリはjanomeのようなフィルタリングの定義をカスタマイズする機能などはないので、
その辺りは一長一短です。

まずは、MeCabの導入から。下記のサイト様の方法そのままです。

qiita.com

まずはbrewで必要なライブラリを追加。

```sh
$ brew install mecab mecab-ipadic git curl xz
```

で、インストールが終わりましたら、gitからmecab用のipa辞書定義をcloneしてビルドします。

```sh
git clone --depth 1 git@github.com:neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n
```

これで準備はOK。

### 動かしてみる

ざっくりサンプルソース。(名詞を抜いてくる)
「名詞:でひっかけるのちょっと面倒くさいなと思ったら便利なパースの例がありました。

note.com


```python
import MeCab

sample_txt = 'スマレジ は高機能レジだ。'
m = MeCab.Tagger('-Ochasen -d ' + '/usr/local/lib/mecab/dic/mecab-ipadic-neologd')

nouns = [line for line in m.parse(sample_txt).splitlines()
if "名詞" in line.split()[-1]]

for str in nouns:
print(str.split())
```
`/usr/local/lib/mecab/dic/mecab-ipadic-neologd'`はmecabの辞書が置かれているパスです。
また、`-Ochasen`とすることで表示形式を、下記のような形にすることができます。(この時点でこれはstring型)

```
スマレジ スマレジ スマレジ 名詞-固有名詞-組織
は ハ は 助詞-係助詞
高 コウ 高 接頭詞-名詞接続
機能 キノウ 機能 名詞-サ変接続
レジ レジ レジ 名詞-一般
だ ダ だ 助動詞 特殊・ダ 基本形
。 。 。 記号-句点
```

これを`.splitlines()`で行ごとにループを回して、名詞が含まれる行の先頭三つを撮ってくるという感じです。

ちなみに辞書を切り替えないと、

```
スマ 名詞,普通名詞,一般,,,,スマ,すま,スマ,スマ,スマ,スマ,和,"","","","","","",体,スマ,スマ,スマ,スマ,"4,0","C4","",71373981340541440,259657
レジ 名詞,普通名詞,一般,,,,レジ,レジ-register,レジ,レジ,レジ,レジ,外,"","","","","","",体,レジ,レジ,レジ,レジ,"1","C3","",33253088538272256,120974
は 助詞,係助詞,,,,,ハ,は,は,ワ,は,ワ,和,"","","","","","",係助,ハ,ハ,ハ,ハ,"","動詞%F2@0,名詞%F1,形容詞%F2@-1","",8059703733133824,29321
高 接頭辞,,,,,,コウ,高,高,コー,高,コー,漢,"","","","","","",接頭,コウ,コウ,コウ,コウ,"","P2","",3261434989519360,11865
機能 名詞,普通名詞,サ変可能,,,,キノウ,機能,機能,キノー,機能,キノー,漢,"","","","","","",体,キノウ,キノウ,キノウ,キノウ,"1","C1","",2407664210551296,8759
POS 名詞,普通名詞,一般,,,,ポス,POS,POS,ポス,POS,ポス,記号,"","","","","","",体,ポス,ポス,ポス,ポス,"1","C3","",25583994934534656,93074
レジ 名詞,普通名詞,一般,,,,レジ,レジ-register,レジ,レジ,レジ,レジ,外,"","","","","","",体,レジ,レジ,レジ,レジ,"1","C3","",33253088538272256,120974
だ 助動詞,,,,助動詞-ダ,終止形-一般,ダ,だ,だ,ダ,だ,ダ,和,"","","","","","",助動,ダ,ダ,ダ,ダ,"","名詞%F1","",6299110739157675,22916
。 補助記号,句点,,,,,,。,。,,。,,記号,"","","","","","",補助,,,,,"","","",6880571302400,25
```
というようにスマとレジで別れてしまいます。
(なおこれは-OChasenを指定しない場合です。MeCabコマンドラインで動かすとこんな感じの出力になります)

これである程度の固有名詞にも対応できるようになりました。


[5月追記]
以後は、2,3節で説明したコサイン類似度やBM25などのスコア値を、D3.jsに渡して見える化をしていく作業になります。
ただ、量のあるredmineのデータを用意するのがちょっと難しく、このシリーズは一旦ここまでとさせてください。