はじめに
こんにちは。てりです。
ある文章が「何かを改善したい」とか「面倒」等、ニーズっぽいかどうかを判定するAI分類もモデルを作ってみました。
なぜ作ったのか
最近、僕はエンジニアからコンサルタントに転職しました。
そのコンサル業務の中で、いろんな業界の人と話す機会があります。
しかし、転職して間もない僕は、その業界で「困っていること」や「ユーザーが欲していること」をあまり知らず、顧客と深い話ができない状態です。。
なので、今回は色んな業界からニーズっぽいデータを収集するために、ニーズ判定AIを作ってみました!!
開発概要
開発については、以下のような感じで行いました。
- 開発環境 ⇒ google colaboratory
- ベクトル化 ⇒ UniversalSentenceENcoder
- 学習方法 ⇒ 深層学習(tensorflow)
- データ ⇒ twitterの文章データ(現在2235件)
UniversalSentenceENcoderについては、ここを参照ください
コード
- ライブラリ読み込み
# ドライブマウントやファイル操作のために必要なライブラリ
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")
- ファイル読み込み
# 学習データファイルは"/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
- 学習データとテストデータを分ける
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)
- モデル定義と学習
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],
)
おーなんかいい感じに見える。
遊んでみる
まあ、コロナが終わってほしいっていう情報を知ってもコンサル業務に影響なさそうだし、よさげな分類に見えるなー。。運用しながら、見定めていくかー!
最後まで読んでいただいて、ありがとうございました!
最後まで読んでいただいて、ありがとうございました!(大事なことなので2回言いました。)
次のステップとして、いろんなサイトの文章をニーズAIに分類させて、DBに格納できるような自動収集システムを作る予定です。
最終的には収集した結果をダッシュボード化したりして、コンサル業務のための情報収集ツールを作っていきたいと思いますー!