Desmitificando el PLN Guía para principiantes sobre los fundamentos y técnicas del procesamiento del lenguaje natural

Desmitificando el PLN Guía para principiantes sobre fundamentos y técnicas del procesamiento del lenguaje natural

Foto de Jr Korpa en Unsplash

El Procesamiento del Lenguaje Natural (NLP, por sus siglas en inglés) es un campo emocionante en el Aprendizaje Automático que permite a las máquinas comprender, interpretar, entender y generar lenguaje humano. Básicamente, es la tecnología que permite a las computadoras leer, entender y responder al lenguaje humano, ya sea en forma de texto o habla. Es como enseñarle a las máquinas a hablar nuestro idioma e incluso generar respuestas creativas, coherentes y contextualmente relevantes. En este artículo, profundizaremos en los términos básicos, terminología y fundamentos de la tecnología que sustenta a ChatGPT y la gran cantidad de sistemas de IA generativa que existen hoy en día.

Los términos clave utilizados incluyen:

Documento

Un fragmento de texto, que puede ir desde una sola oración hasta un libro completo.

Corpus

Una colección de documentos utilizados para análisis o entrenamiento en NLP.

corpus = ["Este es el primer documento.", "Otro documento aquí.", "Y un tercero."]

Vocabulario

El conjunto de todas las palabras únicas en un corpus.

from collections import Countercorpus = ["Este es el primer documento.", "Otro documento aquí.", "Y un tercero."]words = ' '.join(corpus).lower().split()vocabulary = set(words)print("Vocabulario:", vocabulary)

Vocabulario: {'documento.', 'documento', 'primer', 'un', 'otro', 'y', 'tercero', 'este', 'aquí.', 'es', 'el', 'uno.'}

Segmentación

El proceso de dividir un texto en segmentos significativos, como oraciones o párrafos.

Tokenización

Dividir el texto en unidades más pequeñas, como palabras o subpalabras (tokens).

from nltk.tokenize import word_tokenizetext = "La tokenización es un paso importante en NLP."tokens = word_tokenize(text)print("Tokens:", tokens)

Tokens: ['La', 'tokenización', 'es', 'un', 'paso', 'importante', 'en', 'NLP', '.']

Palabras vacías

Palabras comúnmente utilizadas (por ejemplo, ‘y’, ‘el’, ‘es’) que suelen eliminarse en el análisis de NLP.

from nltk.corpus import stopwordsstop_words = set(stopwords.words('spanish'))print("Palabras vacías:", stop_words)

Palabras vacías: {'él', 'una', 'esto', 'que', 'su', 'sus', 'la', 'ella', 'tú', 'no', 'podría', 'abajo', 'fuera', 'ahora', 'no', 'es', 'que', 'era', 'hacer', 'no', 'fuera', 'hasta', 'haciendo', 'no', 'tiene', 'habiendo', 'hacia', 'a', 'ti', 'consigo', 'él', 'de... 'mío', 'míos', 'misma', 'mismos', 'misma', 'mismas', 'mis', 'mío', 'míos', 'mía', 'mías', 'mío', 'míos', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi', 'mi'}

Stemming

Reducir palabras a su forma base o raíz (stem).

from nltk.stem import PorterStemmerstemmer = PorterStemmer()word = "running"stemmed_word = stemmer.stem(word)print("Palabra reducida:", stemmed_word)

Palabra reducida: run

Lematización

Reducir palabras a su forma base (lemma) considerando el contexto.

from nltk.stem import WordNetLemmatizerlemmatizer = WordNetLemmatizer()word = "Raqib ama la programación y el baile."lemmatized_word = lemmatizer.lemmatize(word)print("Palabra lematizada:", lemmatized_word)

Etiquetado de POS (Part-of-Speech Tagging)

Asignar una categoría gramatical (por ejemplo, sustantivo, verbo, adjetivo) a cada palabra en una oración.

from nltk import pos_tagfrom nltk.tokenize import word_tokenizesentence = "El gato está sobre la alfombra"tokens = word_tokenize(sentence)pos_tags = pos_tag(tokens)print("Etiquetas POS:", pos_tags)

Etiquetas POS: [('El', 'DT'), ('gato', 'NN'), ('está', 'VBZ'), ('sobre', 'IN'), ('la', 'DT'), ('alfombra', 'NN')]
  • ('El', 'DT'): ‘El’ es un determinante (DT).
  • ('gato', 'NN'): ‘gato’ es un sustantivo (NN).
  • ('está', 'VBZ'): ‘está’ es un verbo, tercera persona del singular en presente (VBZ).
  • ('sobre', 'IN'): ‘sobre’ es una preposición o conjunción subordinante (IN).
  • ('la', 'DT'): ‘la’ es un determinante (DT).
  • ('alfombra', 'NN'): ‘alfombra’ es un sustantivo (NN).

Bolsa de palabras (BoW)

Una representación de texto que cuenta la frecuencia de las palabras en un documento, sin tener en cuenta la gramática ni el orden de las palabras.

from sklearn.feature_extraction.text import CountVectorizercorpus = ["Este es el primer documento.", "Otro documento aquí.", "Y un tercero."]vectorizer = CountVectorizer()bow_representation = vectorizer.fit_transform(corpus)print("Representación de la Bolsa de Palabras:\n", bow_representation.toarray())print("Vocabulario:", vectorizer.get_feature_names())

TF-IDF (Frecuencia de Término-Inversa de Frecuencia de Documento)

Una técnica para ponderar la importancia de las palabras en un documento en relación con un corpus basado en la frecuencia.

from sklearn.feature_extraction.text import TfidfVectorizercorpus = ["Este es el primer documento.", "Otro documento aquí.", "Y un tercero."]vectorizer = TfidfVectorizer()tfidf_representation = vectorizer.fit_transform(corpus)print("Representación TF-IDF:\n", tfidf_representation.toarray())print("Vocabulario:", vectorizer.get_feature_names())

Representación TF-IDF: [[0.         0.         0.35543247 0.46735098 0.         0.46735098  0.         0.46735098 0.         0.46735098] [0.         0.62276601 0.4736296  0.         0.62276601 0.  0.         0.         0.         0.        ] [0.57735027 0.         0.         0.         0.         0.  0.57735027 0.         0.57735027 0.        ]]Vocabulario: ['and', 'another', 'document', 'first', 'here', 'is', 'one', 'the', 'third', 'this']

Pasos de Preprocesamiento de Texto

Ahora, aplicaremos las técnicas básicas de PLN para preprocesar una cadena de texto.

Convertir el texto a minúsculas.

sample_text = "¡PLN es un campo emocionante! Permite a las máquinas comprender, interpretar y generar lenguaje humano. Obtén más información en https://raqibcodes.com. #PLN #AprendizajeAutomático @ComunidadPLN 2023303"# Convertir el texto a minúsculasdef convertir_a_minúsculas(texto):    return texto.lower()# Aplicar la conversión a minúsculastexto_en_minúsculas = convertir_a_minúsculas(sample_text)print("Texto en minúsculas:", texto_en_minúsculas)

Texto en minúsculas: pln es un campo emocionante! permite a las máquinas comprender, interpretar y generar lenguaje humano. obtén más información en https://raqibcodes.com. #pln #aprendizajeautomático @comunidadpln 2023303

Eliminar caracteres especiales.

def eliminar_caracteres_especiales(texto):    # Eliminar URLs, hashtags, menciones y caracteres especiales    texto = re.sub(r"http\S+|www\S+|@\w+|#\w+", "", texto)    texto = re.sub(r"[^\w\s.]", "", texto)    return texto# Aplicar eliminación de caracteres especialestexto_sin_caracteres_especiales = eliminar_caracteres_especiales(texto_en_minúsculas)print("Texto sin caracteres especiales:", texto_sin_caracteres_especiales)

Texto sin caracteres especiales: nlp es un campo emocionante que permite a las máquinas comprender, interpretar y generar lenguaje humano. obtener más información en     2023303

Eliminar números y dígitos.

def eliminar_numeros(texto):    # Eliminar números/dígitos    texto = re.sub(r'\d+(\.\d+)?', '', texto)    return texto# Aplicar eliminación de números/dígitostexto_sin_numeros = eliminar_numeros(texto_sin_caracteres_especiales)print("Texto sin números/dígitos:", texto_sin_numeros)

Texto sin números/dígitos: nlp es un campo emocionante que permite a las máquinas comprender, interpretar y generar lenguaje humano. obtener más información en 

Tokenizar texto.

from nltk.tokenize import word_tokenizedef tokenizar_texto(texto):    # Tokenizar el texto    tokens = word_tokenize(texto)    return tokens# Aplicar tokenizaciontokens = tokenizar_texto(texto_sin_numeros)print("Tokens:", tokens)

Tokens: ['nlp', 'es', 'un', 'campo', 'emocionante', 'que', 'permite', 'a', 'las', 'máquinas', 'comprender', 'interpretar', 'y', 'generar', 'lenguaje', 'humano', '.', 'obtener', 'más', 'información']

Eliminar palabras vacías.

from nltk.corpus import stopwordsdef eliminar_palabras_vacias(tokens):    # Eliminar palabras vacías    palabras_vacias = set(stopwords.words('spanish'))    tokens = [token for token in tokens if token not in palabras_vacias]    return tokens# Aplicar eliminación de palabras vaciastokens_sin_palabras_vacias = eliminar_palabras_vacias(tokens)print("Tokens sin palabras vacías:", tokens_sin_palabras_vacias)

Tokens sin palabras vacías: ['nlp', 'campo', 'emocionante', 'permite', 'máquinas', 'comprender', 'interpretar', 'generar', 'lenguaje', '.', 'obtener', 'más', 'información']

Lematizar palabras.

from nltk.stem import WordNetLemmatizerdef lematizar_palabras(tokens):    # Lematizar las palabras    lematizador = WordNetLemmatizer()    tokens = [lematizador.lemmatize(token) for token in tokens]    return tokens# Aplicar lematizaciontokens_lematizados = lematizar_palabras(tokens_sin_palabras_vacias)print("Tokens lematizados:", tokens_lematizados)

Tokens lematizados: ['nlp', 'campo', 'emocionante', 'permite', 'máquina', 'comprender', 'interpretar', 'generar', 'lenguaje', '.', 'obtener', 'más', 'información']

Aplicar Stemming.

from nltk.stem import PorterStemmerdef aplicar_stemming(tokens):    # Aplicar Stemming    stemmer = PorterStemmer()    tokens_stemmed = [stemmer.stem(token) for token in tokens]    return tokens_stemmed# Aplicar stemmingtokens_stemmed = aplicar_stemming(tokens_lematizados)print("Tokens con Stemming:", tokens_stemmed)

Tokens con Stemming: ['nlp', 'excit', 'campo', 'enabl', 'machin', 'comprend', 'interpret', 'gener', 'lenguaj', '.', 'obten', 'má', 'información']

Unir los tokens en una sola cadena.

def unir_tokens(tokens):    # Unir los tokens en una sola cadena    return ' '.join(tokens)# Aplicar unión de tokens en una sola cadenatexto_preprocesado = unir_tokens(tokens_lematizados)print("Texto preprocesado:", texto_preprocesado)

Texto preprocesado: nlp campo emocionante permite máquina comprender interpretar generar lenguaje . obtener más información

Aplicar etiquetado POS.

from nltk import pos_tagdef etiquetado_pos(tokens):    # Realizar etiquetado POS    pos_tags = pos_tag(tokens)    return pos_tags# Aplicar etiquetado POSpos_tags = etiquetado_pos(tokens_lematizados)print("Etiquetas POS:", pos_tags)

Etiquetas POS: [('nlp', 'NN'), ('campo', 'NN'), ('emocionante', 'NN'), ('permite', 'NN'), ('máquina', 'NN'), ('comprender', 'NN'), ('interpretar', 'NN'), ('generar', 'NN'), ('lenguaje', 'NN'), ('.', '.'), ('obtener', 'NN'), ('más', 'NN'), ('información', 'NN')]

Significado de las etiquetas

  • ('nlp', 'RB'): ‘nlp’ se etiqueta como un adverbio (RB).
  • ('exciting', 'JJ'): ‘exciting’ es un adjetivo (JJ).
  • ('field', 'NN'): ‘field’ es un sustantivo (NN).
  • ('enables', 'NNS'): ‘enables’ es un sustantivo plural (NNS).
  • ('machine', 'NN'): ‘machine’ es un sustantivo (NN).
  • ('comprehend', 'VBP'): ‘comprehend’ es un verbo en forma base (VBP).
  • ('interpret', 'JJ'): ‘interpret’ es un adjetivo (JJ).
  • ('generate', 'NN'): ‘generate’ es un sustantivo (NN).
  • ('human', 'JJ'): ‘human’ es un adjetivo (JJ).
  • ('language', 'NN'): ‘language’ es un sustantivo (NN).
  • ('.', '.'): ‘.’ denota un signo de puntuación (punto).
  • ('learn', 'VB'): ‘learn’ es un verbo en forma base (VB).

Aplicar representación de Bolsa de Palabras.

from sklearn.feature_extraction.text import CountVectorizerdef representacion_bolsa_palabras(texto):    # Inicializar CountVectorizer    vectorizador = CountVectorizer()    # Transformar el texto en una representación de Bolsa de Palabras    representacion_bolsa_palabras = vectorizador.fit_transform([texto])    return representacion_bolsa_palabras, vectorizador# Aplicar representación de Bolsa de Palabrasrepresentacion_bolsa_palabras, vectorizador = representacion_bolsa_palabras(texto_preprocesado)print("Representación de Bolsa de Palabras:")print(representacion_bolsa_palabras.toarray())print("Vocabulario:", vectorizador.get_feature_names())

Representación de Bolsa de Palabras:[[1 1 1 1 1 1 1 1 1 1 1]]Vocabulario: ['comprehend', 'enables', 'exciting', 'field', 'generate', 'human', 'interpret', 'language', 'learn', 'machine', 'nlp']

Aplicar representación de TF-IDF.

from sklearn.feature_extraction.text import TfidfVectorizerdef representacion_tfidf(texto):    # Inicializar TfidfVectorizer    vectorizador = TfidfVectorizer()    # Transformar el texto en una representación de TF-IDF    representacion_tfidf = vectorizador.fit_transform([texto])    return representacion_tfidf, vectorizador# Aplicar representación de TF-IDFrepresentacion_tfidf, vectorizador_tfidf = representacion_tfidf(texto_preprocesado)print("\nRepresentación de TF-IDF:")print(representacion_tfidf.toarray())print("Vocabulario:", vectorizador_tfidf.get_feature_names())

Representación de TF-IDF:[[0.30151134 0.30151134 0.30151134 0.30151134 0.30151134 0.30151134  0.30151134 0.30151134 0.30151134 0.30151134 0.30151134]]Vocabulario: ['comprehend', 'enables', 'exciting', 'field', 'generate', 'human', 'interpret', 'language', 'learn', 'machine', 'nlp']

El Procesamiento del Lenguaje Natural (NLP por sus siglas en inglés) es el puente entre el lenguaje humano y las máquinas. En este artículo, hemos descubierto términos fundamentales como ‘corpus’, ‘vocabulario’, y técnicas clave como ‘tokenización’, ‘lematización’ y ‘etiquetado POS’. Estos son los bloques de construcción para aplicaciones avanzadas de NLP, impulsando a la IA hacia interacciones más similares a las humanas.

Gracias por leer🤓. Puedes revisar mi repositorio en GitHub donde puedes revisar un proyecto de NLP en el que apliqué todas las técnicas mencionadas anteriormente y otras más avanzadas. ¡Saludos!