{"id":166017,"date":"2022-10-16T12:58:31","date_gmt":"2022-10-16T11:58:31","guid":{"rendered":"https:\/\/liora.io\/es\/?p=166017"},"modified":"2026-02-27T10:15:30","modified_gmt":"2026-02-27T09:15:30","slug":"word-embedding","status":"publish","type":"post","link":"https:\/\/liora.io\/es\/word-embedding","title":{"rendered":"Word Embedding"},"content":{"rendered":"\n<p><strong>En un <a href=\"https:\/\/liora.io\/es\/nlp-natural-language-processing-introduccion\">art\u00edculo anterior<\/a>, definimos NLP &#8211; Procesamiento del Lenguaje Natural. En este art\u00edculo, nos centraremos en uno de sus principales m\u00e9todos, el Word Embedding. El Word Embedding (incrustaci\u00f3n de palabras) designa un conjunto de m\u00e9todos de aprendizaje destinados a representar las palabras de un texto mediante vectores num\u00e9ricos reales. En este art\u00edculo, vas a explorar tres de los m\u00e9todos principales para representar una palabra como vector :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>M\u00e9todo 1 : One Hot Encoding<br><\/li>\n\n\n\n<li>M\u00e9todo 2 : Image Embedding<br><\/li>\n\n\n\n<li>M\u00e9todo 3\u00a0: Word Embedding<br><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/liora.io\/app\/uploads\/sites\/7\/2020\/09\/Frise-300x285.png\" alt=\"word embedding\" style=\"width:auto;height:400px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-one-hot-encoding-un-metodo-que-transforma-las-letras-en-valores-numericos\">One hot encoding : Un m\u00e9todo que transforma las letras en valores num\u00e9ricos<\/h2>\n\n\n\n<p>La representaci\u00f3n vectorial m\u00e1s cl\u00e1sica de las palabras es la one hot encoding. Se asigna una dimensi\u00f3n a cada palabra del vocabulario. Cada palabra del vocabulario se representa como un vector binario con todos sus valores a cero, excepto el \u00edndice de la palabra.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter is-resized\" style=\"margin-top:var(--wp--preset--spacing--columns);margin-bottom:var(--wp--preset--spacing--columns)\"><a href=\"https:\/\/medium.com\/@athif.shaffy\/one-hot-encoding-of-text-b69124bef0a7\"><img decoding=\"async\" src=\"https:\/\/liora.io\/app\/uploads\/sites\/7\/2020\/08\/1-1024x537.png\" alt=\"\" style=\"width:auto;height:250px\" \/><\/a><\/figure>\n\n\n\n<p>Para ilustrar la codificaci\u00f3n, analicemos la siguiente frase :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"I think therefore I am\"<\/pre>\n\n\n\n<div style=\"height:1px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>El principio es asignar un \u00edndice a cada palabra del vocabulario. El <strong>vocabulario<\/strong> se presenta entonces en forma de diccionario :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{'am': 0, 'i': 1, 'therefore': 2, 'think': 3}<\/pre>\n\n\n\n<div style=\"height:1px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Aqu\u00ed, <strong>el vocabulario est\u00e1 compuesto por las 4 palabras \u00fanicas de nuestro corpus<\/strong>. El m\u00e9todo consiste entonces en representar la palabra del vocabulario como un vector de dimensi\u00f3n 4 (tama\u00f1o del vocabulario) que tiene todos sus valores a cero excepto el \u00edndice de la palabra.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Onehot('i')=0 1 0 0<\/pre>\n\n\n\n<div style=\"height:1px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Con esta representaci\u00f3n, <strong>todas las palabras tienen la misma distancia y similitud<\/strong>. Por tanto, la codificaci\u00f3n <strong>one hot<\/strong> solo proporciona informaci\u00f3n seg\u00fan la cual una <strong>palabra es diferente de otr<\/strong>a.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-image-embedding-transformar-imagenes-en-valores-numericos\">Image Embedding : Transformar im\u00e1genes en valores num\u00e9ricos<\/h2>\n\n\n\n<p>El tama\u00f1o de una imagen se define por su n\u00famero de p\u00edxeles. Como vimos en un art\u00edculo anterior [enlace a la secci\u00f3n CNN del dosier DL], utilizamos <strong>convoluciones para extraer las caracter\u00edsticas m\u00e1s relevantes que el valor de los p\u00edxeles<\/strong>. Por ejemplo, los n\u00facleos utilizados para detectar bordes podr\u00edan ser \u00fatiles para clasificar determinadas formas geom\u00e9tricas.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter is-resized\" style=\"margin-top:var(--wp--preset--spacing--columns);margin-bottom:var(--wp--preset--spacing--columns)\"><a href=\"https:\/\/towardsdatascience.com\/a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way-3bd2b1164a53\"><img decoding=\"async\" src=\"https:\/\/liora.io\/app\/uploads\/sites\/7\/2020\/08\/2-1-1024x352.png\" alt=\"\" style=\"width:auto;height:250px\" \/><\/a><figcaption class=\"wp-element-caption\">Red neuronal convolucional<\/figcaption><\/figure>\n\n\n\n<p>El image embedding es capaz de utilizar las convoluciones\/pooling para codificar la imagen y extraer las <strong>relaciones de linealidad entre las propiedades (estilo art\u00edstico, forma espec\u00edfica, etc.) y las nuevas caracter\u00edsticas de nuestra imagen<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter is-resized\"><a href=\"https:\/\/www.oreilly.com\/library\/view\/practical-deep-learning\/9781492034858\/ch04.html\"><img decoding=\"async\" src=\"https:\/\/liora.io\/app\/uploads\/sites\/7\/2020\/08\/3-1-300x296.png\" alt=\"\" style=\"width:auto;height:600px\" \/><\/a><figcaption class=\"wp-element-caption\">ACP en el embedding de im\u00e1genes<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-word-embedding\">Word Embedding<\/h2>\n\n\n\n<p>Por analog\u00eda, <strong>el word embedding es capaz de capturar el contexto, la similitud sem\u00e1ntica y sint\u00e1ctica (g\u00e9nero, sin\u00f3nimos, etc.) de una palabra reduciendo el tama\u00f1o<\/strong>. Por ejemplo, cabr\u00eda esperar que las palabras \u00abperro\u00bb y \u00abgato\u00bb estuvieran representadas por vectores relativamente cercanos en el espacio vectorial donde se definen esos vectores.<\/p>\n\n\n\n<p>Al igual que con las im\u00e1genes, queremos que <strong>el modelo elija las caracter\u00edsticas m\u00e1s relevantes para representar la palabra<\/strong>. Por ejemplo, la caracter\u00edstica \u00abser vivo\u00bb podr\u00eda ser interesante para diferenciar \u00abperro\u00bb y \u00abordenador\u00bb, y para acercar \u00abperro\u00bb y \u00abgato\u00bb.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-matrice-d-embedding\">Matrice d\u2019embedding<\/h2>\n\n\n\n<p>El m\u00e9todo de embedding que se suele utilizar para reducir la dimensi\u00f3n de un vector es utilizar el resultado que devuelve una capa densa como embedding, es decir, multiplicar una matriz de embedding W por la representaci\u00f3n \u00abone hot\u00bb de la palabra :<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\" style=\"margin-top:var(--wp--preset--spacing--columns);margin-bottom:var(--wp--preset--spacing--columns)\"><img decoding=\"async\" src=\"https:\/\/liora.io\/app\/uploads\/sites\/7\/2020\/08\/2-3.png\" alt=\"\" style=\"width:auto;height:100px\" \/><\/figure>\n\n\n\n<p>En forma de vector :<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/liora.io\/app\/uploads\/sites\/7\/2020\/08\/5.png\" alt=\"\" style=\"width:auto;height:25px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image aligncenter is-resized is-style-not-rounded\" style=\"margin-top:var(--wp--preset--spacing--columns);margin-bottom:var(--wp--preset--spacing--columns)\"><img decoding=\"async\" src=\"https:\/\/liora.io\/app\/uploads\/sites\/7\/2020\/08\/4-254x300.png\" alt=\"\" style=\"width:auto;height:400px\" \/><\/figure>\n\n\n\n<p>Ahora que hemos definido el m\u00e9todo de reducci\u00f3n de la dimensi\u00f3n (compresi\u00f3n de la informaci\u00f3n), \u00bfc\u00f3mo entrenamos la matriz de embedding <strong>W<\/strong>?<\/p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-a89b3969 wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/liora.io\/es\/nuestros-cursos-de-data\">Seguir una formaci\u00f3n en Data Science<\/a><\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-entrenamiento-de-la-matriz-de-embedding-problema-de-clasificacion\">Entrenamiento de la matriz de embedding: problema de clasificaci\u00f3n<\/h2>\n\n\n\n<p>Una primera forma de encontrar la <strong>matriz de embedding es entrenarla en un problema supervisado<\/strong>. Por tanto, utilizaremos <strong>esa representaci\u00f3n de palabras para resolver un problema de an\u00e1lisis de sentimientos<\/strong> en las rese\u00f1as de IMBD. La serie de datos contiene 25.000 cr\u00edticas de pel\u00edculas (m\u00e1s informaci\u00f3n sobre la serie de datos <a href=\"https:\/\/ai.stanford.edu\/~amaas\/data\/sentiment\/\">aqu\u00ed<\/a>).<\/p>\n\n\n\n<p>Entonces se puede <strong>entrenar la matriz W del word embedding a la vez que se entrena el problema de clasificaci\u00f3n<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-formateo-de-los-datos\">Formateo de los datos :<\/h3>\n\n\n\n<p>Para formatear los datos, es necesario vectorizar el corpus de texto, transformando cada rese\u00f1a en una secuencia de enteros (cada n\u00famero entero es el \u00edndice de una palabra) :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">tokenizer.texts_to_sequences(['hello my dear readers']) -&gt; [[4422, 10, 2974, 6117]]<\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter is-resized\" style=\"margin-top:var(--wp--preset--spacing--columns);margin-bottom:var(--wp--preset--spacing--columns)\"><img decoding=\"async\" src=\"https:\/\/liora.io\/app\/uploads\/sites\/7\/2020\/08\/2-2.png\" alt=\"\" style=\"width:524px;height:auto\" \/><\/figure>\n\n\n\n<p>Nuestro modelo ser\u00e1 un simple bag of word con un m\u00e9todo de embedding :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>La capa de embedding transformar\u00e1 cada \u00edndice de palabras en un vector de embedding. La matriz W del embedding se aprender\u00e1 a medida que se entrene el modelo. Las dimensiones resultantes son: (lote, secuencia, embedding).<\/li>\n\n\n\n<li>A continuaci\u00f3n, la capa GlobalAveragePooling1D devuelve un vector de salida de longitud fija para cada ejemplo, sacando la media de la dimensi\u00f3n de la secuencia. Esta transformaci\u00f3n consiste en hacer una bag of word y permite que el modelo gestione entradas de longitud variable.<\/li>\n\n\n\n<li>Por \u00faltimo, como estamos ante un problema de clasificaci\u00f3n (rese\u00f1a positiva o negativa), es necesario a\u00f1adir capas densas para clasificar el sentimiento de la rese\u00f1a.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-y-si-pasamos-a-la-practica\">\u00bfY si pasamos a la pr\u00e1ctica?<\/h2>\n\n\n\n<pre class=\"wp-block-code has-xsmall-font-size\" style=\"margin-top:var(--wp--preset--spacing--columns);margin-bottom:var(--wp--preset--spacing--columns)\"><code>from keras import Sequential\nfrom keras.layers import Embedding, Dense, GlobalAveragePooling1D, Dropout\n\nembedding_dim = 300\n# Model\nmodel = Sequential()\n# 1. Embedding\nmodel.add(Embedding(10000, embedding_dim))\n# 2. Bag of Words\nmodel.add(GlobalAveragePooling1D())\n# 3. Classification\nmodel.add(Dense(256, activation='relu'))\nmodel.add(Dense(2, activation='softmax'))\n\n# Compile\nmodel.compile(optimizer='adam',\n              loss='sparse_categorical_crossentropy',\n              metrics=&#091;'accuracy'])\n# Fit\nhistory = model.fit(X_train, y_train,\n    batch_size = 32,\n    epochs = 5,\n    validation_data = &#091;X_test, y_test])<\/code><\/pre>\n\n\n\n<p>De este modo, hemos conseguido en la serie de datos de prueba una precisi\u00f3n de 0,88. Esta puntuaci\u00f3n es dif\u00edcil de conseguir con ayuda de los m\u00e9todos cl\u00e1sicos. Adem\u00e1s, tambi\u00e9n podr\u00edamos haber utilizado un m\u00e9todo tf-idf (en lugar de la bag of word) para transformar nuestra secuencia en un vector.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-conclusion\">Conclusi\u00f3n<\/h3>\n\n\n\n<p>Un modelo de este tipo suele dar mejores resultados que los enfoques tradicionales. Tambi\u00e9n permite reducir el tama\u00f1o del problema y, por tanto, la tarea de aprendizaje. Sin embargo, como solo damos informaci\u00f3n sobre el sentimiento, al word embedding le cuesta captar cualquier otra relaci\u00f3n.<\/p>\n\n\n\n<p>En un pr\u00f3ximo art\u00edculo, entrenaremos la matriz de embedding de forma no supervisada utilizando el conocido <a href=\"https:\/\/liora.io\/es\/nlp-word-embedding-word2vec-es\">algoritmo word2vec<\/a>. Como el entrenamiento se realiza sin supervisi\u00f3n, evitaremos el sesgo asociado a la resoluci\u00f3n de un problema supervisado.<\/p>\n\n\n\n<p>\u00bfTe ha gustado este art\u00edculo? \u00bfQuieres saber m\u00e1s sobre la <strong>Data Science<\/strong>?<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex is-content-justification-center\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/liora.io\/es\/nuestros-cursos-de-data\">\u00a1Inscr\u00edbete ya en alguno de nuestros cursos!<\/a><\/div>\n<\/div>\n\n\n\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"One hot encoding : Un m\u00e9todo que transforma las letras en valores num\u00e9ricos\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"One hot encoding asigna una dimensi\u00f3n a cada palabra del vocabulario, represent\u00e1ndola como vector binario con todos ceros excepto el \u00edndice de la palabra. Ejemplo: vocabulario {'am':0, 'i':1, 'therefore':2, 'think':3}, Onehot('i')=0 1 0 0. Todas las palabras tienen misma distancia y similitud \u2013 solo indica que una palabra es diferente de otra.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Image Embedding : Transformar im\u00e1genes en valores num\u00e9ricos\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Image embedding usa convoluciones\/pooling para codificar im\u00e1genes y extraer relaciones entre propiedades (estilo art\u00edstico, forma espec\u00edfica) y nuevas caracter\u00edsticas, m\u00e1s all\u00e1 del valor de p\u00edxeles.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Word Embedding\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Word embedding captura contexto, similitud sem\u00e1ntica y sint\u00e1ctica (g\u00e9nero, sin\u00f3nimos) reduciendo dimensi\u00f3n. Palabras similares como 'perro' y 'gato' se representan con vectores cercanos. El modelo elige caracter\u00edsticas relevantes (ej. 'ser vivo' para diferenciar 'perro' de 'ordenador').\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Matrice d\u2019embedding\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"El m\u00e9todo de embedding usa una capa densa multiplicando matriz W por representaci\u00f3n 'one hot' de la palabra para reducir dimensi\u00f3n. La matriz W se entrena durante el aprendizaje.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Entrenamiento de la matriz de embedding: problema de clasificaci\u00f3n\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"La matriz W se entrena en problema supervisado (ej. an\u00e1lisis sentimientos rese\u00f1as IMBD con 25.000 cr\u00edticas). Proceso: formatear datos vectorizando texto a secuencias enteros, modelo con capa Embedding (transforma \u00edndices a vectores), GlobalAveragePooling1D (bag of word), capas densas para clasificaci\u00f3n. Precisi\u00f3n alcanzada 0,88.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"\u00bfY si pasamos a la pr\u00e1ctica?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"C\u00f3digo ejemplo con Keras: modelo Sequential con Embedding, GlobalAveragePooling1D, Dense(256) y Dense(2) con softmax. Compilado con adam y sparse_categorical_crossentropy. Entrenado 5 \u00e9pocas. Conclusi\u00f3n: modelo da mejores resultados que enfoques tradicionales, reduce tama\u00f1o problema, pero solo capta sentimiento, no otras relaciones. Pr\u00f3ximo art\u00edculo: entrenamiento no supervisado con word2vec para evitar sesgos.\"\n      }\n    }\n  ]\n}\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>En un art\u00edculo anterior, definimos NLP &#8211; Procesamiento del Lenguaje Natural. En este art\u00edculo, nos centraremos en uno de sus principales m\u00e9todos, el Word Embedding. El Word Embedding (incrustaci\u00f3n de palabras) designa un conjunto de m\u00e9todos de aprendizaje destinados a representar las palabras de un texto mediante vectores num\u00e9ricos reales. En este art\u00edculo, vas a [&hellip;]<\/p>\n","protected":false},"author":47,"featured_media":184607,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"editor_notices":[],"footnotes":""},"categories":[2440],"class_list":["post-166017","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-data-ia"],"acf":[],"_links":{"self":[{"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/posts\/166017","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/users\/47"}],"replies":[{"embeddable":true,"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/comments?post=166017"}],"version-history":[{"count":4,"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/posts\/166017\/revisions"}],"predecessor-version":[{"id":184615,"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/posts\/166017\/revisions\/184615"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/media\/184607"}],"wp:attachment":[{"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/media?parent=166017"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/liora.io\/es\/wp-json\/wp\/v2\/categories?post=166017"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}