IIC2613 / Syllabus

Repositorio oficial Inteligencia Artificial 2020-2
6 stars 1 forks source link

BagofWords y Word2Vec #76

Open BenjaPrograma opened 3 years ago

BenjaPrograma commented 3 years ago

Hola! No me queda claro como utilizar estas codificaciones. Con Bow y W2V entreno el modelo. Pero luego no se que hacer o como se usa. Por ejemplo en BoW quedo después del transform con un vector gigante, no entiendo si tengo que usar directamente ese vector para alimentar el SVM, o si tengo que pasar todo los textos a un vector segun BoW, y eso pasarselo al SVM. Me queda la misma duda con W2V, tengo que asignarle un feature vector a cada texto?

Al ver la ayudantía me parece raro que con W2V se entrene 2 veces, uno para el train_set y otro para el test_set ¿Porque se hace esto? y es necesario? Yo pensaba que podía entrenar todo el set una vez y luego dividir los set con scikit.

Saludos y gracias!

Juan-AAS commented 3 years ago

Hola,

Entiendo tu pregunta, creo que me equivoqué en escribir el ejemplo, sin embargo el resultado es lo mismo. Para BoW puedes encontrar el vector que representa a cada texto de dos maneras una, usando vectorizer.fit(textos) para entrenar y crear el vocabulario para luego codificar cada texto. Luego debes usar vectorizer.transform(textos). La otra manera es solo usar vectorizer.fit_transform(textos) aquí hace el .fit y el .transform en un solo paso. De todas maneras si usas vectorizer.fit_transform(textos) y posteriormente vectorizer.transform(textos) el resultado será el mismo pero de forma redundante... (Creo que tendré que hacer un comunicado para aclarar esto a todos jeje). Respondiendo a la pregunta de si usar o no el vector gigante. Podrias, pero no será muy óptimo, ya que obtendrías una "matriz sparse" muchos ceros que generan ruido. Para mejorar esto hay un método de reducción de dimensionalidad que mencioné en la ayudantia que es TruncatedSVD (https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.TruncatedSVD.html#sklearn.decomposition.TruncatedSVD). El resultado de esta dimensionalidad será más óptima para que funcione en los clasificadores.

Para W2V; ocurre que el modelo codifica cada palabra en un vector de tamaño N (tú asignas este tamaño), entonces el texto estará representado por un vector de vectores. Luego, como aparece en el ejemplo del enunciado, haces un sumpooling y así tendrás que un vector de largo N por cada texto, y ese es el que se usa para los clasificadores.

Y la última. haz lo segundo que hiciste, entrena todo de una y con scikit learn divides. OJO que igual puedes entrenar word2vec con una porción de todos los datos y luego lo aplicas al dataset entero.

BenjaPrograma commented 3 years ago

Muchas gracias!