Introducción al Procesamiento del Lenguaje Natural

Este notebook explora diversos temas de PNL utilizando la biblioteca NLTK en Python.

Preparación (Lección 2): Introducción a los Chatbots y Asistentes Virtuales

Objetivos:

1. Fundamentos de los Chatbots

Objetivo:

Proporcionar una comprensión básica de los chatbots, su arquitectura y casos de uso.

¿Qué es un Chatbot?

Arquitectura de un Chatbot:

2. Introducción al Procesamiento del Lenguaje Natural (NLP)

Objetivo:

Entender los conceptos básicos del NLP y cómo se aplican en el desarrollo de chatbots.

Fundamentos del NLP:

Introducción al NLP

El Procesamiento del Lenguaje Natural (NLP) es una rama de la inteligencia artificial que permite a las máquinas entender, interpretar y generar lenguaje humano.

Tokenización de Palabras

La tokenización de palabras es el proceso de dividir un texto en palabras individuales.


import nltk
from nltk.tokenize import word_tokenize

nltk.download('punkt_tab')
nltk.download('punkt')
texto = "Hola, ¿cómo estás? Espero que estés bien."
tokens = word_tokenize(texto)
print(tokens)
  

Tokenización de Frases

La tokenización de frases es el proceso de dividir un texto en frases individuales.


from nltk.tokenize import sent_tokenize

texto = "Hola, ¿cómo estás? Espero que estés bien. Nos vemos luego."
frases = sent_tokenize(texto)
print(frases)
  

Eliminación de Stop Words

Las stop words son palabras comunes que se eliminan del texto para mejorar el análisis.


import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize

nltk.download('punkt_tab')
nltk.download('punkt')
nltk.download('stopwords')

texto = "El procesamiento de lenguaje natural es todo un mundo y útil en muchas aplicaciones."
stop_words = set(stopwords.words('spanish'))
palabras = word_tokenize(texto)

palabras_filtradas = [palabra for palabra in palabras if palabra.lower() not in stop_words]
print(palabras_filtradas)
  

TF-IDF

TF-IDF (Term Frequency-Inverse Document Frequency) es una técnica para calcular la importancia de una palabra en un documento en relación con una colección de documentos.


from sklearn.feature_extraction.text import TfidfVectorizer

documentos = [
    "El procesamiento de lenguaje natural es todo un mundo.",
    "El lenguaje natural permite la comunicación entre humanos y máquinas.",
    "Las técnicas de NLP mejoran la comprensión del texto."
]

vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(documentos)

print(tfidf_matrix.toarray())
print(vectorizer.get_feature_names_out())
  

Word2Vec

Word2Vec es una técnica para aprender representaciones vectoriales de palabras (word embeddings).


from gensim.models import Word2Vec

sentences = [["el", "procesamiento", "de", "lenguaje", "natural", "es", "todo", "un", "mundo"],
              ["el", "lenguaje", "natural", "permite", "la", "comunicación", "entre", "humanos", "y", "máquinas"]]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)
vector = model.wv['lenguaje']
print(vector)
                

N-grams

Los N-grams son secuencias de N palabras consecutivas en un texto.


import nltk
from nltk.util import ngrams
from collections import Counter

nltk.download('punkt_tab')
nltk.download('punkt')

texto = "El procesamiento de lenguaje natural es fascinante y útil en muchas aplicaciones."
tokens = nltk.word_tokenize(texto)

bigrams = list(ngrams(tokens, 2))
bigram_freq = Counter(bigrams)

print(bigrams)
print(bigram_freq)
                

Reconocimiento de Entidades Nombradas (NER)

NER es la tarea de identificar y clasificar entidades nombradas en un texto, como personas, organizaciones, ubicaciones, etc.


import spacy

nlp = spacy.load("es_core_news_sm")

texto = "Apple lanzó el nuevo iPhone en California el 13 de octubre"
doc = nlp(texto)

for entidad in doc.ents:
    print(entidad.text, entidad.label_)
                

Análisis de Sentimientos

El análisis de sentimientos es la tarea de determinar la polaridad emocional de un texto (positivo, negativo o neutral).


from transformers import pipeline

clasificador = pipeline("sentiment-analysis")

texto = "te odio mucho"
resultado = clasificador(texto)
print(resultado)
                

Stemming

Stemming es el proceso de reducir una palabra a su raíz o stem.


import nltk
from nltk.stem import SnowballStemmer

stemmer = SnowballStemmer("spanish")
palabras = ["corriendo", "jugando", "vida", "correis", "ostias", "jodido","mandado"]
stems = [stemmer.stem(palabra) for palabra in palabras]
print(stems)
                

Lematización

La lematización es el proceso de reducir una palabra a su forma base o lema.


import nltk
from nltk.stem import WordNetLemmatizer
from nltk.corpus import wordnet

nltk.download('wordnet')
lemmatizer = WordNetLemmatizer()
palabras = ["running", "played", "better", "dogs"]
lemmas = [lemmatizer.lemmatize(palabra, pos=wordnet.VERB) for palabra in palabras]
print(lemmas)
                

Análisis Sintáctico

El análisis sintáctico es el proceso de analizar la estructura gramatical de una oración.


import spacy

nlp = spacy.load("es_core_news_sm")
texto = "El gato negro corre rápidamente por el jardín."
doc = nlp(texto)

for token in doc:
    print(f"Palabra: {token.text}, Etiqueta gramatical: {token.pos_}, Dependencia: {token.dep_}")
                

Similitud Semántica

La similitud semántica es una medida de la relación entre dos palabras o frases en función de su significado.


import spacy

nlp = spacy.load("es_core_news_md")
palabra1 = nlp("suba pa arriba las escaleras")
palabra2 = nlp("spacy es un modelo de lenguaje natural")
print(f"Similitud entre {palabra1} y {palabra2}': {palabra1.similarity(palabra2)}")