文章の平均ベクトルを求める(英語)

Pythonで自然言語処理を行う際に,単語ごとにベクトル化してそれの平均を文章のベクトルとして扱いたい時のメモ

※単語ごとの平均ベクトルを使用する以外にもDoc2Vecなどの使用もいいかもしれない.(学習済みモデルはあまりなかったり,学習のためのデータが集まらなかったりするかもしれないため,今回は単語ごとの平均ベクトルを求める)

行うこと

  • nltkで形態素解析
  • spaCyで単語ごとにベクトル化
  • 文章の平均ベクトルを求める

1. nltkで形態素解析

今回は簡単に考えるため品詞情報は考えない.そのため,nltkのword_tokenizeを使用する

import nltk
sentence = 'I am a cat.'
words = nltk.word_tokenize(sentence)

> ['I', 'am', 'a', 'cat', '.']

これで単語ごとに分ける作業が完了.

2. spaCyで単語ごとにベクトル化

spaCyを使用して単語ごとに数値ベクトルに変換する.今回はspaCyの提供している学習済みモデルを使用している.

import spacy
import numpy as np
nlp = spacy.load('en')
feature_vecs = [nlp(word).vector for word in words]

> [array([ 3.500103  , -2.4935763 , -2.675813  , -3.4373646 , -2.042331  ,
        -2.046733  ,  2.9430969 ,  3.2413645 , -0.28074157, -0.38374954,
         0.48055142, -0.41881254,  0.80175626,  1.346148  , -0.7809333 ,...

3. 文章の平均ベクトルを求める

2で作成した単語ごとのベクトルの平均を求めて文章全体の平均ベクトルを求める.

feature_vec = np.zeros((96,), dtype="float32")
for vec in feature_vecs:
    feature_vec = np.add(feature_vec, vec)

feature_vec = np.divide(feature_vec, 96)

> array([ 0.10911289, -0.04105245, -0.08416332, -0.05892473, -0.0499047 ,
        0.002462  ,  0.1209574 ,  0.03958821,  0.01622647,  0.0801741 ,
       -0.09445589, -0.00737678,  0.06189723, -0.00181926, -0.0798737 ,...