2017-09-26 18 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() 

은 20mil에 1 행 CSR의 비교를하고, 많은 메모리를 차지하지 말아야 같이 보인다 -row-CSR은 1x20mil ndarray를 출력해야합니다.

Justy 참고 : X는 CSR 매트릭스 ~ 12GB의 메모리입니다 (내 컴퓨터에만 16 개가 있음). 나는 이것을 대체하기 위해 gensim을 조사해 보았지만 훌륭한 예를 찾을 수는 없습니다.

제가 누락 된 부분에 대한 의견이 있으십니까?

답변

0

일괄 처리 할 수 ​​있습니다. 다음은 코드 조각을 기반으로 한 예제이지만 sklearn의 데이터 세트로 대체합니다. 이 작은 데이터 세트의 경우 결과가 동등하다는 것을 보여주기 위해 원본 데이터를 계산합니다. 당신은 아마도 큰 batchsize를 사용할 수 있습니다.

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