小ネタです。 表題の通り、日本語の特徴ベクトルを5秒で作れると嬉しいなと思ってまとめてみました。
成果物
https://github.com/osuossu8/Utils/blob/master/text_preprocess/bert_sentence_vectorizer.py
参考にさせていただいたページ
How to use
- サンプルとして以下の文章群について適用していきます。
sample_df = pd.DataFrame(['お腹が痛いので遅れます。', '頭が痛いので遅れます。', 'おはようございます!', 'kaggle が好きなかえる', '味噌汁が好きなワニ' ], columns=['text'])
text 0 お腹が痛いので遅れます。 1 頭が痛いので遅れます。 2 おはようございます! 3 kaggle が好きなかえる 4 味噌汁が好きなワニ
- インスタンスを呼び出して、vectorize メソッドを apply します。
BSV = BertSequenceVectorizer() sample_df['text_feature'] = sample_df['text'].progress_apply(lambda x: BSV.vectorize(x))
text text_feature 0 お腹が痛いので遅れます。 [0.19147679, 0.21517648, -0.6518847, 0.0367899... 1 頭が痛いので遅れます。 [0.41336352, 0.41541082, -0.4540227, 0.0081523... 2 おはようございます! [-0.24529223, -0.32589248, -0.19703643, 0.0058... 3 kaggle が好きなかえる [-0.32583073, 0.18544571, -0.57644206, -0.2880... 4 味噌汁が好きなワニ [-0.06875071, 0.38367623, -0.3311508, -0.57824...
768 次元の特徴量が得られました。
最後に精度確認として cos 類似度をみてみます。
[0 と 1], [3 と 4] はそれぞれ文意が近そうです。
行列演算で一気に計算します。
print(cos_sim_matrix(np.stack(sample_df.text_feature)))
array([[0.99999976, 0.96970403, 0.7450729 , 0.6458974 , 0.6031469 ], [0.96970403, 1.0000002 , 0.7233708 , 0.6374834 , 0.59641033], [0.7450729 , 0.7233708 , 1.0000002 , 0.6782884 , 0.62431043], [0.6458974 , 0.6374834 , 0.67828834, 1.0000001 , 0.8846145 ], [0.603147 , 0.5964103 , 0.62431043, 0.8846146 , 1.0000002 ]], dtype=float32)
- [0 と 1] : 0.96970403 > [3 と 4] : 0.8846145 > [2 と 4] : 0.59641033 となり、概ね文意は取れていそうです。
以上です。お役立ていただけると幸いです。