Splunk で MeCab を使った形態素解析をする



[前回の記事](https://qiita.com/maroon/items/29eaf74f4495ecd619c5)で、正規表現を使った形態素解析モドキを紹介しましたが、今回はきちんとした MeCabを使った形態素解析ができるように、カスタムコマンドを作って Splunkに実装したいと思います。

## MeCab とは
MeCabはオープンソースの形態素解析エンジンで、奈良先端科学技術大学院大学出身、現GoogleソフトウェアエンジニアでGoogle 日本語入力開発者の一人である工藤拓によって開発されている。 -- wikipedia より --

このBlogなどが仕組みなど詳しく書いてあってわかりやすかったですが、日本語環境における形態素解析としては非常に有名な形態素解析エンジンです。
https://techlife.cookpad.com/entry/2016/05/11/170000


## Splunk にどうやって実装する？
デフォルトではSplunkには、MeCab の解析エンジンは入っていないので、個別にインストールする必要があります。また pythonから実行できるようにして、カスタムコマンドとしてスプランクに実装する必要があります。
これらの作業が面倒であれば、Splunkに取り込む前に、MeCabを実行して、その結果を取り込むようにするなどが必要ですが、今回は頑張って実装したいと思います。


## 実装のおおまかな流れ
1. MeCabインストール on Splunk 
2. Splunk のカスタムコマンドとして実装する
3. SPLで実行してみる

## 1. MeCab インストール

参考サイト
https://qiita.com/osyou-create/items/c7864a5200238d8678aa

```
## Groonga レポジトリの追加
$ sudo rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
$ sudo yum makecache

## MeCab や辞書のインストール
$ sudo yum -y install mecab mecab-ipadic
$ sudo yum -y install mecab-devel

## python の Mecab パッケージをインストール
$ pip install mecab-python3
```

インストールが無事に行ったら、まずはコンソール上で MeCabを試してみます。
以下のようなサンプルコードを pythonで実行してみます。

```:mecab-sample.py
# -*- coding: utf-8 -*-
import sys
import MeCab

# 今回は、 wakati を使っております。品詞などは表示されませんが、あとで加工しやすいように表示されます。
m = MeCab.Tagger("-Owakati")  
print m.parse("こんにちは皆さん。今日はいい天気ですね")
```

```:実行確認
$ python mecab-sample.py
こんにちは 皆さん 。 今日 は いい 天気 です ね

## わかりずらいかもしれませんが、単語ごとに分解されて、スペースで区切られております。
```

これで pythonでも実行できるようになりました。





## 2. Splunk のカスタムコマンドとして実装する

### 2.1 Splunk SDK for Pythonをインストール
http://dev.splunk.com/view/python-sdk/SP-CAAAEDG


### 2.2 カスタムコマンドの作成

作成にあたりこちらを参考にさせてもらいました。

カスタムサーチコマンドの作り方（Splunk）
https://qiita.com/myogada/items/c5a2985882c4b3f30e31

Splunkの実行結果をPythonを使って処理、ファイルに保存する
https://qiita.com/myogada/items/476139acad9293e9eecb


```:mecab.py
# -*- coding: utf-8 -*-
import splunk.Intersplunk
import sys
import MeCab

results, dummyresults, settings = splunk.Intersplunk.getOrganizedResults()
m = MeCab.Tagger("-Owakati")

for result in results:
    word = m.parse(result['text'])
    result['mecab'] = word

splunk.Intersplunk.outputResults(results)
```


このコマンドの前に実行した結果が、splunk.Intersplunk.getOrganizedResults()　関数で取り込むことができます。その際データフォーマットは辞書形式[{'text':'Alert dayo'}] なので注意してください。
最後に、splunk.Intersplunk.outputResults(results)　で、出力結果を SPLに戻します。

作成したコマンドを /opt/splunk/etc/apps/search/bin/ に配置し、 /opt/splunk/etc/apps/search/local/commands.conf, authorize.conf などを編集します。

```:commands.conf
[mecab]
filename = mecab.py
```

```:authorize.conf
[capability::run_script_mecab]

[role_admin]
run_script_mecab = enabled
```


## 3. SPLで実行してみる

さて、これでやっとSplunk から Mecabを使った解析エンジンを実行できます。
早速試してみましょう。

```
source=slack* 
| table text
| run mecab
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/79e96a64-b0ed-94ff-12c3-2c525f9cab4b.png)



次に単語毎に出現回数をカウントしてみます。

```
source=slack* 
| table text
| run mecab
| makemv mecab    # スペース区切りをベースにマルチバリューに変換
| mvexpand mecab   # マルチバリューをイベント単位に変換
| stats count by mecab   # 単語ごとにカウントを計算
| where len(mecab) > 1    #あまり意味のない単語を省くため一文字のものを削除
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/d10d11b6-5185-05a2-4d3f-4a27da88c29c.png)

ワードクラウドグラフを使って可視化
https://splunkbase.splunk.com/app/3212/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/1ccbaecd-2da7-6cf2-cc7f-fe71b3b13273.png)



## まとめ

今回は日本語形態素解析として有名な MeCabを使って分解してみました。
別のオプションを使ったりしたらもっと精度を高められたと思いますが、今回のデータでは結果的には正規表現で実施した前回のものとあまり変わらなかったです。でもSplunk上で MeCab を使えるようになったので少しは解析しやすくなった(?)かも。