tfidfvectorizer tfidftransformer tfidf spanish hashingvectorizer countvectorizer python machine-learning scikit-learn tf-idf

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.