tfidftransformer - Mantenga el resultado de TFIDF para predecir nuevo contenido usando Scikit para Python
tfidfvectorizer (3)
Si desea almacenar una lista de características para probar datos para usar en el futuro, puede hacer esto:
tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))
#store the content
with open("x_result.pkl", ''wb'') as handle:
pickle.dump(tfidf, handle)
#load the content
tfidf = pickle.load(open("x_result.pkl", "rb" ) )
Estoy usando sklearn en Python para hacer algunos clusters. He entrenado 200,000 datos, y el siguiente código funciona bien.
corpus = open("token_from_xml.txt")
vectorizer = CountVectorizer(decode_error="replace")
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))
km = KMeans(30)
kmresult = km.fit(tfidf).predict(tfidf)
Pero cuando tengo un nuevo contenido de prueba, me gustaría agruparlo en clústeres existentes que había entrenado. Así que me pregunto cómo puedo guardar los resultados de IDF, de modo que pueda hacer TFIDF para el nuevo contenido de prueba y asegurarme de que el resultado del nuevo contenido de prueba tenga la misma longitud de matriz.
Gracias por adelantado.
ACTUALIZAR
Es posible que necesite guardar la variable "transformador" o "tfidf" en un archivo (txt u otros), si uno de ellos contiene el resultado IDF entrenado.
ACTUALIZAR
Por ejemplo. Tengo los datos de entrenamiento:
["a", "b", "c"]
["a", "b", "d"]
Y haga TFIDF, el resultado contendrá 4 funciones (a, b, c, d)
Cuando PRUEBA :
["a", "c", "d"]
para ver a qué grupo (ya hecho por k-means) pertenece. TFIDF solo dará el resultado con 3 características (a, c, d), por lo que la agrupación en k-means caerá. (Si pruebo ["a", "b", "e"]
, puede haber otros problemas).
Entonces, ¿cómo almacenar la lista de características para probar los datos (aún más, almacenarla en el archivo)?
ACTUALIZAR
Resuelto, mira las respuestas a continuación.
puedes hacer la transformación de vectorización y tfidf en una etapa:
vec =TfidfVectorizer()
luego ajustar y transformar en los datos de entrenamiento
tfidf = vec.fit_transform(training_data)
y use el modelo tfidf para transformar
unseen_tfidf = vec.transform(unseen_data)
km = KMeans(30)
kmresult = km.fit(tfidf).predict(unseen_tfid)
CountVectorizer(decode_error="replace",vocabulary=vectorizer.vocabulary_)
éxito la lista de características guardando vectorizer.vocabulary_
y reutilizando por CountVectorizer(decode_error="replace",vocabulary=vectorizer.vocabulary_)
Códigos a continuación:
corpus = np.array(["aaa bbb ccc", "aaa bbb ddd"])
vectorizer = CountVectorizer(decode_error="replace")
vec_train = vectorizer.fit_transform(corpus)
#Save vectorizer.vocabulary_
pickle.dump(vectorizer.vocabulary_,open("feature.pkl","wb"))
#Load it later
transformer = TfidfTransformer()
loaded_vec = CountVectorizer(decode_error="replace",vocabulary=pickle.load(open("feature.pkl", "rb")))
tfidf = transformer.fit_transform(loaded_vec.fit_transform(np.array(["aaa ccc eee"])))
Eso funciona. tfidf
tendrá la misma longitud de entidad que los datos entrenados.