# TensorFlowによる感情分析

Treasure ワークフローは、TensorFlowを使用した感情分析のためのPythonカスタムスクリプトを活用し、そのモデルをAmazon S3にエクスポートする簡単な方法を提供します。機械学習アルゴリズムは、Pythonカスタムスクリプトを使用して、スケジュールされたワークフローの一部として実行できます。この記事では、Treasure ワークフロー内で機械学習アルゴリズムの感情分析を実行する手順を紹介します。

感情分析は、[TensorFlow](https://www.tensorflow.org/)と[TensorFlow Hub](https://tfhub.dev/)を使用して、映画レビューのテキストをポジティブ/ネガティブに分類します。[公式ドキュメント](https://www.tensorflow.org/hub/tutorials/text_classification_with_tf_hub)を参照してください。

## Pythonカスタムスクリプトを使用した感情分析

この記事では、アルゴリズムの2つのバージョンについて説明します：

* Amazon S3を使用したTensorFlowのワークフロー例
* Amazon S3を使用しないTensorFlowのワークフロー例


### Amazon S3を使用したTensorFlowのワークフロー例

このワークフローは：

* Treasure Dataからレビューデータを取得
* TensorFlowでモデルを構築
* モデルをS3に保存
* 未知のレビューデータの極性を予測し、Treasure Dataに書き戻す


#### 前提条件

* Treasure アカウントでカスタムスクリプト機能が有効になっていることを確認してください。
* TD ToolbeltとTD Toolbelt Workflowモジュールをダウンロードしてインストールしてください。
* Treasure ワークフロー構文の基本知識
* AWS S3
* S3シークレット


ワークフロー例の実行

1. この[リポジトリ](https://github.com/treasure-data/treasure-boxes/tree/master/machine-learning-box/sentiment-analysis)からsentimental-analysisプロジェクトをダウンロードします。
2. ターミナルウィンドウで、sentimental-analysisにディレクトリを変更します。
3. _data.sh_を実行して、Treasure Dataにトレーニングデータとテストデータを取り込みます。モデルを構築するために約8000万件のレコードが取得されます。スクリプトは、データを保存するために_sentiment_という名前のデータベースと、_movie_review_train_および_movie_review_test_という名前のテーブルも作成します。例：


```bash
$ ./data.sh
```

入力テーブルが以下のようになっていると仮定します：

| rowid | sentence | sentiment | polarity |
|  --- | --- | --- | --- |
| 1-10531 | "Bela Lugosi revels in his role as European horticulturist (sic) Dr. Lorenz in this outlandish... | 2 | 0 |
| 1-10960 | Fragmentaric movie about a couple of people in Austria during a heatwave. This kind of... | 3 | 0 |
| 1-24370 | I viewed the movie together with my arrogant, film critic friend, my wife and her female friend. So... | 7 | 1 |


1. 以下のようにワークフロー例を実行します：


```bash
td workflow push sentiment
```

1. STDINから以下のようにシークレットを設定します：


```bash
apikey=x/xxxxx, endpoint=https://api.treasuredata.com, s3_bucket=my_bucket, or
aws_access_key_id=AAAAAAAAAA, aws_secret_access_key=XXXXXXXXX
```

```bash
td workflow secrets \
--project sentiment \
--set apikey \
--set endpoint \
--set s3_bucket \
--set aws_access_key_id \
--set aws_secret_access_key

# Set secrets from STDIN like:
apikey=x/xxxxx, endpoint=https://api.treasuredata.com, s3_bucket=my_bucket,aws_access_key_id=AAAAAAAAAA, aws_secret_access_key=XXXXXXXXX
```

1. 分析を開始します：


```bash
td workflow start sentiment sentiment-analysis  --session now
```

スクリプトの結果は、Treasure Dataの_test_predicted_polarities_テーブルに保存されます。

テーブルを表示するには：

1. Treasure コンソールにログインします。
2. sentimentsデータベースを検索します。
3. _test_predicted_polarities_テーブルを見つけます。
4. 予測結果は以下のようにこのテーブルに保存されます：


| rowid | predicted_polarity |
|  --- | --- |
| 1-21643 | 0 |
| 1-22967 | 1 |


### Amazon S3を使用しないTensorFlowのワークフロー例

このワークフローは：

* Treasure Dataからレビューデータを取得
* TensorFlowでモデルを構築
* 未知のレビューデータの極性を予測し、データをTreasure Dataに書き戻す


#### 前提条件

* Treasure アカウントでこの機能が有効になっていることを確認してください。
* TD ToolbeltとTD Toolbelt Workflowモジュールをダウンロードしてインストールしてください。
* Treasure ワークフロー構文の基本知識


ワークフロー例の実行

1. この[リポジトリ](https://github.com/treasure-data/treasure-boxes/tree/master/machine-learning-box/sentiment-analysis)からsentimental-analysisプロジェクトをダウンロードします。
2. コマンドラインターミナルウィンドウから、sentimental-analysisにディレクトリを変更します。例：


```bash
cd sentiment-analysis
```

1. _data.sh_を実行して、Treasure Dataにトレーニングデータとテストデータを取り込みます。モデルを構築するために約8000万件のレコードが取得され、スクリプトはデータを保存するために_sentiment_という名前のデータベースと、_movie_review_train_および_movie_review_test_という名前のテーブルも作成します。


```bash
$ ./data.sh
```

入力テーブルが以下のようになっていると仮定します：

| rowid | sentence | sentiment | polarity |
|  --- | --- | --- | --- |
| 1-10531 | "Bela Lugosi revels in his role as European horticulturist (sic) Dr. Lorenz in this outlandish... | 2 | 0 |
| 1-10960 | Fragmentaric movie about a couple of people in Austria during a heatwave. This kind of... | 3 | 0 |
| 1-24370 | I viewed the movie together with my arrogant, film critic friend, my wife and her female friend. So... | 7 | 1 |


1. 以下のようにワークフロー例を実行します：


```bash
td workflow push sentiment
```

1. STDINからシークレットを追加します：apikey=x/xxxxx, endpoint=https://api.treasuredata.com


```bash
td workflow secrets \
  --project sentiment \
  --set apikey \
  --set endpoint
```

1. 分析を開始します


```bash
td workflow start sentiment sentiment-analysis-simple --session now
```

スクリプトの結果は、Treasure Dataの_test_predicted_polarities_テーブルに保存されます。

テーブルを表示するには：

1. Treasure コンソールにログインします。
2. _sentiments_データベースを検索します。
3. _test_predicted_polarities_テーブルを見つけます。


予測結果は以下のようになるはずです：

| rowid | predicted_polarity |
|  --- | --- |
| 1-21643 | 0 |
| 1-22967 | 1 |


## ワークフローカスタムPythonスクリプトの確認

sentimental-analysisディレクトリの内容を確認します：

* [sentiment-analysis.dig](https://github.com/treasure-data/workflow-examples/blob/master/machine-learning/sentiment-analysis/sentiment-analysis.dig) - これはTensorFlowを使用した感情分析用のTreasure ワークフロー YAMLファイルです。
* [sentiment.py](https://github.com/treasure-data/workflow-examples/blob/master/machine-learning/sentiment-analysis/sentiment.py) - これはTensorFlowを使用したカスタムPythonスクリプトです。既存のデータで予測モデルを構築し、未知のデータに対して極性を予測します。


この例では、英語テキストの単語埋め込みに[TensorFlowHubの事前学習済みモデル](https://tfhub.dev/google/nnlm-en-dim128/1)を使用しています。

```python
embedded_text_feature_column = hub.text_embedding_column(
  key="sentence",
module_spec="https://tfhub.dev/google/nnlm-en-dim128/1"
)
```

このモデルを別のモデル、例えば[日本語モデル](https://tfhub.dev/google/nnlm-ja-dim128/1)に変更する場合は、以下のように修正できます：

```python
embedded_text_feature_column = hub.text_embedding_column(
  key="sentence",
  module_spec="https://tfhub.dev/google/nnlm-ja-dim128/1"
)
```

単語埋め込みの前に、日本語用のトークン化された文を準備する必要があります。

このカスタムスクリプトは、映画レビューで学習したTensorFlowモデルをAmazon S3に保存するため、[TensorFlow Serving](https://www.tensorflow.org/serving/)を使用して予測サーバーを構築できます。

_serving_input_receiver_fn_を変更するには、以下のコードを修正します：

```python
feature_spec = tf.feature_column.make_parse_example_spec([embedded_text_feature_column])
serving_input_receiver_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)
estimator.export_saved_model(EXPORT_DIR_BASE, serving_input_receiver_fn)
```

詳細については、[TensorFlowドキュメント](https://www.tensorflow.org/guide/saved_model#using_savedmodel_with_estimators)を参照してください。