La búsqueda semántica va más allá de la coincidencia de palabras clave tradicionales al comprender el significado contextual de las consultas de búsqueda. En lugar de simplemente hacer coincidir las palabras exactas, los sistemas de búsqueda semántica capturan la intención y la definición contextual de la consulta y devolver los resultados relevantes incluso cuando no contienen las mismas palabras clave.

En este tutorial, implementaremos un sistema de búsqueda semántica utilizando transformadores de oraciones, una poderosa biblioteca construida sobre los transformadores de Hugging Face que proporciona modelos previamente capacitados específicamente optimizados para generar incrustaciones de oraciones. Estas integridades son representaciones numéricas de texto que capturan el significado semántico, lo que nos permite encontrar contenido similar a través de la similitud vectorial. Crearemos una aplicación práctica: un motor de búsqueda semántico para una colección de resúmenes científicos que pueda responder consultas de investigación con artículos relevantes, incluso cuando la terminología difiere entre la consulta y los documentos relevantes.

Primero, instalemos las bibliotecas necesarias en nuestro cuaderno Colab:

!pip install sentence-transformers faiss-cpu numpy pandas matplotlib datasets

Ahora, importemos las bibliotecas que necesitaremos:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sentence_transformers import SentenceTransformer
import faiss
from typing import List, Dict, Tuple
import time
import re
import torch

Para nuestra demostración, utilizaremos una colección de resúmenes de documentos científicos. Creemos un pequeño conjunto de datos de resúmenes de varios campos:

abstracts = [
    {
        "id": 1,
        "title": "Deep Learning for Natural Language Processing",
        "abstract": "This paper explores recent advances in deep learning models for natural language processing tasks. We review transformer architectures including BERT, GPT, and T5, and analyze their performance on various benchmarks including question answering, sentiment analysis, and text classification."
    },
    {
        "id": 2,
        "title": "Climate Change Impact on Marine Ecosystems",
        "abstract": "Rising ocean temperatures and acidification are severely impacting coral reefs and marine biodiversity. This study presents data collected over a 10-year period, demonstrating accelerated decline in reef ecosystems and proposing conservation strategies to mitigate further damage."
    },
    {
        "id": 3,
        "title": "Advancements in mRNA Vaccine Technology",
        "abstract": "The development of mRNA vaccines represents a breakthrough in immunization technology. This review discusses the mechanism of action, stability improvements, and clinical efficacy of mRNA platforms, with special attention to their rapid deployment during the COVID-19 pandemic."
    },
    {
        "id": 4,
        "title": "Quantum Computing Algorithms for Optimization Problems",
        "abstract": "Quantum computing offers potential speedups for solving complex optimization problems. This paper presents quantum algorithms for combinatorial optimization and compares their theoretical performance with classical methods on problems including traveling salesman and maximum cut."
    },
    {
        "id": 5,
        "title": "Sustainable Urban Planning Frameworks",
        "abstract": "This research proposes frameworks for sustainable urban development that integrate renewable energy systems, efficient public transportation networks, and green infrastructure. Case studies from five cities demonstrate reductions in carbon emissions and improvements in quality of life metrics."
    },
    {
        "id": 6,
        "title": "Neural Networks for Computer Vision",
        "abstract": "Convolutional neural networks have revolutionized computer vision tasks. This paper examines recent architectural innovations including residual connections, attention mechanisms, and vision transformers, evaluating their performance on image classification, object detection, and segmentation benchmarks."
    },
    {
        "id": 7,
        "title": "Blockchain Applications in Supply Chain Management",
        "abstract": "Blockchain technology enables transparent and secure tracking of goods throughout supply chains. This study analyzes implementations across food, pharmaceutical, and retail industries, quantifying improvements in traceability, reduction in counterfeit products, and enhanced consumer trust."
    },
    {
        "id": 8,
        "title": "Genetic Factors in Autoimmune Disorders",
        "abstract": "This research identifies key genetic markers associated with increased susceptibility to autoimmune conditions. Through genome-wide association studies of 15,000 patients, we identified novel variants that influence immune system regulation and may serve as targets for personalized therapeutic approaches."
    },
    {
        "id": 9,
        "title": "Reinforcement Learning for Robotic Control Systems",
        "abstract": "Deep reinforcement learning enables robots to learn complex manipulation tasks through trial and error. This paper presents a framework that combines model-based planning with policy gradient methods to achieve sample-efficient learning of dexterous manipulation skills."
    },
    {
        "id": 10,
        "title": "Microplastic Pollution in Freshwater Systems",
        "abstract": "This study quantifies microplastic contamination across 30 freshwater lakes and rivers, identifying primary sources and transport mechanisms. Results indicate correlation between population density and contamination levels, with implications for water treatment policies and plastic waste management."
    }
]


papers_df = pd.DataFrame(abstracts)
print(f"Dataset loaded with {len(papers_df)} scientific papers")
papers_df[["id", "title"]]

Ahora cargaremos un modelo de transformador de oraciones previamente capacitado de la cara abrazada. Usaremos el modelo All-Minilm-L6-V2, que proporciona un buen equilibrio entre el rendimiento y la velocidad:

model_name="all-MiniLM-L6-v2"
model = SentenceTransformer(model_name)
print(f"Loaded model: {model_name}")

A continuación, convertiremos nuestros resúmenes de texto en incrustaciones de vectores densos:

documents = papers_df['abstract'].tolist()
document_embeddings = model.encode(documents, show_progress_bar=True)


print(f"Generated {len(document_embeddings)} embeddings with dimension {document_embeddings.shape[1]}")

Faiss (Facebook AI Simility Search) es una biblioteca para una búsqueda eficiente de similitud. Lo usaremos para indexar nuestros incrustaciones de documentos:

dimension = document_embeddings.shape[1]  


index = faiss.IndexFlatL2(dimension)
index.add(np.array(document_embeddings).astype('float32'))


print(f"Created FAISS index with {index.ntotal} vectors")

Ahora implementemos una función que toma una consulta, la convierte en una incrustación y recupera los documentos más similares:

def semantic_search(query: str, top_k: int = 3) -> List[Dict]:
    """
    Search for documents similar to query


    Args:
        query: Text to search for
        top_k: Number of results to return


    Returns:
        List of dictionaries containing document info and similarity score
    """
    query_embedding = model.encode([query])


    distances, indices = index.search(np.array(query_embedding).astype('float32'), top_k)


    results = []
    for i, idx in enumerate(indices[0]):
        results.append({
            'id': papers_df.iloc[idx]['id'],
            'title': papers_df.iloc[idx]['title'],
            'abstract': papers_df.iloc[idx]['abstract'],
            'similarity_score': 1 - distances[0][i] / 2  
        })


    return results

Probemos nuestra búsqueda semántica con varias consultas que demuestran su capacidad para comprender el significado más allá de las palabras clave exactas:

test_queries = [
    "How do transformers work in natural language processing?",
    "What are the effects of global warming on ocean life?",
    "Tell me about COVID vaccine development",
    "Latest algorithms in quantum computing",
    "How can cities reduce their carbon footprint?"
]


for query in test_queries:
    print("\n" + "="*80)
    print(f"Query: {query}")
    print("="*80)


    results = semantic_search(query, top_k=3)


    for i, result in enumerate(results):
        print(f"\nResult #{i+1} (Score: {result['similarity_score']:.4f}):")
        print(f"Title: {result['title']}")
        print(f"Abstract snippet: {result['abstract'][:150]}...")

Visualizemos las integridades del documento para ver cómo se agrupan por tema:

from sklearn.decomposition import PCA


pca = PCA(n_components=2)
reduced_embeddings = pca.fit_transform(document_embeddings)


plt.figure(figsize=(12, 8))
plt.scatter(reduced_embeddings[:, 0], reduced_embeddings[:, 1], s=100, alpha=0.7)


for i, (x, y) in enumerate(reduced_embeddings):
    plt.annotate(papers_df.iloc[i]['title'][:20] + "...",
                 (x, y),
                 fontsize=9,
                 alpha=0.8)


plt.title('Document Embeddings Visualization (PCA)')
plt.xlabel('Component 1')
plt.ylabel('Component 2')
plt.grid(True, linestyle="--", alpha=0.7)
plt.tight_layout()
plt.show()

Creemos una interfaz de búsqueda más interactiva:

from IPython.display import display, HTML, clear_output
import ipywidgets as widgets


def run_search(query_text):
    clear_output(wait=True)


    display(HTML(f"<h3>Query: {query_text}</h3>"))


    start_time = time.time()
    results = semantic_search(query_text, top_k=5)
    search_time = time.time() - start_time


    display(HTML(f"<p>Found {len(results)} results in {search_time:.4f} seconds</p>"))


    for i, result in enumerate(results):
        html = f"""
        <div style="margin-bottom: 20px; padding: 15px; border: 1px solid #ddd; border-radius: 5px;">
            <h4>{i+1}. {result['title']} <span style="color: #007bff;">(Score: {result['similarity_score']:.4f})</span></h4>
            <p>{result['abstract']}</p>
        </div>
        """
        display(HTML(html))


search_box = widgets.Text(
    value="",
    placeholder="Type your search query here...",
    description='Search:',
    layout=widgets.Layout(width="70%")
)


search_button = widgets.Button(
    description='Search',
    button_style="primary",
    tooltip='Click to search'
)


def on_button_clicked(b):
    run_search(search_box.value)


search_button.on_click(on_button_clicked)


display(widgets.HBox([search_box, search_button]))

En este tutorial, hemos creado un sistema de búsqueda semántico completo utilizando transformadores de oraciones. Este sistema puede comprender el significado detrás de las consultas de los usuarios y devolver documentos relevantes incluso cuando no hay una coincidencia de palabras clave exacta. Hemos visto cómo la búsqueda basada en la incrustación proporciona resultados más inteligentes que los métodos tradicionales.


Aquí está el Cuaderno de colab. Además, no olvides seguirnos Gorjeo y únete a nuestro Canal de telegrama y LinkedIn GRsalpicar. No olvides unirte a nuestro 85k+ ml de subreddit.


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.

Por automata