tfidfvectorizer tfidftransformer spanish hashingvectorizer countvectorizer python nlp scikit-learn pickle text-mining

python - tfidftransformer - Guarde y reutilice TfidfVectorizer en scikit learn



tfidfvectorizer python (1)

Estoy usando TfidfVectorizer en scikit learn para crear una matriz a partir de datos de texto. Ahora necesito guardar este objeto para reutilizarlo más tarde. Traté de usar Pickle, pero me dio el siguiente error.

loc=open(''vectorizer.obj'',''w'') pickle.dump(self.vectorizer,loc) *** TypeError: can''t pickle instancemethod objects

Intenté usar joblib en sklearn.externals, que de nuevo dio un error similar. ¿Hay alguna forma de guardar este objeto para poder reutilizarlo más tarde?

Aquí está mi objeto completo:

class changeToMatrix(object): def __init__(self,ngram_range=(1,1),tokenizer=StemTokenizer()): from sklearn.feature_extraction.text import TfidfVectorizer self.vectorizer = TfidfVectorizer(ngram_range=ngram_range,analyzer=''word'',lowercase=True,/ token_pattern=''[a-zA-Z0-9]+'',strip_accents=''unicode'',tokenizer=tokenizer) def load_ref_text(self,text_file): textfile = open(text_file,''r'') lines=textfile.readlines() textfile.close() lines = '' ''.join(lines) sent_tokenizer = nltk.data.load(''tokenizers/punkt/english.pickle'') sentences = [ sent_tokenizer.tokenize(lines.strip()) ] sentences1 = [item.strip().strip(''.'') for sublist in sentences for item in sublist] chk2=pd.DataFrame(self.vectorizer.fit_transform(sentences1).toarray()) #vectorizer is transformed in this step return sentences1,[chk2] def get_processed_data(self,data_loc): ref_sentences,ref_dataframes=self.load_ref_text(data_loc) loc=open("indexedData/vectorizer.obj","w") pickle.dump(self.vectorizer,loc) #getting error here loc.close() return ref_sentences,ref_dataframes


En primer lugar, es mejor dejar la importación en la parte superior de su código en lugar de dejarla dentro de su clase:

from sklearn.feature_extraction.text import TfidfVectorizer class changeToMatrix(object): def __init__(self,ngram_range=(1,1),tokenizer=StemTokenizer()): ...

Siguiente StemTokenizer no parece ser una clase canónica. Posiblemente lo tienes de http://sahandsaba.com/visualizing-philosophers-and-scientists-by-the-words-they-used-with-d3js-and-python.html o tal vez en otro lugar, así que lo haremos supongamos que devuelve una lista de cadenas .

class StemTokenizer(object): def __init__(self): self.ignore_set = {''footnote'', ''nietzsche'', ''plato'', ''mr.''} def __call__(self, doc): words = [] for word in word_tokenize(doc): word = word.lower() w = wn.morphy(word) if w and len(w) > 1 and w not in self.ignore_set: words.append(w) return words

Ahora para responder a su pregunta real, es posible que necesite abrir un archivo en modo byte antes de deshacerse de un pickle, es decir:

>>> from sklearn.feature_extraction.text import TfidfVectorizer >>> from nltk import word_tokenize >>> import cPickle as pickle >>> vectorizer = TfidfVectorizer(ngram_range=(0,2),analyzer=''word'',lowercase=True, token_pattern=''[a-zA-Z0-9]+'',strip_accents=''unicode'',tokenizer=word_tokenize) >>> vectorizer TfidfVectorizer(analyzer=''word'', binary=False, decode_error=u''strict'', dtype=<type ''numpy.int64''>, encoding=u''utf-8'', input=u''content'', lowercase=True, max_df=1.0, max_features=None, min_df=1, ngram_range=(0, 2), norm=u''l2'', preprocessor=None, smooth_idf=True, stop_words=None, strip_accents=''unicode'', sublinear_tf=False, token_pattern=''[a-zA-Z0-9]+'', tokenizer=<function word_tokenize at 0x7f5ea68e88c0>, use_idf=True, vocabulary=None) >>> with open(''vectorizer.pk'', ''wb'') as fin: ... pickle.dump(vectorizer, fin) ... >>> exit() alvas@ubi:~$ ls -lah vectorizer.pk -rw-rw-r-- 1 alvas alvas 763 Jun 15 14:18 vectorizer.pk

Nota : Al utilizar el idioma with para acceso de archivos E / S automáticamente se cierra el archivo una vez que sale del alcance.

En cuanto al problema con SnowballStemmer() , tenga en cuenta que SnowballStemmer(''english'') es un objeto, mientras que la función de derivación es SnowballStemmer(''english'').stem .

IMPORTANTE :

  • El parámetro del tokenizador de TfidfVectorizer espera tomar una cadena y devolver una lista de cadenas
  • Pero Snowball stemmer no toma una cadena como entrada y devuelve una lista de cadenas.

Entonces necesitarás hacer esto:

>>> from nltk.stem import SnowballStemmer >>> from nltk import word_tokenize >>> stemmer = SnowballStemmer(''english'').stem >>> def stem_tokenize(text): ... return [stemmer(i) for i in word_tokenize(text)] ... >>> vectorizer = TfidfVectorizer(ngram_range=(0,2),analyzer=''word'',lowercase=True, token_pattern=''[a-zA-Z0-9]+'',strip_accents=''unicode'',tokenizer=stem_tokenize) >>> with open(''vectorizer.pk'', ''wb'') as fin: ... pickle.dump(vectorizer, fin) ... >>> exit() alvas@ubi:~$ ls -lah vectorizer.pk -rw-rw-r-- 1 alvas alvas 758 Jun 15 15:55 vectorizer.pk