tensorflowとUniversalSentenceEncoderを使って、ニーズ判定AIを作ってみた

## はじめに

こんにちは。てりです。
ある文章が「何かを改善したい」とか「面倒」等、ニーズっぽいかどうかを判定するAI分類もモデルを作ってみました。

## なぜ作ったのか

最近、僕はエンジニアからコンサルタントに転職しました。
そのコンサル業務の中で、いろんな業界の人と話す機会があります。
しかし、転職して間もない僕は、その業界で「困っていること」や「ユーザーが欲していること」をあまり知らず、顧客と深い話ができない状態です。。
なので、今回は色んな業界からニーズっぽいデータを収集するために、ニーズ判定AIを作ってみました！！

## 開発概要

開発については、以下のような感じで行いました。

* 開発環境　 ⇒　google colaboratory
* ベクトル化 ⇒　UniversalSentenceENcoder
* 学習方法 　⇒　深層学習(tensorflow)
* データ　　 ⇒　twitterの文章データ（現在2235件）

UniversalSentenceENcoderについては、[ここ](https://tfhub.dev/google/universal-sentence-encoder-multilingual/3)を参照ください

## コード 

* ライブラリ読み込み

```python

# ドライブマウントやファイル操作のために必要なライブラリ
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from google.colab import drive 
import glob
from google.colab import drive 

drive.mount(r"/content/drive/")

# universal sentence encoderを使うのに必要なやつ
%pip install tensorflow_text
import tensorflow_hub as hub
import tensorflow_text

embed = hub.load("https://tfhub.dev/google/universal-sentence-encoder-multilingual/3")
```


* ファイル読み込み

```python
# 学習データファイルは"/content/drive/My Drive/get_needs/needs_data_add_label/"にある
# 学習データの形式はtweet,needsの2列
file_path_list = glob.glob('/content/drive/My Drive/get_needs/needs_data_add_label/*.csv')
df_learn = pd.DataFrame()
for file_path in file_path_list:
  df = pd.read_csv(file_path)
  df = df.rename(columns={'tweet': 'text'})
  df_learn = pd.concat([df_learn, df], axis=0)

df_learn = df_learn.reset_index()[["text", "needs"]]

# 空白のレコードは、USEのエンコーダーでエラーになる
df_learn = df_learn.dropna()

# tweetで重複を削除。削除するときは、最新をほう残す
df_learn.drop_duplicates(subset='text', keep='last', inplace=True)
df_learn
```
データはこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239022/c92c8c6b-eaea-a38a-86c6-32ebb0457fe1.png)

* 学習データとテストデータを分ける

```python 
tweets = df_learn["text"].values
X = embed(tweets).numpy()
y = df_learn["needs"].values
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=123,  test_size=0.2)
```

* モデル定義と学習

```python
import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Input
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dropout
from tensorflow.keras.callbacks import EarlyStopping
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix

num_classes = 2

# tensorflowの学習の為にラベルデータを変換
# y_train, y_testは将来的にアンサンブルにするために、他の機械学習でも形として残す。
y_train_t = keras.utils.to_categorical(y_train, num_classes)
y_test_t = keras.utils.to_categorical(y_test, num_classes)

# モデルの作成
model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(512, )))
model.add(Dense(512, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))

model.compile(
    loss="binary_crossentropy",
    optimizer="adam",
    metrics=['accuracy']
)

# 学習
early_stopping = EarlyStopping(
                        monitor='val_loss',
                        min_delta=0.0,
                        patience=5,
                )

history = model.fit(X_train, y_train_t,
                    batch_size=1000,
                    epochs=100,
                    verbose=2,
                    validation_data=(X_test, y_test_t),
                    callbacks=[early_stopping],
                    )

```

学習過程はこんな感じでした！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239022/d6720033-2e0b-bc62-c0e3-80a1d76ef03f.png)
図にすると、こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239022/0180c7f0-4cca-a789-1d27-63ddeab8b6f1.png)

おーなんかいい感じに見える。

## 遊んでみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239022/1322e8f5-403a-f818-e8cf-0202c8970af4.png)
まあ、コロナが終わってほしいっていう情報を知ってもコンサル業務に影響なさそうだし、よさげな分類に見えるなー。。運用しながら、見定めていくかー！


## 最後まで読んでいただいて、ありがとうございました！
最後まで読んでいただいて、ありがとうございました！（大事なことなので２回言いました。）
次のステップとして、いろんなサイトの文章をニーズAIに分類させて、DBに格納できるような自動収集システムを作る予定です。
最終的には収集した結果をダッシュボード化したりして、コンサル業務のための情報収集ツールを作っていきたいと思いますー！

##　参考文献
* https://tfhub.dev/google/universal-sentence-encoder-multilingual/3
* https://keras.io/ja/utils/
* https://keras.io/ja/getting-started/sequential-model-guide/
* http://bcl.sci.yamaguchi-u.ac.jp/~jun/notebook/keras/loss/