Icon
szk

Webエンジニア
最近はWeb系の開発をしている.

Prog24_jp

Prog24

Prog24

prog24

Blog

自然言語処理
Python
Word2vec

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") 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 ,...
SNSでシェア