2016-07-30 23 views
1

Ich muss mehr als 1.000.000 Textdatensätze verarbeiten. Ich verwende CountVectorizer, um meine Daten zu transformieren. Ich habe den folgenden Code.Vektorisierung in Sklearn scheint sehr speicherintensiv zu sein. Warum?

TEXT = [data[i].values()[3] for i in range(len(data))] #these are the text records 

from sklearn.feature_extraction.text import CountVectorizer 
vectorizer = CountVectorizer(min_df=1) 
X = vectorizer.fit_transform(TEXT) 


X_list = X.toarray().tolist() 

Wie ich diesen Code ausführen, wird es MemoryError aus. Die Textaufzeichnungen, die ich habe, sind meist in kurzen Absätzen (~ 100 Wörter). Die Vektorisierung scheint sehr teuer zu sein.

UPDATE

habe ich mehr Einschränkungen CountVectorizer aber immer noch MemoeryError. Die Länge der feature_names ist 2391.

from sklearn.feature_extraction.text import CountVectorizer 
vectorizer = CountVectorizer(min_df=0.003,max_df = 3.05, lowercase = True, stop_words = 'english') 
X = vectorizer.fit_transform(TEXT) 
feature_names = vectorizer.get_feature_names() 

X_tolist = X.toarray().tolist() 

Traceback (most recent call last): 
File "nlp2.py", line 42, in <module> 
X_tolist = X.toarray().tolist() 
File "/opt/conda/lib/python2.7/site-packages/scipy/sparse/compressed.py", line 940, in toarray 
return self.tocoo(copy=False).toarray(order=order, out=out) 
File "/opt/conda/lib/python2.7/site-packages/scipy/sparse/coo.py", line 250, in toarray 
B = self._process_toarray_args(order, out) 
File "/opt/conda/lib/python2.7/site-packages/scipy/sparse/base.py", line 817, in _process_toarray_args 
return np.zeros(self.shape, dtype=self.dtype, order=order) 
MemoryError 

Warum so ist und wie man damit umgehen? Vielen Dank!!

+1

Können Sie uns Zugriff gewähren zu Ihrem Datensatz? Auch welche Zeile ist der MemoryError an? Können Sie uns die Spur geben? – bpachev

+0

Dank bpachev, weiß ich nicht, wie Sie Zugriff auf den Datensatz geben, wie es in einem Remote-Server mit Sicherheit ist MemoryError kommt nur, wenn ich 'X_list = X.toarray(). Tolist()' ausführe 'Ich wurde angewiesen, min und max_df zu setzen. Ich hatte nur min. – achimneyswallow

Antwort

2

Ihr Problem ist, dass X eine spärliche Matrix mit einer Zeile für jedes Dokument darstellt, die darstellt, welche Wörter in diesem Dokument vorhanden sind. Wenn Sie insgesamt eine Million Dokumente mit insgesamt 2391 verschiedenen Wörtern haben (Länge der Feature-Namen wie in Ihrer Frage angegeben), wäre die Gesamtzahl der Einträge in der dichten Version von x etwa zwei Milliarden, genug, um möglicherweise eine Speicherfehler.

Das Problem ist mit dieser Linie X_list = X.toarray().tolist(), die X zu einem dichten Array konvertiert. Sie haben nicht genug Speicher dafür, und es sollte eine Möglichkeit geben, zu tun, was Sie ohne es tun möchten (wie die spärliche Version von X alle Informationen enthält, die Sie benötigen)

+0

Ja, das ist in der Tat der Fall. Die spärliche Version von X hat alle Informationen das brauchte ich - ich hatte konvertiert, wann immer ich ein Modell anpassen musste, und es wurde mir schließlich klar, dass es nicht notwendig ist. – achimneyswallow