D'enregistrer et de réutiliser TfidfVectorizer dans scikit learn
Je suis en utilisant TfidfVectorizer dans scikit apprendre à créer une matrice à partir des données de texte. Maintenant, j'ai besoin d'enregistrer cet objet pour la réutiliser plus tard. J'ai essayé d'utiliser cornichon, mais il a donné l'erreur suivante.
loc=open('vectorizer.obj','w')
pickle.dump(self.vectorizer,loc)
*** TypeError: can't pickle instancemethod objects
J'ai essayé d'utiliser joblib dans sklearn.externals, qui a de nouveau donné une erreur semblable. Est-il possible d'enregistrer cet objet afin que je puisse le réutiliser plus tard?
Voici mon objet:
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
OriginalL'auteur Joswin K J | 2015-06-15
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, il est préférable de laisser l'importation en haut de votre code au lieu de l'intérieur de votre classe:
Prochaine
StemTokenizer
ne semble pas être une représentation canonique de la classe. Peut-être que vous avez obtenu à partir de http://sahandsaba.com/visualizing-philosophers-and-scientists-by-the-words-they-used-with-d3js-and-python.html ou peut-être quelque part d'autre donc nous allons supposer qu'il renvoie une liste de chaînes de caractères.Maintenant pour répondre à votre question, il est possible que vous ayez besoin pour ouvrir un fichier en mode octet avant de dumping d'un cornichon, c'est à dire:
Note: à l'Aide de la
with
idiome pour i/o accès au fichier se ferme automatiquement le fichier une fois que vous sortez de lawith
portée.Sur la question avec
SnowballStemmer()
, notez queSnowballStemmer('english')
est un objet tandis que le radical fonction estSnowballStemmer('english').stem
.IMPORTANT:
TfidfVectorizer
'générateur de jetons paramètre s'attend à prendre une chaîne de caractères et retourne une liste de chaîne deDe sorte que vous aurez besoin pour ce faire:
Vous devez vous assurer que, quel que soit le tokenizer fonction est, elle retourne une liste de chaîne de caractères.
Elle renvoie une liste de chaînes de caractères seulement. L'erreur a été supprimée lorsque j'ai changé
self.snowball_stemmer = SnowballStemmer('english')
àsnowball_stemmer = SnowballStemmer('english')
. Fondamentalement, j'ai enlevé ce dans les attributs de la classe et de l'erreur a été corrigée.Ahhh. c'est parce que
SnowballStemmer('english')
est un objet, ce que vous avez besoin est un objet iterable à l'aide deSnowballStemmer('english').stem
Salut! Je suis en train d'enregistrer un Cornichon pour la transformation de texte avec TfidfVectorizer, il est 76MB taille et j'ai besoin de le réduire à 10 MO. Le paramètre dtype=<type 'numpy.int64'> aide à réduire la taille?
OriginalL'auteur alvas