かえるのプログラミングブログ

プログラミングでつまずいたところとその解決策などを書いていきます。

BERT で簡単に日本語の文章の特徴ベクトルを取得できるクラス作った

小ネタです。 表題の通り、日本語の特徴ベクトルを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   味噌汁が好きなワニ
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 となり、概ね文意は取れていそうです。

以上です。お役立ていただけると幸いです。