Lanzamiento de Python TfidfVectorizer: vocabulario vacío; Quizás los documentos solo contengan palabras de parada “

Estoy tratando de usar el Tfidf de Python para transformar un corpus de texto. Sin embargo, cuando bash adaptarlo, lo obtengo, aparece un error de valor ValueError: vocabulario vacío; Quizás los documentos solo contengan palabras vacías.

In [69]: TfidfVectorizer().fit_transform(smallcorp) --------------------------------------------------------------------------- ValueError Traceback (most recent call last)  in () ----> 1 TfidfVectorizer().fit_transform(smallcorp) /Users/maxsong/anaconda/lib/python2.7/site-packages/sklearn/feature_extraction/text.pyc in fit_transform(self, raw_documents, y) 1217 vectors : array, [n_samples, n_features] 1218 """ -> 1219 X = super(TfidfVectorizer, self).fit_transform(raw_documents) 1220 self._tfidf.fit(X) 1221 # X is already a transformed view of raw_documents so /Users/maxsong/anaconda/lib/python2.7/site-packages/sklearn/feature_extraction/text.pyc in fit_transform(self, raw_documents, y) 778 max_features = self.max_features 779 --> 780 vocabulary, X = self._count_vocab(raw_documents, self.fixed_vocabulary) 781 X = X.tocsc() 782 /Users/maxsong/anaconda/lib/python2.7/site-packages/sklearn/feature_extraction/text.pyc in _count_vocab(self, raw_documents, fixed_vocab) 725 vocabulary = dict(vocabulary) 726 if not vocabulary: --> 727 raise ValueError("empty vocabulary; perhaps the documents only" 728 " contain stop words") 729 ValueError: empty vocabulary; perhaps the documents only contain stop words 

Leí la pregunta de SO aquí: Problemas usando un vocabulario personalizado para TfidfVectorizer scikit-learn y probé la sugerencia de ogrisel de usar TfidfVectorizer (** params) .build_analyzer () (dataset2) para verificar los resultados del paso de análisis de texto y parece estar trabajando como se esperaba: abajo un fragmento de código:

 In [68]: TfidfVectorizer().build_analyzer()(smallcorp) Out[68]: [u'due', u'to', u'lack', u'of', u'personal', u'biggest', u'education', u'and', u'husband', u'to', 

¿Hay algo más que estoy haciendo mal? El corpus que estoy alimentando es solo una cadena gigante larga y puntuada por líneas nuevas.

¡Gracias!

Supongo que es porque solo tienes una cuerda. Intente dividirlo en una lista de cadenas, por ejemplo:

 In [51]: smallcorp Out[51]: 'Ah! Now I have done Philosophy,\nI have finished Law and Medicine,\nAnd sadly even Theology:\nTaken fierce pains, from end to end.\nNow here I am, a fool for sure!\nNo wiser than I was before:' In [52]: tf = TfidfVectorizer() In [53]: tf.fit_transform(smallcorp.split('\n')) Out[53]: <6x28 sparse matrix of type '' with 31 stored elements in Compressed Sparse Row format> 

En la versión 0.12, establecemos la frecuencia mínima de documentos en 2, lo que significa que solo se considerarán las palabras que aparecen al menos dos veces. Para que su ejemplo funcione, necesita establecer min_df=1 . Desde 0.13, esta es la configuración por defecto. Así que supongo que estás utilizando 0.12, ¿verdad?

Alternativamente, puedes poner tu cadena única como una tupla, si insistes en tener solo una cadena. En vez de tener:

smallcorp = "your text"

Prefieres ponerlo dentro de una tupla.

 In [22]: smallcorp = ("your text",) In [23]: tf.fit_transform(smallcorp) Out[23]: <1x2 sparse matrix of type '' with 2 stored elements in Compressed Sparse Row format>