Pythonで自然言語処理を行う際に,単語ごとにベクトル化してそれの平均を文章のベクトルとして扱いたい時のメモ
※単語ごとの平均ベクトルを使用する以外にもDoc2Vecなどの使用もいいかもしれない.(学習済みモデルはあまりなかったり,学習のためのデータが集まらなかったりするかもしれないため,今回は単語ごとの平均ベクトルを求める)
行うこと
今回は簡単に考えるため品詞情報は考えない.そのため,nltkのword_tokenizeを使用する
import nltk sentence = 'I am a cat.' words = nltk.word_tokenize(sentence) >>> ['I', 'am', 'a', 'cat', '.']
これで単語ごとに分ける作業が完了.
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 ,...
2で作成した単語ごとのベクトルの平均を求めて文章全体の平均ベクトルを求める.
feature_vec = np.zeros((96,), dtype="float32") cnt = 0 for vec in feature_vecs: feature_vec = np.add(feature_vec, vec) cnt += 1 feature_vec = np.divide(feature_vec, cnt) >>> 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 ,...