sklearnのTfidfVectorizerについて

投稿者: Anonymous

sklearnでKMeansを利用しようと考えています。
https://github.com/luispedro/BuildingMachineLearningSystemsWithPython/blob/master/ch03/rel_post_20news.py
上記のサンプルを参考にしています。
上記サンプルのL58TfidfVectorizer.fit_transform()で学習データをベクトル化し、L91で新しいクラスタリング対象のデータをTfidfVectorizer.transform()でベクトル化しています。

これは、必ずfit_transform()を呼び出してからtransform()を呼びださなければならないのでしょうか。
もしそうなら、fit_transform()した状態を保存しておき新しい対象に対してはfit_transform()を省略することはできるでしょうか。

解決

学習データのベクトル化と、新しいデータのベクトル化は独立した操作なので、必ずしもfit_transform()を呼び出してからtransform()を呼びなさないといけないわけではありません。fit_transform()で作られたベクトルをディスクに保存しておけば、後からロードすることができます。

vectorizedの型はscipy.sparse.csr.csr_matrixなので.toarray()でnumpyの形式に変換してから保存すればいいと思います。復元はその逆の操作になります。

import numpy
import scipy.sparse.csr

# vectorizedはgithubの例にあるようにvectorizer.fit_transform(...)で得られたもの

# 保存
numpy.save('my_vector', vectorized.toarray())

# 復元 なぜかファイル名は拡張子をつけないとロードできない
vectorized2 = scipy.sparse.csr.csr_matrix(numpy.load('my_vector.npy'))

# 値の同一性の確認
print (vectorized.toarray() == vectorized2.toarray()).all()
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *