2016-09-11 12 views
1

私は2つのCSVファイルを持っています - 列車とテスト、それぞれ18000件のレビュー。列車ファイルを使用して、特徴抽出を行い、列車ファイル内の各レビューとテストファイル内の各レビューとの間の類似性メトリックを計算する必要があります。TfidfVectorizerからコサイン類似度を計算するにはどうすればよいですか?

列車の単語とテストセットに基づいてボキャブラリを生成しました。私はストップワードを削除しましたが、タイプミスとステムは削除しませんでした。

私が直面している問題は、TfIdfVectorizerの出力を使用して電車とテストデータのコサイン類似度を生成する方法がわかりません。

vect = TfidfVectorizer(sublinear_tf=True, min_df=0.5,  vocabulary=vocabulary) 
X = vect.fit_transform(train_list) 
vocab = vect.get_feature_names() 
# train_matrix = X.todense() 
train_idf = vect.idf_ 
print vocab 
print X.todense() 

私はX.todense()から取得した出力は、私は単純にXを印刷する場合、それが見えます

[[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.] 
..., 
[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.]] 

です:

この

vocabularyに私の列車のデータをフィットするコードスニペットですこのように:

(0, 28137) 0.114440020953 
(0, 27547) 0.238913278498 
(0, 26519) 0.14777362826 
(0, 26297) 0.247716207254 
(0, 26118) 0.178776605168 
(0, 26032) 0.15139993147 
(0, 25771) 0.10334152493 
(0, 25559) 0.157584788446 
(0, 25542) 0.0909693864147 
(0, 25538) 0.179738937276 
(0, 21762) 0.112899547719 
(0, 21471) 0.159940534946 
(0, 21001) 0.0931693893501 
(0, 13960) 0.134069984961 
(0, 12535) 0.198190713402 
(0, 11918) 0.142570540903 
: : 
(18505, 18173) 0.237810781785 
(18505, 17418) 0.233931974117 
(18505, 17412) 0.129587180209 
(18505, 17017) 0.130917070234 
(18505, 17014) 0.137794139419 
(18505, 15943) 0.130040669343 
(18505, 15837) 0.0790013472346 
(18505, 11865) 0.158061557865 
(18505, 10896) 0.0708161593204 
(18505, 10698) 0.0846731116968 
(18505, 10516) 0.116681527108 
(18505, 8668) 0.122364898181 
(18505, 7956) 0.174450779875 
(18505, 1111) 0.191477939381 
(18505, 73) 0.257945257626 

X.todense()またはXを出力する方法を知りません。テストセットと列車セットの間のコサイン距離を見つける方法を確かめていないかもしれません(ペアワイズ類似度を使用していますか? ? - http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.pairwise_distances.html

編集:

私は私のテストデータに対して同じ手順を繰り返しました。 私はタイプscipy.sparse.csr.csr_matrixの2つの疎行列のXとYを持っていますが、それらは疎でありタイプが(doc, term) tf-idfなので、直接乗算によってXとYの間のコサイン類似度を直接得ることはできません。

todense()でXとYを変換すると、私にはMemoryErrorが返されます。つまり、非効率です。

次に何をすればよいですか?

18000 * 18000のペアワイズコサイン類似度を持つ行列を取得する必要がありますが、その方法はわかりません。

これは宿題のためのものであり、この段階ではSklearnのドキュメントが私を助けてくれません。

答えて

1

あなたはほとんどそこにいます。 vect.fit_transformを使用すると、document-term matrix.のスパース表現が返されます。これは、トレーニングセットのドキュメント用語マトリックス表現です。その後、同じモデルでテストセットを変換する必要があります。ヒント:test_listtransformメソッドを使用してください。 metric='euclidean'が渡されると、sklearn.metrics.pairwise.pairwise_distances(X, Y)XYのスパース行列をとります(つまり、必要な指標)。あなたがここからやる必要があるのはかなり簡単なはずです。

+0

ヒントありがとうございます。私はほとんど終わったと思う - pairwise_distancesは処理が重く、私のシステムはそれを処理できない。 – boltthrower

+0

pairwise_distances(X、Y)は私にMemoryErrorを与えます。 'File" /home/bt/amzreview/local/lib/python2.7/site-packages/scipy/sparse/base.py "、1009行目、_process_toarray_args return np.zeros(self.shape、dtype = self。 dtype、order = order) ' – boltthrower

関連する問題