Python Advanced Series

4. Búsqueda Semántica con Embeddings

4. Semantic Search with Embeddings

Cruza descripciones de ofertas de empleo con CVs buscando por significado y no por coincidencia exacta de palabras.

Match job descriptions with resumes by meaning, not only by exact keyword matching.

⚠️ Advertencia de ciberseguridad, datos y producción ⚠️ Cybersecurity, data, and production warning

Este ejercicio es solo para aprendizaje y pruebas. No ejecutes modelos contra CVs reales, datos personales, información laboral sensible o ambientes de producción sin autorización, respaldo, anonimización cuando aplique, permisos mínimos, control de cambios, revisión humana y cumplimiento de las políticas de privacidad de tu organización.

This exercise is for learning and testing only. Do not run models against real resumes, personal data, sensitive employment information, or production environments without authorization, backups, anonymization when applicable, least-privilege permissions, change control, human review, and compliance with your organization's privacy policies.

Objetivo del ejercicio

Exercise objective

Usar embeddings para convertir textos en vectores numéricos y comparar similitud semántica. Esto permite encontrar el CV más relacionado con una oferta de empleo aunque no use exactamente las mismas palabras.

Use embeddings to convert text into numeric vectors and compare semantic similarity. This helps find the resume most related to a job posting even when the exact same words are not used.

Datos sintéticos

Synthetic data

IDTipoTexto
JOB01OfertaTrabajo remoto desde casa con análisis de datos y reportes.
CV01CVExperiencia creando dashboards, reportes y análisis de datos.
CV02CVAtención al cliente presencial y manejo de caja registradora.
CV03CVSoporte administrativo remoto, Excel y documentación.

Ejemplo base

Base example

from sentence_transformers import SentenceTransformer

model = SentenceTransformer('all-MiniLM-L6-v2')
vector = model.encode("Trabajo remoto desde casa")

Instalación necesaria

Required installation

Ejecuta esto una sola vez si la librería no está instalada en tu ambiente local o notebook.

Run this once if the library is not installed in your local environment or notebook.

pip install sentence-transformers scikit-learn pandas

Script completo

Complete script

# ==========================================================
# Python Advanced Topic 04
# Semantic Search with Embeddings
# ==========================================================

import pandas as pd
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity

# 1. Job description to match
job_description = "Trabajo remoto desde casa con análisis de datos y reportes."

# 2. Synthetic resume descriptions
resumes = [
    {"cv_id": "CV01", "candidate": "Ana Perez", "text": "Experiencia creando dashboards, reportes y análisis de datos."},
    {"cv_id": "CV02", "candidate": "John Smith", "text": "Atención al cliente presencial y manejo de caja registradora."},
    {"cv_id": "CV03", "candidate": "Maria Lopez", "text": "Soporte administrativo remoto, Excel y documentación."},
    {"cv_id": "CV04", "candidate": "Robert Diaz", "text": "Mantenimiento de equipos, inventario y soporte operativo."}
]

df = pd.DataFrame(resumes)

# 3. Load embedding model
model = SentenceTransformer("all-MiniLM-L6-v2")

# 4. Convert texts into vectors
job_vector = model.encode([job_description])
resume_vectors = model.encode(df["text"].tolist())

# 5. Compare semantic similarity
similarities = cosine_similarity(job_vector, resume_vectors)[0]

df["semantic_score"] = similarities.round(4)

# 6. Sort best matches first
ranking = df.sort_values("semantic_score", ascending=False)

# 7. Export report
output_file = "semantic_search_resume_matches.csv"
ranking.to_csv(output_file, index=False)

print("Job description:")
print(job_description)
print("
Best semantic matches:")
print(ranking[["cv_id", "candidate", "semantic_score", "text"]])
print(f"
Report created: {output_file}")

Salida esperada en consola

Expected console output

Job description:
Trabajo remoto desde casa con análisis de datos y reportes.

Best semantic matches:
  cv_id    candidate  semantic_score                                               text
0  CV01    Ana Perez          0.7421  Experiencia creando dashboards, reportes y análisis de datos.
2  CV03  Maria Lopez          0.5814  Soporte administrativo remoto, Excel y documentación.
3  CV04  Robert Diaz          0.2638  Mantenimiento de equipos, inventario y soporte operativo.
1  CV02   John Smith          0.1846  Atención al cliente presencial y manejo de caja registradora.

Report created: semantic_search_resume_matches.csv

Reporte CSV generado

Generated CSV report

CV IDCandidatoSemantic ScoreInterpretación
CV01Ana Perez0.7421Mejor coincidencia semántica
CV03Maria Lopez0.5814Coincidencia parcial por remoto/administrativo
CV04Robert Diaz0.2638Baja relación
CV02John Smith0.1846Muy baja relación

Aplicaciones reales

Real-world applications

  • Relacionar CVs con ofertas de empleo.
  • Buscar documentos por significado, no solo por palabras exactas.
  • Clasificar descripciones largas por similitud.
  • Crear buscadores internos más inteligentes.
  • Match resumes with job postings.
  • Search documents by meaning, not only exact words.
  • Classify long descriptions by similarity.
  • Create smarter internal search tools.

Recomendaciones

Recommendations

  • No tomar el score como decisión final automática.
  • Revisar sesgos y calidad de los textos originales.
  • Anonimizar datos personales cuando sea necesario.
  • Usar revisión humana en procesos de empleo o selección.
  • Do not treat the score as an automatic final decision.
  • Review bias and quality in the original text.
  • Anonymize personal data when needed.
  • Use human review in employment or selection processes.

Valor del tópico

Topic value

Este patrón abre la puerta a búsquedas inteligentes en texto. En vez de depender de palabras exactas, el modelo entiende cercanía de significado, lo que es muy útil para empleo, documentos, tickets, comentarios, encuestas y repositorios de conocimiento.

This pattern opens the door to intelligent text search. Instead of depending on exact words, the model understands similarity of meaning, which is useful for jobs, documents, tickets, comments, surveys, and knowledge repositories.