En este tutorial, presentamos una tubería completa de procesamiento de lenguaje natural de extremo a extremo (PNL) construido con Gensim y bibliotecas de soporte, diseñadas para funcionar sin problemas en Google Colab. Integra múltiples técnicas centrales en la PNL moderna, incluido el preprocesamiento, el modelado de temas con asignación latente de Dirichlet (LDA), incrustaciones de palabras con Word2Vec, análisis de similitud basado en TF-IDF y búsqueda semántica. La tubería no solo demuestra cómo capacitar y evaluar estos modelos, sino que también muestra visualizaciones prácticas, análisis de temas avanzados y flujos de trabajo de clasificación de documentos. Al combinar métodos estadísticos con enfoques de aprendizaje automático, el tutorial proporciona un marco integral para comprender y experimentar con datos de texto a escala. Mira el Códigos completos aquí.
!pip install --upgrade scipy==1.11.4
!pip install gensim==4.3.2 nltk wordcloud matplotlib seaborn pandas numpy scikit-learn
!pip install --upgrade setuptools
print("Please restart runtime after installation!")
print("Go to Runtime > Restart runtime, then run the next cell")
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from wordcloud import WordCloud
import warnings
warnings.filterwarnings('ignore')
from gensim import corpora, models, similarities
from gensim.models import Word2Vec, LdaModel, TfidfModel, CoherenceModel
from gensim.parsing.preprocessing import preprocess_string, strip_tags, strip_punctuation, strip_multiple_whitespaces, strip_numeric, remove_stopwords, strip_short
import nltk
nltk.download('punkt', quiet=True)
nltk.download('stopwords', quiet=True)
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
Instalamos y actualizamos las bibliotecas necesarias, como SciPy, Gensim, NLTK y herramientas de visualización, para garantizar la compatibilidad. Luego importamos todos los módulos requeridos para el preprocesamiento, el modelado y el análisis. También descargamos los recursos NLTK para tokenizar y manejar las palabras de parada de manera eficiente, configurando así el entorno para nuestra tubería NLP. Mira el Códigos completos aquí.
class AdvancedGensimPipeline:
def __init__(self):
self.dictionary = None
self.corpus = None
self.lda_model = None
self.word2vec_model = None
self.tfidf_model = None
self.similarity_index = None
self.processed_docs = None
def create_sample_corpus(self):
"""Create a diverse sample corpus for demonstration"""
documents = [ "Data science combines statistics, programming, and domain expertise to extract insights",
"Big data analytics helps organizations make data-driven decisions at scale",
"Cloud computing provides scalable infrastructure for modern applications and services",
"Cybersecurity protects digital systems from threats and unauthorized access attempts",
"Software engineering practices ensure reliable and maintainable code development",
"Database management systems store and organize large amounts of structured information",
"Python programming language is widely used for data analysis and machine learning",
"Statistical modeling helps identify patterns and relationships in complex datasets",
"Cross-validation techniques ensure robust model performance evaluation and selection",
"Recommendation systems suggest relevant items based on user preferences and behavior",
"Text mining extracts valuable insights from unstructured textual data sources",
"Image classification assigns predefined categories to visual content automatically",
"Reinforcement learning trains agents through interaction with dynamic environments"
]
return documents
def preprocess_documents(self, documents):
"""Advanced document preprocessing using Gensim filters"""
print("Preprocessing documents...")
CUSTOM_FILTERS = [
strip_tags, strip_punctuation, strip_multiple_whitespaces,
strip_numeric, remove_stopwords, strip_short, lambda x: x.lower()
]
processed_docs = []
for doc in documents:
processed = preprocess_string(doc, CUSTOM_FILTERS)
stop_words = set(stopwords.words('english'))
processed = [word for word in processed if word not in stop_words and len(word) > 2]
processed_docs.append(processed)
self.processed_docs = processed_docs
print(f"Processed {len(processed_docs)} documents")
return processed_docs
def create_dictionary_and_corpus(self):
"""Create Gensim dictionary and corpus"""
print("Creating dictionary and corpus...")
self.dictionary = corpora.Dictionary(self.processed_docs)
self.dictionary.filter_extremes(no_below=2, no_above=0.8)
self.corpus = [self.dictionary.doc2bow(doc) for doc in self.processed_docs]
print(f"Dictionary size: {len(self.dictionary)}")
print(f"Corpus size: {len(self.corpus)}")
def train_word2vec_model(self):
"""Train Word2Vec model for word embeddings"""
print("Training Word2Vec model...")
self.word2vec_model = Word2Vec(
sentences=self.processed_docs,
vector_size=100,
window=5,
min_count=2,
workers=4,
epochs=50
)
print("Word2Vec model trained successfully")
def analyze_word_similarities(self):
"""Analyze word similarities using Word2Vec"""
print("\n=== Word2Vec Similarity Analysis ===")
test_words = ['machine', 'data', 'learning', 'computer']
for word in test_words:
if word in self.word2vec_model.wv:
similar_words = self.word2vec_model.wv.most_similar(word, topn=3)
print(f"Words similar to '{word}': {similar_words}")
try:
if all(w in self.word2vec_model.wv for w in ['machine', 'computer', 'data']):
analogy = self.word2vec_model.wv.most_similar(
positive=['computer', 'data'],
negative=['machine'],
topn=1
)
print(f"Analogy result: {analogy}")
except:
print("Not enough vocabulary for complex analogies")
def train_lda_model(self, num_topics=5):
"""Train LDA topic model"""
print(f"Training LDA model with {num_topics} topics...")
self.lda_model = LdaModel(
corpus=self.corpus,
id2word=self.dictionary,
num_topics=num_topics,
random_state=42,
passes=10,
alpha="auto",
per_word_topics=True,
eval_every=None
)
print("LDA model trained successfully")
def evaluate_topic_coherence(self):
"""Evaluate topic model coherence"""
print("Evaluating topic coherence...")
coherence_model = CoherenceModel(
model=self.lda_model,
texts=self.processed_docs,
dictionary=self.dictionary,
coherence="c_v"
)
coherence_score = coherence_model.get_coherence()
print(f"Topic Coherence Score: {coherence_score:.4f}")
return coherence_score
def display_topics(self):
"""Display discovered topics"""
print("\n=== Discovered Topics ===")
topics = self.lda_model.print_topics(num_words=8)
for idx, topic in enumerate(topics):
print(f"Topic {idx}: {topic[1]}")
def create_tfidf_model(self):
"""Create TF-IDF model for document similarity"""
print("Creating TF-IDF model...")
self.tfidf_model = TfidfModel(self.corpus)
corpus_tfidf = self.tfidf_model[self.corpus]
self.similarity_index = similarities.MatrixSimilarity(corpus_tfidf)
print("TF-IDF model and similarity index created")
def find_similar_documents(self, query_doc_idx=0):
"""Find documents similar to a query document"""
print(f"\n=== Document Similarity Analysis ===")
query_doc_tfidf = self.tfidf_model[self.corpus[query_doc_idx]]
similarities_scores = self.similarity_index[query_doc_tfidf]
sorted_similarities = sorted(enumerate(similarities_scores), key=lambda x: x[1], reverse=True)
print(f"Documents most similar to document {query_doc_idx}:")
for doc_idx, similarity in sorted_similarities[:5]:
print(f"Doc {doc_idx}: {similarity:.4f}")
def visualize_topics(self):
"""Create visualizations for topic analysis"""
print("Creating topic visualizations...")
doc_topic_matrix = []
for doc_bow in self.corpus:
doc_topics = dict(self.lda_model.get_document_topics(doc_bow, minimum_probability=0))
topic_vec = [doc_topics.get(i, 0) for i in range(self.lda_model.num_topics)]
doc_topic_matrix.append(topic_vec)
doc_topic_df = pd.DataFrame(doc_topic_matrix, columns=[f'Topic_{i}' for i in range(self.lda_model.num_topics)])
plt.figure(figsize=(12, 8))
sns.heatmap(doc_topic_df.T, annot=True, cmap='Blues', fmt=".2f")
plt.title('Document-Topic Distribution Heatmap')
plt.xlabel('Documents')
plt.ylabel('Topics')
plt.tight_layout()
plt.show()
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
axes = axes.flatten()
for topic_id in range(min(6, self.lda_model.num_topics)):
topic_words = dict(self.lda_model.show_topic(topic_id, topn=20))
wordcloud = WordCloud(
width=300, height=200,
background_color="white",
colormap='viridis'
).generate_from_frequencies(topic_words)
axes[topic_id].imshow(wordcloud, interpolation='bilinear')
axes[topic_id].set_title(f'Topic {topic_id}')
axes[topic_id].axis('off')
for i in range(self.lda_model.num_topics, 6):
axes[i].axis('off')
plt.tight_layout()
plt.show()
def advanced_topic_analysis(self):
"""Perform advanced topic analysis"""
print("\n=== Advanced Topic Analysis ===")
topic_distributions = []
for i, doc_bow in enumerate(self.corpus):
doc_topics = self.lda_model.get_document_topics(doc_bow)
dominant_topic = max(doc_topics, key=lambda x: x[1]) if doc_topics else (0, 0)
topic_distributions.append({
'doc_id': i,
'dominant_topic': dominant_topic[0],
'topic_probability': dominant_topic[1]
})
topic_df = pd.DataFrame(topic_distributions)
plt.figure(figsize=(10, 6))
topic_counts = topic_df['dominant_topic'].value_counts().sort_index()
plt.bar(range(len(topic_counts)), topic_counts.values)
plt.xlabel('Topic ID')
plt.ylabel('Number of Documents')
plt.title('Distribution of Dominant Topics Across Documents')
plt.xticks(range(len(topic_counts)), [f'Topic {i}' for i in topic_counts.index])
plt.show()
return topic_df
def document_classification_demo(self, new_document):
"""Classify a new document using trained models"""
print(f"\n=== Document Classification Demo ===")
print(f"Classifying: '{new_document[:50]}...'")
processed_new = preprocess_string(new_document, [
strip_tags, strip_punctuation, strip_multiple_whitespaces,
strip_numeric, remove_stopwords, strip_short, lambda x: x.lower()
])
new_doc_bow = self.dictionary.doc2bow(processed_new)
doc_topics = self.lda_model.get_document_topics(new_doc_bow)
print("Topic probabilities:")
for topic_id, prob in doc_topics:
print(f" Topic {topic_id}: {prob:.4f}")
new_doc_tfidf = self.tfidf_model[new_doc_bow]
similarities_scores = self.similarity_index[new_doc_tfidf]
most_similar = np.argmax(similarities_scores)
print(f"Most similar document: {most_similar} (similarity: {similarities_scores[most_similar]:.4f})")
return doc_topics, most_similar
def run_complete_pipeline(self):
"""Execute the complete NLP pipeline"""
print("=== Advanced Gensim NLP Pipeline ===\n")
raw_documents = self.create_sample_corpus()
self.preprocess_documents(raw_documents)
self.create_dictionary_and_corpus()
self.train_word2vec_model()
self.train_lda_model(num_topics=5)
self.create_tfidf_model()
self.analyze_word_similarities()
coherence_score = self.evaluate_topic_coherence()
self.display_topics()
self.visualize_topics()
topic_df = self.advanced_topic_analysis()
self.find_similar_documents(query_doc_idx=0)
new_doc = "Deep neural networks are powerful machine learning models for pattern recognition"
self.document_classification_demo(new_doc)
return {
'coherence_score': coherence_score,
'topic_distributions': topic_df,
'models': {
'lda': self.lda_model,
'word2vec': self.word2vec_model,
'tfidf': self.tfidf_model
}
}
Definimos la clase AdvancedGensimpipeline como un marco modular para manejar cada etapa del análisis de texto en un solo lugar. Comienza con la creación de un corpus de muestra, el preprocesarlo y luego construir un diccionario y representaciones de corpus. Entrenamos Word2Vec para incrustaciones, LDA para modelado de temas y TF-IDF para similitud, seguido de visualización, evaluación de coherencia y clasificación de nuevos documentos. De esta manera, reunimos el flujo de trabajo NLP completo, desde el texto en bruto hasta las ideas, en una sola tubería reutilizable. Mira el Códigos completos aquí.
def compare_topic_models(pipeline, topic_range=[3, 5, 7, 10]):
print("\n=== Topic Model Comparison ===")
coherence_scores = []
perplexity_scores = []
for num_topics in topic_range:
lda_temp = LdaModel(
corpus=pipeline.corpus,
id2word=pipeline.dictionary,
num_topics=num_topics,
random_state=42,
passes=10,
alpha="auto"
)
coherence_model = CoherenceModel(
model=lda_temp,
texts=pipeline.processed_docs,
dictionary=pipeline.dictionary,
coherence="c_v"
)
coherence = coherence_model.get_coherence()
coherence_scores.append(coherence)
perplexity = lda_temp.log_perplexity(pipeline.corpus)
perplexity_scores.append(perplexity)
print(f"Topics: {num_topics}, Coherence: {coherence:.4f}, Perplexity: {perplexity:.4f}")
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5))
ax1.plot(topic_range, coherence_scores, 'bo-')
ax1.set_xlabel('Number of Topics')
ax1.set_ylabel('Coherence Score')
ax1.set_title('Model Coherence vs Number of Topics')
ax1.grid(True)
ax2.plot(topic_range, perplexity_scores, 'ro-')
ax2.set_xlabel('Number of Topics')
ax2.set_ylabel('Perplexity')
ax2.set_title('Model Perplexity vs Number of Topics')
ax2.grid(True)
plt.tight_layout()
plt.show()
return coherence_scores, perplexity_scores
Esta función compare_topic_models nos permite probar sistemáticamente diferentes números de temas para el modelo LDA y comparar su rendimiento. Calculamos los puntajes de coherencia (para verificar la interpretabilidad del tema) y los puntajes de perplejidad (para verificar el ajuste del modelo) para cada recuento de temas en el rango dado. Los resultados se muestran como gráficos de línea, ayudándonos a decidir visualmente el número más equilibrado de temas para nuestro conjunto de datos. Mira el Códigos completos aquí.
def semantic_search_engine(pipeline, query, top_k=5):
"""Implement semantic search using trained models"""
print(f"\n=== Semantic Search: '{query}' ===")
processed_query = preprocess_string(query, [
strip_tags, strip_punctuation, strip_multiple_whitespaces,
strip_numeric, remove_stopwords, strip_short, lambda x: x.lower()
])
query_bow = pipeline.dictionary.doc2bow(processed_query)
query_tfidf = pipeline.tfidf_model[query_bow]
similarities_scores = pipeline.similarity_index[query_tfidf]
top_indices = np.argsort(similarities_scores)[::-1][:top_k]
print("Top matching documents:")
for i, idx in enumerate(top_indices):
score = similarities_scores[idx]
print(f"{i+1}. Document {idx} (Score: {score:.4f})")
print(f" Content: {' '.join(pipeline.processed_docs[idx][:10])}...")
return top_indices, similarities_scores[top_indices]
La función Semantic_Search_Engine agrega una capa de búsqueda a la tubería tomando una consulta, preprocesándola y convirtiéndola en una bolsa de palabras y representaciones TF-IDF. Luego compara la consulta con todos los documentos utilizando el índice de similitud y devuelve las coincidencias superiores. De esta manera, podemos recuperar rápidamente los documentos más relevantes junto con sus puntajes de similitud, lo que hace que la tubería sea útil para las tareas prácticas de recuperación de información y búsqueda semántica. Mira el Códigos completos aquí.
if __name__ == "__main__":
pipeline = AdvancedGensimPipeline()
results = pipeline.run_complete_pipeline()
print("\n" + "="*60)
coherence_scores, perplexity_scores = compare_topic_models(pipeline)
print("\n" + "="*60)
search_results = semantic_search_engine(
pipeline,
"artificial intelligence neural networks deep learning"
)
print("\n" + "="*60)
print("Pipeline completed successfully!")
print(f"Final coherence score: {results['coherence_score']:.4f}")
print(f"Vocabulary size: {len(pipeline.dictionary)}")
print(f"Word2Vec model size: {pipeline.word2vec_model.wv.vector_size} dimensions")
print("\nModels trained and ready for use!")
print("Access models via: pipeline.lda_model, pipeline.word2vec_model, pipeline.tfidf_model")
Este bloque principal une todo en una tubería completa y ejecutable. Inicializamos el avance AdvancedGenseline, ejecutamos el flujo de trabajo completo y luego evaluamos los modelos de temas con diferentes números de temas. A continuación, probamos el motor de búsqueda semántico con una consulta sobre inteligencia artificial y aprendizaje profundo. Finalmente, imprime métricas resumidas, como la partitura de coherencia, el tamaño del vocabulario y las dimensiones de incrustación de Word2Vec, lo que confirma que todos los modelos están entrenados y listos para su uso posterior.
En conclusión, obtenemos un poder de trabajo potente y modular que cubre todo el espectro del análisis de texto, desde la limpieza y el preprocesamiento de documentos sin procesar hasta descubrir temas ocultos, visualizar resultados, comparar modelos y realizar una búsqueda semántica. La inclusión de incrustaciones de Word2Vec, similitud TF-IDF y evaluación de coherencia asegura que la tubería sea versátil y robusta, mientras que las visualizaciones y las demostraciones de clasificación hacen que los resultados sean interpretables y procesables. Este diseño cohesivo permite a los alumnos, investigadores y profesionales adaptar rápidamente el marco para las aplicaciones del mundo real, lo que lo convierte en una base valiosa para la experimentación avanzada de la PNL y el análisis de texto listo para la producción.
Mira el Códigos completos aquí. No dude en ver nuestro Página de Github para tutoriales, códigos y cuadernos. Además, siéntete libre de seguirnos Gorjeo Y no olvides unirte a nuestro Subreddit de 100k+ ml y suscribirse a Nuestro boletín.
Asif Razzaq es el CEO de MarktechPost Media Inc .. Como empresario e ingeniero visionario, ASIF se compromete a aprovechar el potencial de la inteligencia artificial para el bien social. Su esfuerzo más reciente es el lanzamiento de una plataforma de medios de inteligencia artificial, MarktechPost, que se destaca por su cobertura profunda de noticias de aprendizaje automático y de aprendizaje profundo que es técnicamente sólido y fácilmente comprensible por una audiencia amplia. La plataforma cuenta con más de 2 millones de vistas mensuales, ilustrando su popularidad entre el público.