Descifrando el código del contexto Técnicas de vectorización de palabras en PNL

Descifrando el código del contexto técnicas de vectorización de palabras en PNL

Te mudaste a una nueva ciudad lejos de tu país, donde casualmente te encontraste con alguien en una cafetería. Una joven de tu edad y al instante, ambos estaban involucrados en una conversación. Esto sucedió porque ambos sabían inglés. Justo cuando estabas emocionado/a de haber conocido a alguien que hablaba tu idioma, el camarero vino hablando en el idioma nativo, para tomar tu pedido. Bueno, tu nueva amiga está lista para ser una traductora. Tan pronto como regresaste a tu apartamento, buscaste en internet cursos para aprender el idioma nativo. Así que es evidente que un lenguaje común es esencial para una comunicación adecuada entre dos entidades.

Foto de daan evers en Unsplash

En el bullicioso campo de la inteligencia artificial, el procesamiento del lenguaje natural es una tecnología emocionante. Es fascinante que una máquina sea capaz de entender lo que estás hablando en tu idioma nativo. Esto facilita una interacción mutua fluida entre humanos y computadoras. Pero ¿no debería haber un lenguaje común de comunicación para que esto suceda? Como sabemos, los humanos hablan una amplia variedad de idiomas, como inglés, español, francés, hindi, mandarín, y así sucesivamente. Pero el único lenguaje que conocen las computadoras es el binario. Su mundo entero está construido con 0s y 1s.

Si las computadoras entienden números y nosotros entendemos idiomas como inglés, debería haber algo que convierta el lenguaje natural a números. Word2vec viene a nuestro rescate.

Word2vec representa las palabras en una oración como un vector en un espacio continuo. Los vectores capturan la relación semántica entre las palabras en diversos contextos. Palabras similares tienen un vector similar. La figura a continuación muestra una representación en 2D de dicho espacio vectorial (la dimensión de un espacio vectorial en problemas de PLN reales es mucho mayor que 2).

Podemos ver palabras similares como “caminar” y “correr” cerca una de la otra. Mientras que “sonreír” y “radiología” son palabras no relacionadas y están muy lejos. Las palabras cercanas entre sí se llaman palabras reemplazables, es decir, si intercambias esas palabras en una oración, la oración seguirá teniendo sentido. La reemplazabilidad de dos palabras se puede calcular en función del coseno del ángulo entre los vectores de las dos palabras. Esto puede tomar un valor entre -1 y 1, donde 1 significa que las palabras están fuertemente relacionadas. Algunas operaciones en los vectores se pueden utilizar para realizar tareas como encontrar palabras análogas.

Word2vec se utiliza principalmente en predicciones de palabras. Es posible que hayamos visto características como autocompletar y autocorrector en nuestras aplicaciones diarias como el correo electrónico. Word2vec se utiliza principalmente para predecir la siguiente palabra/palabras en un documento incompleto o para completar las palabras faltantes en un documento. Para realizar estas tareas, se entrenará un modelo de aprendizaje automático.

Ahora podemos ver algunas formas en las que los idiomas naturales se vectorizan para aplicaciones en la vida real.

Foto de Jefferson Santos en Unsplash

Aquí vamos a entrenar un modelo de filtrado de spam usando un conjunto de datos relativamente pequeño. Para un modelo adecuado, debemos usar un conjunto de datos más grande. Eso llevará mucho tiempo para ejecutarse.

Los datos consisten en varios mensajes de texto que son mensajes de spam o no. Se pueden descargar desde aquí.

Es un archivo de texto en el que cada línea tiene dos campos, una etiqueta y una oración separados por una coma. La etiqueta es “spam” para mensajes de spam y “ham” para mensajes genuinos.

Voy a implementar esto en Python. El programa requiere varias bibliotecas como numpy, pandas, nltk, regex, gensim, y así sucesivamente. Si no las tienes instaladas, puedes instalarlas usando pip. Te mostraré todos los paquetes importados para el programa.

from gensim.models import Word2Vecimport numpy as npfrom nltk.corpus import stopwordsimport nltkfrom nltk.corpus import stopwordsimport pandas as pdimport stringimport regex as refrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import precision_score,recall_scorefrom sklearn.model_selection import train_test_splitimport gensim

Ahora que tenemos todos los paquetes importados, podemos comenzar con la implementación.

El primer paso es limpiar y preparar el conjunto de datos.

messages = pd.read_csv("output.csv", delimiter="\t")messages.columns = ["label", "text"]  def text_cleaner(text):    nxt = "".join([char for char in text if char not in string.punctuation])    nxt = re.split("\W+",nxt.lower())    nxt = [k for k in nxt if k not in stopwords.words('english')]    return nxt messages["clean_text"] = messages['text'].apply(lambda x:text_cleaner(x))print(messages.head())

Guardé el conjunto de datos en un archivo llamado output.csv. Utilicé pandas.read_csv() para leer el archivo. El delimitador está configurado en “\t” ya que los campos están separados en el conjunto de datos utilizando tabulaciones.

Le dimos títulos a las dos columnas de los datos como label y text.

Ahora tenemos que convertir el texto en tokens. Antes de eso, podemos limpiar los textos. Primero, eliminamos toda la puntuación en la oración. En Python, toda la puntuación común se puede encontrar en string.punctuation.

Se utiliza nxt = re.split(“\W+”,nxt.lower()) para dividir la oración en un conjunto de palabras utilizando regex. También he convertido las palabras en minúsculas ya que no queremos que nuestro modelo distinga entre mayúsculas y minúsculas.

Las stopwords son aquellas palabras que no contribuyen mucho al significado de la oración. Hay alrededor de 170+ stopwords en inglés. Se pueden acceder desde la biblioteca nltk utilizando stopwords.words(‘english’). Podemos eliminar esas palabras de nuestros datos para hacer que nuestro modelo sea ligero y eficiente.

Los datos ahora están limpios y tokenizados y se almacenan en una nueva columna llamada clean_text. Los primeros 5 elementos de los datos se pueden imprimir utilizando la función head().

Ahora tenemos un conjunto de tokens, que debemos convertir en vectores antes de entrenar. Para ello, usemos una propiedad llamada TF-IDF (Frecuencia de Término-Frecuencia Inversa de Documento). El TF-IDF de una palabra en un documento muestra qué tan importante es esa palabra para el documento. Está directamente relacionado con la frecuencia de la palabra en el documento y inversamente relacionado con el número de documentos en el espacio muestral. Se puede calcular utilizando

En Python, podemos usar la clase TfidfVectorizer para crear los vectores. Para simplificar el código, no estamos creando una nueva columna para limpiar y tokenizar. La función text_cleaner se puede llamar en el TfidfVectorizer().

new_vector = TfidfVectorizer(analyzer=text_cleaner)x = new_vector.fit_transform(messages['text'])x_features = pd.DataFrame(x.toarray())

ahora es una matriz 2D en la que cada fila representa un vector que contiene el valor TF-IDF de todos los tokens en el espacio muestral. Si la palabra no está presente en la oración, el valor TF-IDF de ese token será cero. Dado que este es el caso para la mayoría de las palabras, obtenemos una matriz dispersa. La matriz ahora se convierte en un dataframe de pandas para entrenar.

Aquí estamos usando el RandomForestClassifier proporcionado por sklearn para entrenar el modelo.

x_train, x_test, y_train, y_test = train_test_split(x_features,messages['label'],test_size=0.2)rf = RandomForestClassifier()rf_model = rf.fit(x_train,y_train)y_pred = rf_model.predict(x_test)precision = precision_score(y_test,y_pred,pos_label='spam')recall = recall_score(y_test,y_pred,pos_label='spam')print("precision = {} y recall = {}".format(round(precision,4),round(recall,4)))

Los datos se dividen en conjuntos de entrenamiento y prueba y el conjunto de entrenamiento se pasa a RandomForestClassifier para crear un modelo. Este modelo se prueba con los datos de prueba y obtenemos una precisión de 1.0 y una recuperación de 0.8378. (es posible que obtengas un valor ligeramente diferente ya que hice algunos ajustes en los datos que tenía).

Foto de Nate Grant en Unsplash

Word2vec, por otro lado, funciona con un enfoque ligeramente diferente. Estudia la palabra basándose en su posición. Esto se hace analizando las palabras cercanas a una palabra. Se crea una ventana de un tamaño determinado alrededor de cada aparición de una palabra. De esta manera, se aprende el contexto del uso de la palabra. Veamos cómo se hace en el mismo conjunto de datos que usamos en el ejemplo anterior.

Los datos se limpian y tokenizan y se almacenan en una nueva columna como hicimos anteriormente. Podemos dividir esos datos en datos de entrenamiento y prueba y pasarlos al modelo word2vec. La vectorización de los tokens se encarga de la clase Word2Vec que se encuentra en el paquete gensim.

x_train, x_test, y_train, y_test = train_test_split(messages["clean_text"],messages["label"],test_size=0.2)w2v_model = gensim.models.Word2Vec(x_train,vector_size=100,window=5,min_count=2)w2v_model.save("mymodel.model")

El modelo entrenado se puede guardar en el sistema local para no tener que entrenarlo cada vez que lo ejecutemos.

Aquí pasamos un recuento mínimo de 2, lo que significa que se crea un vector solo si hay al menos 2 apariciones de la palabra en todos los datos. De esta manera, podemos eliminar algunas palabras que no tienen ningún impacto en el problema.

Un modelo word2vec tiene muchas funcionalidades incorporadas. Por ejemplo, si quieres encontrar las palabras más similares a “run” en el modelo, puedes usar la función most_similar().

mymodel = Word2Vec.load("mymodel.model")similar_words = mymodel.wv.most_similar("run")print(similar_words)

[('pls', 0.9978137612342834), ('yes', 0.9977635145187378), ('r', 0.9977442026138306), ('win', 0.9977269768714905), ('today', 0.9976850152015686), ('im', 0.9976809024810791), ('get', 0.9976732134819031), ('reply', 0.9976603984832764), ('new', 0.9976487159729004), ('one', 0.9976474046707153)]

La salida que obtuvimos es muy loca. Esto se debe a que usamos un conjunto de datos pequeño para este entrenamiento. En gensim, están disponibles modelos similares entrenados en una gran cantidad de documentos de Wikipedia, lo que proporciona resultados más precisos.

La vectorización del lenguaje natural tiene un alcance muy amplio en el aprendizaje automático. Esta técnica se puede aplicar en otros dominios también. El análisis de sentimientos, la generación de texto y la clasificación de ADN de máquina son solo algunas de esas aplicaciones. El éxito de word2vec desempeñó un papel clave en el desarrollo de estos campos.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Los modelos base Llama 2 de Meta ahora están disponibles en Amazon SageMaker JumpStart

Hoy, nos complace anunciar que los modelos base Llama 2 desarrollados por Meta están disponibles para los clientes a ...

Inteligencia Artificial

Train y despliega modelos de ML en un entorno multicloud utilizando Amazon SageMaker

En esta publicación, demostramos una de las muchas opciones que tienes para aprovechar las capacidades de IA/ML más a...

Inteligencia Artificial

¿Se entienden Do Flamingo y DALL-E? Explorando la simbiosis entre los modelos de generación de subtítulos de imágenes y síntesis de texto a imagen

La investigación multimodal que mejora la comprensión de la computadora de texto e imágenes ha avanzado mucho recient...

Inteligencia Artificial

Investigadores demuestran pagos digitales cuánticos 'incondicionalmente seguros

La investigación representa un posible avance en las comunicaciones cuánticas y, potencialmente, el comienzo de la er...