{"id":2420,"date":"2021-11-01T12:05:31","date_gmt":"2021-11-01T18:05:31","guid":{"rendered":"https:\/\/naps.com.mx\/blog\/?p=2420"},"modified":"2021-11-01T12:07:55","modified_gmt":"2021-11-01T18:07:55","slug":"vectorizar-texto-para-machine-learning","status":"publish","type":"post","link":"https:\/\/naps.com.mx\/blog\/vectorizar-texto-para-machine-learning\/","title":{"rendered":"Vectorizar texto para tareas de machine learning y matrices dispersas"},"content":{"rendered":"<p>Para realizar tareas de Machine Learning sobre elementos de texto, por ejemplo, para entrenar un clasificador, se requerir\u00e1 vectorizar texto, es decir codificar las palabras como n\u00fameros.<\/p>\n<p>Ilustraremos el proceso con el siguiente ejemplo sencillo.<\/p>\n<p><!--more--><\/p>\n<p>En el siguiente texto tenemos tres frases:<\/p>\n<ul>\n<li>El perro mordi\u00f3 al gato<\/li>\n<li>El gato mordi\u00f3 al rat\u00f3n<\/li>\n<li>Al rat\u00f3n le gusta el queso del gato<\/li>\n<\/ul>\n<p>Lo primero que har\u00edamos ser\u00eda eliminar las palabras que no aportan mucho significado al texto, por ejemplo, <em>el<\/em>, <em>al<\/em>, <em>del, le.<\/em><\/p>\n<p>Eso nos dejar\u00eda las frases asi:<\/p>\n<ul>\n<li>Perro mordio gato<\/li>\n<li>Gato mordio raton<\/li>\n<li>Raton gusta queso gato<\/li>\n<\/ul>\n<p>En algunas ocasiones tambi\u00e9n es conveniente eliminar los acentos o tildes de las palabras.<span class=\"Apple-converted-space\">\u00a0<\/span><\/p>\n<h2>C\u00f3mo vectorizar texto para tareas de machine learning<\/h2>\n<p>Ahora podemos vectorizar el texto, es decir codificar las palabras como n\u00fameros. Una forma sencilla es creando una matriz dispersa.<\/p>\n<p>En el ejemplo que estamos viendo, tendr\u00edamos tres filas, una por cada frase.<\/p>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.002.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone  wp-image-2425\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.002.jpeg\" alt=\"Vectorizar texto para machine learning\" width=\"473\" height=\"266\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.002.jpeg 1920w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.002-300x169.jpeg 300w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.002-768x432.jpeg 768w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.002-1024x576.jpeg 1024w\" sizes=\"auto, (max-width: 473px) 100vw, 473px\" \/><\/a><\/p>\n<p>Las columnas representar\u00edan cada palabra. En nuestro texto tenemos un total de 6 palabras:<\/p>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.003.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone  wp-image-2424\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.003.jpeg\" alt=\"Vectorizar texto para machine learning\" width=\"473\" height=\"266\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.003.jpeg 1920w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.003-300x169.jpeg 300w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.003-768x432.jpeg 768w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.003-1024x576.jpeg 1024w\" sizes=\"auto, (max-width: 473px) 100vw, 473px\" \/><\/a><\/p>\n<p>As\u00ed para la primer frase: <em>Perro mordio gato<\/em>, representar\u00edamos cada palabra con un n\u00famero, por ejemplo: 1<\/p>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.004.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone  wp-image-2423\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.004.jpeg\" alt=\"Vectorizar texto para machine learning\" width=\"470\" height=\"264\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.004.jpeg 1920w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.004-300x169.jpeg 300w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.004-768x432.jpeg 768w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.004-1024x576.jpeg 1024w\" sizes=\"auto, (max-width: 470px) 100vw, 470px\" \/><\/a><\/p>\n<p>El resto de las ubicaciones contendr\u00eda un 0.<\/p>\n<p>Para la segunda y tercer frase, en la segunda y tercer fila colocar\u00edamos los unos correspondientes:<\/p>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.006.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone  wp-image-2421\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.006.jpeg\" alt=\"Vectorizar texto para machine learning\" width=\"468\" height=\"263\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.006.jpeg 1920w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.006-300x169.jpeg 300w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.006-768x432.jpeg 768w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/frases5.006-1024x576.jpeg 1024w\" sizes=\"auto, (max-width: 468px) 100vw, 468px\" \/><\/a><\/p>\n<p>As\u00ed, tenemos una matriz dispersa, es decir una matriz donde la mayor\u00eda de los valores ser\u00e1n ceros.<span class=\"Apple-converted-space\">\u00a0(Puedes consultar: <a href=\"https:\/\/www.analyticslane.com\/2019\/10\/21\/matrices-dispersas-sparse-matrix\/\" target=\"_blank\" rel=\"noopener\">Matrices dispersas (Rodr\u00edguez, 2019)<\/a>)<\/span><\/p>\n<p>Considere que entre mayor sea la cantidad de palabras, mayor ser\u00e1 la cantidad de columnas por lo que la cantidad de ceros superar\u00e1 la cantidad de unos.<\/p>\n<p>Ahora bien, aunque comunmente relacionemos el cero con un valor nulo, para la computadora, el cero ocupa un espacio similar al de cualquier otro n\u00famero.<span class=\"Apple-converted-space\">\u00a0<\/span><\/p>\n<p>As\u00ed es que una forma de optimizar el espacio e incrementar la velocidad de procesamiento de la matriz es almacenar los unos en tres vectores V, I, J<\/p>\n<p>En el vector V, se almacenar\u00e1 el dato que contiene la matriz dispersa en la coordenada I, J.<span class=\"Apple-converted-space\">\u00a0<\/span><\/p>\n<p>Es decir, si en la posici\u00f3n 0,0 de la matriz dispersa hay un 1. En el vector I, habr\u00e1 un 0, en el vector J habr\u00e1 un 0 (en la misma posici\u00f3n) y en el vector V estar\u00e1 el valor, en este caso un 1.<span class=\"Apple-converted-space\">\u00a0<\/span><\/p>\n<p>(0,0)<span class=\"Apple-converted-space\">\u00a0 <\/span>1<\/p>\n<p>De modo que al final, toda nuestra matriz dispersa puede quedar representada por esos tres vectores:<\/p>\n<p>(I, J) V<\/p>\n<p>(0,0) 1<\/p>\n<p>(0,2) 1<\/p>\n<p>(0,3) 1<\/p>\n<p>(1,0) 1<\/p>\n<p>(1,1) 1<\/p>\n<p>(1,5) 1<\/p>\n<p>(2,0) 1<\/p>\n<p>(2,1) 1<\/p>\n<p>(2,4) 1<\/p>\n<p>(2,5) 1<\/p>\n<h2>Vectorizar texto usando Python<\/h2>\n<p>Veamos ahora un ejemplo en Python que nos ilustra lo que acabamos de realizar.<\/p>\n<pre class=\"lang:default decode:true\">descripcion\r\n\"perro mordio gato\"\r\n\"gato mordio raton\"\r\n\"raton gusta queso gato\"<\/pre>\n<p>Primero, tenemos un archivo de texto con las 3 frases que usamos de ejemplo. El archivo est\u00e1 en formato CSV, es decir, valores separados por comas. Solo contiene una columna llamada \u201cdescripcion\u201d<\/p>\n<p>En el siguiente c\u00f3digo haremos uso de CountVectorizer para extraer las palabras y codificarlas como un vector.<\/p>\n<p>Tambi\u00e9n utilizaremos TfIdVectorizer para calcular la frecuencia de las palabras. El m\u00e9todo que esta funci\u00f3n utiliza se llama TF-IDF (que significa algo as\u00ed como: Frecuencia de T\u00e9rmino &#8211; Frecuencia Inversa de Documento). No profundizaremos en los c\u00e1lculos que \u00e9ste m\u00e9todo realiza, pero<span class=\"Apple-converted-space\">\u00a0 <\/span>considere que TF-IDF son puntuaciones de la frecuencia de las palabras dentro de un documento.<\/p>\n<pre class=\"lang:python decode:true\">import pandas as pd\r\nfrom sklearn.feature_extraction.text import  TfidfVectorizer\r\nfrom sklearn.feature_extraction.text import  CountVectorizer\r\n\r\npalabras = pd.read_csv(\"palabras.csv\")\r\n\r\ncontador = CountVectorizer()\r\nvectorizador = TfidfVectorizer(max_features=10)\r\n\r\n#Crear una matriz dispersa\r\ncantidades = contador.fit_transform(palabras.descripcion)\r\nvalores = vectorizador.fit_transform(palabras.descripcion)\r\n\r\nprint (\"--- Palabras ---\")\r\nprint(vectorizador.get_feature_names())\r\nprint (\"... Vector de cantidades ...\")\r\nprint (cantidades)\r\nprint (\"\u00a8\u00a8\u00a8 Vector de valores \u00a8\u00a8\")\r\nprint (valores)\r\n\r\n<\/pre>\n<p>Como podemos observar, la clase TfIdfVectorizer nos crea los vectores de valores correspondientes a la matriz dispersa que contiene las palabras de nuestro archivo. Estos valores son los que utilizar\u00edamos para entrenar nuestro modelo de machine learning.<\/p>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/Vectorizar-texto-para-machine-learning.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone  wp-image-2427\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/Vectorizar-texto-para-machine-learning.png\" alt=\"Vectorizar texto para machine learning\" width=\"455\" height=\"459\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/Vectorizar-texto-para-machine-learning.png 1200w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/Vectorizar-texto-para-machine-learning-150x150.png 150w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/Vectorizar-texto-para-machine-learning-298x300.png 298w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/Vectorizar-texto-para-machine-learning-768x773.png 768w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2021\/11\/Vectorizar-texto-para-machine-learning-1017x1024.png 1017w\" sizes=\"auto, (max-width: 455px) 100vw, 455px\" \/><\/a><\/p>\n<p>Mira esto en video:<\/p>\n<p><iframe loading=\"lazy\" width=\"726\" height=\"408\" src=\"https:\/\/www.youtube.com\/embed\/Ok6n0ys5Edc\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Para realizar tareas de Machine Learning sobre elementos de texto, por ejemplo, para entrenar un clasificador, se requerir\u00e1 vectorizar texto, es decir codificar las palabras como n\u00fameros. Ilustraremos el proceso con el siguiente ejemplo sencillo.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"amp_status":"","footnotes":""},"categories":[315],"tags":[286,310,284],"class_list":["post-2420","post","type-post","status-publish","format-standard","hentry","category-machine-learning","tag-ejercicios-python","tag-inteligencia-artificial","tag-machine-learning"],"_links":{"self":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/2420","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/comments?post=2420"}],"version-history":[{"count":3,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/2420\/revisions"}],"predecessor-version":[{"id":2430,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/2420\/revisions\/2430"}],"wp:attachment":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=2420"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=2420"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=2420"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}