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: 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!