Scikit Learn: cálculo de TF-IDF a partir de un conjunto de matrices de características en lugar de a partir de un conjunto de documentos sin procesar

El TfidfVectorizer de Scikit-Learn convierte una colección de documentos sin procesar en una matriz de características de TF-IDF. En lugar de documentos en bruto, me gustaría convertir una matriz de nombres de características a características de TF-IDF.

El corpus que alimenta fit_transform() se supone que es una matriz de documentos en bruto, pero en su lugar me gustaría poder alimentarlo (o una función comparable) una matriz de matrices de características por documento. Por ejemplo:

 corpus = [ ['orange', 'red', 'blue'], ['orange', 'yellow', 'red'], ['orange', 'green', 'purple (if you believe in purple)'], ['orange', 'reddish orange', 'black and blue'] ] 

… a diferencia de una matriz unidimensional de cadenas.

Sé que puedo definir mi propio vocabulario para que lo use el TfidfVectorizer, por lo que fácilmente podría hacer un dict de características únicas en mi corpus y sus índices en los vectores de características. Pero la función aún espera documentos en bruto, y como mis funciones son de longitud variable y ocasionalmente se superponen (por ejemplo, ‘naranja’ y ‘naranja rojiza’), no puedo simplemente concatentar mis funciones en cadenas individuales y usar ngrams.

¿Hay alguna función diferente de Scikit-Learn que pueda usar para esto que no encuentro? ¿Hay alguna forma de usar el TfidfVectorizer que no estoy viendo? ¿O tendré que hacer mi propia función TF-IDF para hacer esto?

Puede escribir funciones personalizadas para anular el preprocesador y el tokenizador integrados.

De los documentos:

Preprocesador : un llamable que toma un documento completo como entrada (como una sola cadena) y devuelve una versión posiblemente transformada del documento, aún como una cadena completa. Esto se puede usar para eliminar tags HTML, minúsculas en todo el documento, etc.

Tokenizer : un llamador que toma la salida del preprocesador y la divide en tokens, luego devuelve una lista de estos.

En este caso, no es necesario realizar ningún preprocesamiento (porque no hay documentos sin procesar). La tokenización también es innecesaria, porque ya tenemos matrices de características. Por lo tanto, podemos hacer lo siguiente:

 tfidf = TfidfVectorizer(preprocessor=lambda x: x, tokenizer=lambda x: x) tfidf_matrix = tfidf.fit_transform(corpus) 

Saltamos los pasos del preprocesador y del tokenizador simplemente transmitiendo todo el corpus con lambda x: x . Una vez que el analizador incorporado recibe las matrices de características, construye el vocabulario en sí mismo y realiza TF-IDF en el corpus “tokenizado” de manera normal.