私はtransformerのイメージをつかめずBERTを理解できませんでした。だけどBERTは使いたい。
BERTを理解できないけど使ってみたいという人は多いと思います。私もその一人で、transformerの理解ができずに諦めました。
bert-as-service
2行で使えるbert-as-service(https://github.com/hanxiao/bert-as-service)
これでニュースのテキストデータをベクトルデータに変換します。
ニュースは例えばこんな感じの記事です。
コマンドはこんな感じ
pip install bert-serving-client
pip install bert-serving-server
wget https://storage.googleapis.com/bert_models/2018_10_18/cased_L-12_H-768_A-12.zip
unzip cased_L-12_H-768_A-12.zip
bert-serving-start -model_dir cased_L-12_H-768_A-12/ -num_worker=1 -max_seq_len=300
これでローカルにbert推論サーバを立てられるのでクライアント側から推論リクエストを送ればいい
↑サーバ ↓クライアント
from bert_serving.client import BertClient
import pandas
import numpy
if __name__ == "__main__":
df = pandas.read_csv("news.csv")
with BertClient(ip="0.0.0.0") as client:
vecs = client.encode(list(df["News"]))
numpy.savetxt("news_vec.csv", vecs, delimiter=",")
実行すると768次元のベクトルに変換できました。366は変換したニュースの数です。
試しに以下の条件でデータにバイナリフラグを作成して主成分分析して2次元データに変換します。
で、Trump_flagの0,1を赤、青で色分けして散布図を作成するとこうなりました。だいたいいい感じ。
全体のフローとしては、テキストデータをbertで768次元のベクトルデータに変換、主成分分析で2次元データに圧縮しました。主成分分析に関しては可視化のために無理やり入れた処理で、768次元の特徴量ベクトルのまま使うほうが使いやすいです。
今回作ったコードはここにあります。
https://github.com/shiibashi/qiita/tree/master/9