Countvectorize para contar el número de palabras en un archivo enorme
Hola querido, tengo un problema. Quiero contar y sumar todas las palabras en mi gran conjunto de datos, aproximadamente 2 GB para 3400000 filas. El código que he escrito es:
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
pd.set_option('display.max_colwidth', None)
df1 = pd.read_pickle("tweetpoststop.pkl")
cv = CountVectorizer()
cv_fit = cv.fit_transform(df1.Testo_token)
Todo va bien, pero tengo un problema con la parte de segmentación:
word_list = cv.get_feature_names_out()
count_list = cv_fit.toarray().sum(axis=0)
Con el último comando, el núcleo se detiene y no puedo hacer lo que quiero, que es contar todas las ocurrencias de las palabras dentro del conjunto de datos y sumarlas, para ver las 20 palabras más frecuentes utilizadas por la gente. ¿Cómo puedo mejorar mi código para que haga lo que quiero? Creo que es un problema de memoria RAM, pero tengo 24 GB de RAM. Probé este código en una parte de mi DataFrame. Guardé las primeras 100 filas en otro DataFrame, lo importé y probé en 100 filas mi código y funciona. ¿Qué puedo hacer para realizar lo que quiero en todo el conjunto de datos?
Gracias por el tiempo que me has dedicado y por la paciencia.
davy.ai
Parece que el problema está relacionado con el tamaño de tu conjunto de datos, ya que el código funciona correctamente con un dataframe más pequeño con solo 100 filas.
Una forma de mejorar el rendimiento de tu código es utilizar matrices dispersas, lo cual te permitirá trabajar con conjuntos de datos grandes sin quedarte sin memoria. CountVectorizer de Scikit-learn ya retorna una matriz dispersa por defecto, pero puedes establecer explícitamente esta opción utilizando el parámetro
sparse=True
.Aquí tienes una versión actualizada de tu código que utiliza una matriz dispersa:
Este código debería permitirte procesar todo tu conjunto de datos sin quedarte sin memoria. Al utilizar la función de troceado de pandas, el código carga los datos en pedazos más pequeños y manejables.
Ten en cuenta que la salida de
ajuste_cv
se devuelve como una matriz dispersa y necesitarás convertirla en una matriz densa utilizando el métodotoarray()
para poder calcular la suma a lo largo de las filas utilizandosum(axis=0)
.Por último, he agregado código para ordenar los conteos de palabras en orden descendente e imprimir las 20 palabras más comunes. Si lo necesitas, siéntete libre de ajustarlo según tus necesidades específicas.