2017-09-26 9 views
0

次のコードを使用して~20,000,000個のドキュメントにtf-idfモデルを生成しました。私はメモリ使用量が吹くまでlinear_kernel使用して類似性スコアを計算しようとすると、問題がある: Tfidf行列と予測ベクトルの類似度を計算するとメモリオーバーフローが発生する

from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.metrics.pairwise import linear_kernel 

train_file = "docs.txt" 
train_docs = DocReader(train_file) #DocReader is a generator for individual documents 

vectorizer = TfidfVectorizer(stop_words='english',max_df=0.2,min_df=5) 
X = vectorizer.fit_transform(train_docs) 

#predicting a new vector, this works well when I check the predictions 
indoc = "This is an example of a new doc to be predicted" 
invec = vectorizer.transform([indoc]) 

#This is where the memory blows up 
similarities = linear_kernel(invec, X).flatten() 

は20ミルに1行-CSRの比較を行って、多くのメモリを取るべきではありません。このように思えます-row-CSRは、1x20milのndarrayを出力する必要があります。

Justy FYI:XはCSRマトリックス〜12 GBのメモリです(コンピュータには16個しかありません)。私はこれを置き換えるためにgensimを調べてみましたが、私は素晴らしい例を見つけることができません。

私が紛失しているものについて考えてみませんか?

答えて

0

バッチ処理が可能です。ここではコードスニペットに基づいた例を示しますが、データセットをsklearnのものに置き換えてください。この小さなデータセットについては、結果が同等であることを示すために元の方法で計算します。おそらくより大きなバッチサイズを使用することができます。

import numpy as np 
from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.metrics.pairwise import linear_kernel 
from sklearn.datasets import fetch_20newsgroups 

train_docs = fetch_20newsgroups(subset='train') 

vectorizer = TfidfVectorizer(stop_words='english', max_df=0.2,min_df=5) 
X = vectorizer.fit_transform(train_docs.data) 

#predicting a new vector, this works well when I check the predictions 
indoc = "This is an example of a new doc to be predicted" 
invec = vectorizer.transform([indoc]) 

#This is where the memory blows up 
batchsize = 1024 
similarities = [] 
for i in range(0, X.shape[0], batchsize): 
    similarities.extend(linear_kernel(invec, X[i:min(i+batchsize, X.shape[0])]).flatten()) 
similarities = np.array(similarities) 
similarities_orig = linear_kernel(invec, X) 
print((similarities == similarities_orig).all()) 

出力:

True 
+0

おかげでブラッド、これは私の目的のためにはかなりうまく動作します!私はなぜメモリオーバーフロー、おそらくスパース行列の乗算の私の貧しい人々の理解とは何かを得ていたかわからない:) – jowparks

関連する問題