Tengo un dataframe de pandas con text
columna que consta de news articles
de news articles
. Dado como:
text article1 article2 article3 article4
He calculado los valores Tf-IDF para los artículos como:
from sklearn.feature_extraction.text import TfidfVectorizer tfidf = TfidfVectorizer() matrix_1 = tfidf.fit_transform(df['text'])
Como mi dataframe se mantiene actualizado de vez en cuando. Entonces, digamos que después de calcular-si como matriz_1 mi dataframe se actualizó con más artículos. Algo como:
text article1 article2 article3 article4 article5 article6 article7
Como tengo millones de artículos y todos, quiero almacenar una matriz tf-IDF del artículo anterior y actualizarlo con las puntuaciones tf-IDF del nuevo artículo. Ejecutar el código of-IDF para todos los artículos, una y otra vez, consumirá memoria. ¿Hay alguna manera de que pueda realizar esto?
No he probado este código pero siento que esto debería funcionar.
import numpy as np from sklearn.feature_extraction.text import TfidfVectorizer df = pd.DataFrame() while True: if not len(df): # When you dataframe is populated for the very first time tfidf = TfidfVectorizer() matrix_1 = tfidf.fit_transform(df['text'].iloc[last_len:]) last_len = len(df) else: # When you dataframe is populated again and again # If you have to use earlier fitted model matrix_1 = np.vstack(matrix_1, tfidf.transform(df['text'].iloc[last_len:])) # If you have to update tf-idf every time which is kinda doesn't make sense matrix_1 = np.vstack(matrix_1, tfidf.fit_transform(df['text'].iloc[last_len:])) last_len = len(df) # TO-DO Some break condition according to your case #####
Si la duración entre las actualizaciones del dataframe es mayor de lo que puede usar pickle en matrix_1 para almacenar resultados intermedios.
Sin embargo, lo que creo que es usar tfidf.fit_transform(df['text'])
una y otra vez en diferentes entradas no le dará ningún resultado significativo o puede que no lo entiendan. ¡¡Aclamaciones!!