Técnicas de Extracción de Características – PNL

Este artículo se centra en las técnicas básicas de extracción de características en NLP para analizar las similitudes entre fragmentos de texto. El procesamiento del lenguaje natural (NLP) es una rama de las ciencias de la computación y el aprendizaje automático que se ocupa de capacitar a las computadoras para que procesen una gran cantidad de datos del lenguaje humano (natural). Brevemente, la PNL es la capacidad de las computadoras para comprender el lenguaje humano. Necesidad de técnicas de extracción de características.Los algoritmos de aprendizaje automático aprenden de un conjunto predefinido de características de los datos de entrenamiento para generar resultados para los datos de prueba. Pero el principal problema al trabajar con el procesamiento del lenguaje es que los algoritmos de aprendizaje automático no pueden funcionar directamente en el texto sin formato. Por lo tanto, necesitamos algunas técnicas de extracción de características para convertir el texto en una array (o vector) de características. Algunos de los métodos más populares de extracción de características son:

  • bolsa de palabras
  • TF-FDI

Bag of Words: Bag-of-Words es uno de los métodos más fundamentales para transformar tokens en un conjunto de características. El modelo BoW se usa en la clasificación de documentos, donde cada palabra se usa como una función para entrenar al clasificador. Por ejemplo, en una tarea de análisis de sentimiento basado en reseñas, la presencia de palabras como ‘fabuloso’, ‘excelente’ indica una reseña positiva, mientras que palabras como ‘molesto’, ‘pobre’ apuntan a una reseña negativa. Hay 3 pasos al crear un modelo BoW:

  1. El primer paso es el preprocesamiento de texto, que implica:
    1. convertir todo el texto en minúsculas.
    2. eliminando todos los signos de puntuación y símbolos innecesarios.
  2. El segundo paso es crear un vocabulario de todas las palabras únicas del corpus. Supongamos que tenemos un texto de revisión de hotel. Consideremos 3 de estas revisiones, que son las siguientes:
  1. Buena película
  2. no es una buena pelicula
  3. no le gustó
  1. Ahora, consideramos todas las palabras únicas del conjunto de revisiones anterior para crear un vocabulario, que será el siguiente:

{buena, película, no, a, hizo, me gusta}

  1. En el tercer paso, creamos una array de características asignando una columna separada para cada palabra, mientras que cada fila corresponde a una reseña. Este proceso se conoce como Vectorización de Texto . Cada entrada en la array significa la presencia (o ausencia) de la palabra en la reseña. Ponemos 1 si la palabra está presente en la reseña, y 0 si no está presente.

Para el ejemplo anterior, la array de características será la siguiente:

bueno película no a hizo me gusta
1 1 0 0 0 0
1 1 1 1 0 0
0 0 1 0 1 1

Un inconveniente importante al usar este modelo es que se pierde el orden de aparición de las palabras, ya que creamos un vector de tokens en orden aleatorio. Sin embargo, podemos resolver este problema considerando N-gramas (principalmente bigramas) en lugar de palabras individuales ( es decir, unigramas). Esto puede preservar el orden local de las palabras. Si consideramos todos los bigramas posibles de las revisiones dadas, la tabla anterior se vería así:

Buena película película No a
1 1 0 0
1 1 0 1
0 0 1 0

Sin embargo, esta tabla resultará ser muy grande, ya que puede haber muchos bigramas posibles al considerar todos los pares de palabras consecutivos posibles. Además, el uso de N-gramas puede dar como resultado una array muy escasa (tiene muchos 0), si el tamaño del vocabulario es grande, ¡lo que hace que el cálculo sea realmente complejo! Por lo tanto, tenemos que eliminar algunos N-gramas en función de su frecuencia. Al igual, siempre podemos eliminar los N-gramas de alta frecuencia , porque aparecen en casi todos los documentos. Estos N-gramas de alta frecuencia son generalmente artículos, determinantes, etc. más comúnmente llamados StopWords. Del mismo modo, también podemos eliminar los N-gramas de baja frecuencia porque estos son realmente raros (es decir, ¡generalmente aparecen en 1 o 2 revisiones)! Estos tipos de N-gramas son generalmente errores tipográficos (o errores de tipeo). Generalmente, los N-gramas de frecuencia media se consideran los más ideales. Sin embargo, hay algunos N-gramas que son realmente raros en nuestro corpus pero que pueden resaltar un problema específico. Supongamos que hay una revisión que dice: «Wi-Fi se rompe a menudo». Aquí, las interrupciones de Wi-Fi de N-gram no pueden ser demasiado frecuentes, pero resaltan un problema importante que debe analizarse. Nuestro modelo BoW no capturaría tales N-gramas ya que su frecuencia es realmente baja. Para resolver este tipo de problema, necesitamos otro modelo, es decir , TF-IDF Vectorizer , que estudiaremos a continuación.Código: el código de Python para crear un modelo BoW es: 

Python3

# Creating the Bag of Words model
word2count = {}
for data in dataset:
    words = nltk.word_tokenize(data)
    for word in words:
        if word not in word2count.keys():
            word2count[word] = 1
        else:
            word2count[word] += 1

Vectorizador TF-IDF: TF-IDF significa frecuencia de documento de frecuencia inversa . Destaca un tema específico que quizás no sea demasiado frecuente en nuestro corpus pero que tiene una gran importancia. El valor de TF-IFD aumenta proporcionalmente al número de veces que aparece una palabra en el documento y disminuye con el número de documentos en el corpus que contienen la palabra. Se compone de 2 sub-partes, que son:

  1. Plazo Frecuencia (TF)
  2. Frecuencia de documento inversa (IDF)

Frecuencia de términos (TF): la frecuencia de términos especifica la frecuencia con la que aparece un término en todo el documento. Se puede considerar como la probabilidad de encontrar una palabra dentro del documento. Calcula la cantidad de veces que  w_i aparece una palabra en una revisión  r_j , con respecto a al número total de palabras de la reseña  r_j . Se formula como: 

\[tf(w_i, r_j)=\frac{No.\, of \, times \, w_i \, occurs \, in \, r_j}{Total \, no. \, of \, words \, in \, r_j}\]

Un esquema diferente para calcular tf es la normalización logarítmica . Y se formula como: 

\[tf(t, d)=1 + \log{\(f_{t, d}\)}\]

donde,  f_{t, D} es la frecuencia del término t en el documento D. Frecuencia inversa del documento (IDF): la frecuencia inversa del documento es una medida de si un término es raro o frecuente en los documentos de todo el corpus. Destaca aquellas palabras que aparecen en muy pocos documentos en todo el corpus, o en un lenguaje sencillo, las palabras que son raras tienen una puntuación IDF alta. IDF es un valor logarítmico normalizado, que se obtiene dividiendo el número total de documentos  D del corpus por el número de documentos que contienen el término  t y tomando el logaritmo del término total. 

\[idf(d, D)=\log{\frac{|D|}{\{d \epsilon D:t \epsilon D\}}}\]

donde,  f_{t, D} es la frecuencia del término t en el documento D.  |D| es el número total de documentos en el corpus. \{d \epsilon D:t \epsilon D\} es el recuento de documentos en el corpus, que contiene el término t. Dado que la relación dentro de la función logarítmica de IDF tiene que ser siempre mayor o igual a 1, el valor de IDF (y por lo tanto tf–idf) es mayor o igual a 0. Cuando un término aparece en una gran cantidad de documentos, el la relación dentro del logaritmo se acerca a 1, y la IDF está más cerca de 0. Frecuencia de término-Frecuencia de documento inversa (TF-IDF) TF-IDF es el producto de TF e IDF. Está formulado como: 

\[tfidf(t, d, D) = tf(t, d)*idf(d, D)\]

Una puntuación TF-IDF alta se obtiene por un término que tiene una frecuencia alta en un documento y una frecuencia baja en el corpus. Para una palabra que aparece en casi todos los documentos, el valor IDF se acerca a 0, lo que hace que tf-idf también se acerque a 0. El valor TF-IDF es alto cuando los valores IDF y TF son altos, es decir, la palabra es rara en todo el documento pero frecuente en un documento. Tomemos el mismo ejemplo para entender esto mejor:

  1. Buena película
  2. no es una buena pelicula
  3. no le gustó

En este ejemplo, cada oración es un documento separado. Teniendo en cuenta el modelo de bigrama, calculamos los valores TF-IDF para cada bigrama:

  Buena película película No
Buena película 1*registro(3/2) = 0,17 1*registro(3/2) = 0,17 0*registro(3/1) = 0
no es una buena pelicula 1*registro(3/2) = 0,17 1*registro(3/2) = 0,17 0*registro(3/1) = 0
no le gustó 0*registro(3/2) = 0 0*registro(3/2) = 0 1*registro(3/1) = 0,47

Aquí, observamos que el bigrama no es raro (es decir, aparece en un solo documento), en comparación con otros tokens y, por lo tanto, tiene una puntuación tf-idf más alta. Código: uso de la función incorporada de Python TfidfVectorizer para calcular la puntuación tf-idf para cualquier corpus 

Python3

# calculating tf-idf values
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
 
texts = {
"good movie", "not a good movie", "did not like"
}
 
tfidf = TfidfVectorizer(min_df = 2, max_df = 0.5, ngram_range = (1, 2))
features = tfidf.fit_transform(texts)
 
pd.Dataframe{
     features.todense(),
     columns = tfidf.get_feature_names()
}

En una nota final, podemos decir que aunque Bag-of-Words es uno de los métodos más fundamentales en la extracción de características y la vectorización de texto, no logra capturar ciertos problemas en el texto. Sin embargo, este problema se resuelve con TF-IDF Vectorizer, que también es un método de extracción de características que captura algunos de los principales problemas que no son demasiado frecuentes en todo el corpus.

Publicación traducida automáticamente

Artículo escrito por muskan_kothari y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *