Doc2Vec: ejercicio [Parte 1]

| Última modificación: 19 de junio de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

Entre los embeddings existentes se encuentra Doc2Vec, que no está enfocado tanto a nivel de palabra, sino en obtener representaciones de documentos completos. Esto puede ser útil en diversos casos, por ejemplo si, en lugar de querer hacer grandes representaciones de datos a nivel de frases, lo queremos para entrenar análisis de sentimientos a nivel de documentos. Aquí Doc2Vec se convierte en una herramienta de utilidad.

¿Cómo funciona Doc2Vec?

Al igual que en Word2Vec, en Doc2Vec tenemos dos modalidades.

Paragraph Vector: Distributed memory (PV – DM)

Aunque es similar a Word2Vec, en este caso los vectores representarán la información en un documento, no en una palabra. En este caso, además de tener los vectores para cada palabra, se incluye un vector que hace referencia al documento completo. De esta forma, cuando se calculan las palabras-vector, el vector para el documento también se calcula.

Aquí lo que le vamos a pasar al algoritmo cuando vayamos a entrenar es el propio documento y él será el encargado de optimizar esos pesos para cuando haya que generar nuevos embeddings.

Paragraph Vector: Distributed Bag of Words (PV – DBoW)

Análogo (o similar) al Skip – Gram en Word2Vec, el vector del documento es la entrada a la red, de manera que tratará de predecirse el contexto (todas las palabras que componen el documento).

A este método le vamos a entregar todas las palabras que tenga el documento de forma no ordenada, y él será el encargado de generar todo el contexto alrededor de ese documento.

Ejercicio: document clustering

Lo primero que haremos en este ejercicio es instalar las dependencias:

#Doc2Vec: instalar dependencias
! wget https://transfer.sh/J4o169/requirements.txt
! pip install -r requirements.txt
#Doc2Vec: instalar dependencias
! pip install  - - upgrade openpyxl 
Doc2Vec
#Doc2Vec: importar librerías
import pandas as pd
import numpy as np
from time import time
from sklearn.model_selection import train_test_split
from sklearn.metrics.pairwise import cosine_similarity
#Doc2Vec: importaciones
from nltk import sent_tokenize
from nltk.corpus import stopwords
import string
from tqdm import tqdm
import re

Vamos a hacer una limpieza completa de todo el texto para eliminar puntuaciones:

#Doc2Vec
string.punctuation += '  " " « » ¿ ¡ ' '  '
string.punctuation = string.punctuation.replace ( ' - ', ' ' )
table = str.maketrans  ({key: None for key in string.punctuation})
print (string.punctuation)

! ” # $ % & ‘ ( ) * + , . / : ; < = > ? @ [ \ ] ^ _ ‘ { | } ~ ” ” « » ¿ ¡ ‘ ‘

Ahora vamos a hacer el preprocesado:

#Doc2Vec: preprocesado
def preprocess (sent):
       return [token for token in re.sub ("\n+", " " , str (sent).lower ().translate (table)).split ("  ")]

En este paso haremos que los documentos enteros pasen a ser una lista. Antes teníamos una lista con frases, ahora tenemos una lista con documentos enteros:

#Doc2Vec: listas
def doc_list_format (df, save = False, fname = 'train'):
       #List for appending documents. One line per document
       doc_list = [  ]
       #Iterate over DataFrames and join preprocessed title and text in the same line
       for idx, (title, text) in enumerate (zip (df ['title'], df ['text'])):
              article_proc = "  ".join (preprocess (title))
              try:
                     for sent in sent_tokenize (text):
                            article_proc += "  " + "  ".join (preprocess (sent))
              except:
                     pass
              doc_list.append (article_proc)
              if save:
                     with open ('./datasets/spanish_news_ corpus_doc2vec_' + fname + ' .txt ', 'a') as f:
                            f.write (article_proc + "\n")
              else:
                     pass
       return doc_list

Data loading

Nuestro siguiente movimiento será descargar el dataset:

#Doc2Vec: data loading
! wget https://transfer.sh/KWNxRn/datasets.zip
! unzip datasets.zip

Cargamos los datos:

#Doc2Vec: data loading
%%time
df = pd.read_excel ('./datasets/spanish_new_corpus.xlsx')

CPU times: user 18 s, sys: 513 ms, total: 18.5 s

Wall time: 24.5 s

Observemos cómo es la estructura:

#Doc2Vec: estructura
print (df.shape)
df.tail ()

(39352, 6)

En este caso se trata de un documento de noticias en español. Aquí tenemos todo el texto, es decir, la noticia entera, que está conformada por un montón de frases.

Ahora vamos a darle a este documento el formato. Vamos a hacer la limpieza y eliminación de signos de puntuación y saltos de línea para evitar que los párrafos estén separados. Con esto generamos el nuevo dataframe:

#Doc2Vec: nuevo data frame
%%time
doc = doc_list_format (df. save = False, fname = 'train')

CPU times: user 11.9 s, sys: 2.24 s, total: 14.1 s

Wall time: 14.1 s

La segunda parte de nuestro ejercicio sería hacer el entrenamiento o training.

Ahora que hemos visto la parte de instalación e importación de complementos, librerías, descarga y preprocesado de datasets con Doc2Vec, podemos dar el siguiente paso y seguir aprendiendo.

Para acceder al mercado laboral IT, una de los sectores mejor pagados y con mayor demanda, tenemos para ti el Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp. Con esta formación de alta calidad adquirirás los conocimientos imprescindibles para conseguir el trabajo de tus sueños en pocos meses. ¡No esperes más para impulsar tu futuro y pide información ahora!

Sandra Navarro

Business Intelligence & Big Data Advisor & Coordinadora del Bootcamp en Data Science, Big Data & Machine Learning.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado