Janomeを使った日本語の分析処理 part1


この記事は[CloudAnalytics](http://qiita.com/advent-calendar/2016/analytics) Advent Calendarの7日目です。

ここでは[3日目](http://qiita.com/y_t_p/items/ea2fbb60677b11b44399)に準備したCloudantのデータを利用して、Data Science Experience上のNotebookを利用し、SparkのRDDの扱いと記事タイトルに含まれる日本語文をJanomeを利用して簡単な集計処理を扱います。※記事が長くなってしまったので分割します・・・

Node-REDとCloudantの準備と今回利用するデータは[3日目の記事](http://qiita.com/y_t_p/items/ea2fbb60677b11b44399)を参考にしてください。
また、今回のNotebookの環境はDataScienceExperienceを利用しています。
DSXの詳細は[1日目の記事](http://qiita.com/y_t_p/items/1781dc5b6fc6eb470582)を参照ください。

##Cloudantの接続の準備
下記の図のadd data assetsから用意したCloudantへの接続を作成します。

![スクリーンショット 2016-12-12 10.54.18.png](https://qiita-image-store.s3.amazonaws.com/0/31585/41e2f8d4-5f19-0376-ec08-e39f022fceae.png "スクリーンショット 2016-12-12 10.54.18.png")

右側のパネルが開いたらConnectionsのタブを選択し、
Create Connectionから新しい接続を作成します。
![スクリーンショット 2016-12-12 10.58.54.png](https://qiita-image-store.s3.amazonaws.com/0/31585/05b92837-bfea-3d62-1fba-f235f7f61943.png "スクリーンショット 2016-12-12 10.58.54.png")

Create Connectionの画面を開いて必要な項目を設定していきます。
* Name：何かわかりやすい名前をつけます。
* Description：この接続の説明
* Service Category：Bluemix上のデータサービス又はその他の外部サービス。今回はData Serviceを選択します。
* Service Instance：Service Categoryに応じた内容がDropBoxで選択可能です。Bluemix上のCloudantを利用する場合は自動で列挙されます。
* Select：Service Instanceに応じて項目が変化しますが、Cloudantを利用する場合はService Instanceで選択したCloudantのDataBaseが列挙されます。ここでは作成してあるrssのDatabaseを選択しています。

各項目の設定1
![スクリーンショット 2016-12-12 11.02.19.png](https://qiita-image-store.s3.amazonaws.com/0/31585/39906452-bd3e-4636-3faa-e3dbfcaf639a.png "スクリーンショット 2016-12-12 11.02.19.png")

各項目の設定2
![スクリーンショット 2016-12-12 11.05.19.png](https://qiita-image-store.s3.amazonaws.com/0/31585/7e2d7c59-eb93-e974-c360-c5db0309b50b.png "スクリーンショット 2016-12-12 11.05.19.png")

Createボタンを押せば下記のようにCloudantのrssデータベースへの接続が作成されます。

![スクリーンショット 2016-12-12 11.08.11.png](https://qiita-image-store.s3.amazonaws.com/0/31585/fbbdfb5e-1bbd-afb1-047b-de276bfb5e42.png "スクリーンショット 2016-12-12 11.08.11.png")

以上でCloudantの準備が完了しました。とっても簡単ですね。

##Notebookの作成
次に分析を行うため、新しいNotebookを作成します。
プロジェクトの画面からadd notebooksを選択し、新しいNotebookを追加します。
![スクリーンショット 2016-12-12 11.12.16.png](https://qiita-image-store.s3.amazonaws.com/0/31585/4beabb81-27f5-bd4d-63a6-0f1a608afcae.png "スクリーンショット 2016-12-12 11.12.16.png")

[1日目](http://qiita.com/y_t_p/items/1781dc5b6fc6eb470582)に説明した内容と重複しますが、簡単に。
* Name：ノートブックの名称（現在日本語名での作成は避けた方が無難）
* Description：ノートブックの説明
* Language：今回はPython3.5を利用します。
* Spark version：SparkのVersionです。2.0を利用します。
* Spark Service：利用するSparkServiceの選択です。

![スクリーンショット 2016-12-12 11.17.23.png](https://qiita-image-store.s3.amazonaws.com/0/31585/d56da96d-9387-6215-2a6e-ff3e81c3f8fb.png "スクリーンショット 2016-12-12 11.17.23.png")

LanguageではPythonの2系も選択可能ですが、
今回は日本語の取り扱いを行う為、操作が簡単な3.5を選択しています。

Data Science Experienceについては[1日目の記事](http://qiita.com/y_t_p/items/1781dc5b6fc6eb470582)を参考にしてください。

##Janomeの準備
作成を行うと自動的にNotebookが開かれます。
日本語の形態素解析を行うために、Pythonで利用可能な形態素解析器のJanomeのインストールを行います。
>[JanomeのHP](http://mocobeta.github.io/janome/)

Data Science Experience上ではpipを使った操作が可能です。
最初のセルに下記コードを入力し、実行しましょう

```python
!pip install janome
```
>コードの実行などJupyterの基本的な使い方は1日目の記事を参照してください。

実行するとJanomeがインストールされます。
![スクリーンショット 2016-12-12 11.27.57.png](https://qiita-image-store.s3.amazonaws.com/0/31585/db7a8031-ad94-89a8-4576-0616e4a88bb4.png "スクリーンショット 2016-12-12 11.27.57.png")

Janomeのインストールが終わった後、正常にJanomeが使えるか、簡単なテストをおこなってみます。
新しいセルに書きコードを入力し、実行しましょう。

```python
from janome.tokenizer import Tokenizer
t = Tokenizer()
tokens = t.tokenize("すもももももももものうち")
for token in tokens:
    print(token)
```
>コピペする際はインデントに注意してください。
正常に形態素解析された結果が出力されればOKです。
![スクリーンショット 2016-12-12 11.32.43.png](https://qiita-image-store.s3.amazonaws.com/0/31585/9d59ad4d-3edf-2999-4e20-98204d6fcd4c.png "スクリーンショット 2016-12-12 11.32.43.png")

##Cloudantの接続コード
Janomeの準備ができたら、Cloudantからデータを取得するコードを書いていきます。
まずはCloudantの認証データをセルに埋めます。
先ほど登録したCloudantの情報を呼び出します。
右上のfind and add dataのメニューを開き、
Connectionsから先ほど登録したnews_rssを探します。
![スクリーンショット 2016-12-12 11.36.16.png](https://qiita-image-store.s3.amazonaws.com/0/31585/356b31bd-0a26-4ff4-0f12-fc17dcc01042.png "スクリーンショット 2016-12-12 11.36.16.png")

新しいセルを選択した状態でinsert to codeを押すと、セルに必要な情報が自動的に記述されます。
![スクリーンショット 2016-12-12 11.48.50.png](https://qiita-image-store.s3.amazonaws.com/0/31585/76645340-393d-4de4-9c70-7adc40d93506.png "スクリーンショット 2016-12-12 11.48.50.png")

入力されたセルを実行して、credentials_1の変数を利用可能にします。
次にSparkSQLを利用してDataFrameの作成を行います。
新しいセルに下記のコードを入力し、実行します。

```python
from pyspark.sql import SQLContext
#SQLContext
sqlContext = SQLContext(sc)
#load rss from cloudant
rss = sqlContext.read.format("com.cloudant.spark").\
option("cloudant.host",credentials_1["host"]).\
option("cloudant.username", credentials_1["username"]).\
option("cloudant.password",credentials_1["password"]).\
load("rss")
``` 

sqlContextにCloudantのフォーマットを指定し、先ほどのcredentials情報からhost名、接続ユーザー、パスワードを指定し、rssテーブルからデータをロードしています。

>ここでAnother instance of Derby may have already booted the database・・・の例外が発生する場合、notebookのkernelのリスタートを行い再度最初のセルからコードを実行し直してください。内部でapache Derbyが利用されているようですが、connectionのハンドリングがうまくいかないケースがある模様・・・

以下のコードを実行し、ロードしたデータのスキーマを確認します。

```python
rss.printSchema()
```

![スクリーンショット 2016-12-12 12.01.28.png](https://qiita-image-store.s3.amazonaws.com/0/31585/4a7cf5f7-348c-6073-3a2b-97127b8d278d.png "スクリーンショット 2016-12-12 12.01.28.png")

最後にデータの中身を確認してみます。
以下のコードを実行し、データを表示させます。

```python
rss.show()
```

![スクリーンショット 2016-12-12 12.10.46.png](https://qiita-image-store.s3.amazonaws.com/0/31585/99cccd34-5321-fff8-59c0-df3903d95a5a.png "スクリーンショット 2016-12-12 12.10.46.png")

以上でpart1は終了です。part2からPySparkとJanomeを利用して日本語を操作していきます。