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